2026-06-11 사운드시스템 (BaseScene참고)
This commit is contained in:
38
Assets/02_Scripts/Sound/LineAmbienceAudio.cs
Normal file
38
Assets/02_Scripts/Sound/LineAmbienceAudio.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user