39 lines
1.7 KiB
C#
39 lines
1.7 KiB
C#
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);
|
|
}
|
|
}
|