using Unity.Mathematics; using UnityEngine; using UnityEngine.Splines; //스플라인 선을 따라 깔리는 환경음(파도 등) //소스 하나가 플레이어와 "스플라인 위에서 가장 가까운 지점"을 추적해 //어떤 모양의 해안선이든 방향성 + 거리감쇠를 처리한다. (닫힌 섬 형태 포함) [RequireComponent(typeof(AudioSource))] public class LineAmbienceAudio : MonoBehaviour { [Header("스플라인")] [SerializeField] private SplineContainer _spline; //환경음이 깔릴 선 (해안선 등) [Header("추적 대상")] [SerializeField] private Transform _listener; //플레이어 (보통 메인 카메라). 비우면 자동으로 Camera.main 사용 private void LateUpdate() { Transform listener = _listener != null ? _listener : (Camera.main != null ? Camera.main.transform : null); if (listener == null || _spline == null) return; //리스너 위치를 스플라인 로컬 공간으로 변환 (컨테이너의 Transform 반영) float3 localListener = _spline.transform.InverseTransformPoint(listener.position); //스플라인 곡선 위에서 가장 가까운 지점을 구함 (Knot 사이 곡선까지 정확) SplineUtility.GetNearestPoint(_spline.Spline, localListener, out float3 localNearest, out _); //다시 월드 공간으로 변환해서 소스를 그 지점으로 이동 transform.position = _spline.transform.TransformPoint(localNearest); } //에디터에서 현재 소스가 추적중인 지점을 표시 (스플라인 자체는 SplineContainer가 그려줌) private void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Gizmos.DrawSphere(transform.position, 0.5f); } }