Unity 숙련주차 - Survival 게임 발걸음 소리와 뮤직 존 생성

Amberjack·2024년 2월 5일
0

Unity

목록 보기
34/44

발걸음 소리 만들기

Player에게 AudioSource 컴포넌트를 추가해준다.

그 다음엔 Footsteps.cs를 만들어주고 Player에게 추가해준다.

Footsteps.cs

using UnityEngine;

public class Footsteps : MonoBehaviour
{
    public AudioClip[] footstepClips;
    private AudioSource audioSource;
    // 현재 Player는 Rigidbody를 활용하여 움직이기 때문에
    // 효과음 재생을 하기 위해서 Rigidbody가 필요.
    private Rigidbody _rigidbody;
    public float footstepThreshold;
    public float footstepRate;
    private float lastFootstepTime;

    private void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
        audioSource = GetComponent<AudioSource>();
    }

    private void Update()
    {
        // Player가 공중에 있는 동안은 발소리가 재생되지 않도록
        if(Mathf.Abs(_rigidbody.velocity.y) < 0.1f)
        {
            if(_rigidbody.velocity.magnitude > footstepThreshold)
            {
                if(Time.time - lastFootstepTime > footstepRate)
                {
                    lastFootstepTime = Time.time;
                    audioSource.PlayOneShot(footstepClips[Random.Range(0, footstepClips.Length)]);
                }
            }
        }
    }
}

마지막으로 Unity로 돌아와서 Footsteps.cs에 데이터들을 넣어주면 된다.

뮤직존 만들기

빈 오브젝트를 만들어 MusicZone이라 이름을 변경해주고, Audio Source 컴포넌트를 달아 사용할 음원을 Audio Clip에 넣어준다.
배경음악이기 때문에 Loop를 켜준다. 또한 Player가 해당 뮤직존에 진입했을 때 Audio를 틀어줄 것이기 때문에 Play On Awake를 꺼준다.

MusicZone.cs

뮤직존의 충돌 처리를 위한 MusicZone.cs를 만들어 주고 MusicZone에게 붙여준다. 또한 충돌 처리를 위한 Box Collider를 추가해주고, Is Trigger를 켜준다.

Box Collider의 크기를 변경하여, NPC가 있는 섬에 입장했을 때 뮤직존을 입장한 것처럼 만들어주자.

using UnityEngine;

public class MusicZone : MonoBehaviour
{
    public AudioSource audioSource;
    public float fadeTime;
    public float maxVolume;
    private float targetVolume;

    private void Start()
    {
        targetVolume = 0.0f;
        audioSource = GetComponent<AudioSource>();
        audioSource.volume = targetVolume;
        audioSource.Play();
    }

    private void Update()
    {
        // Player의 위치에 따라 볼륨의 크기가 변경된다.
        if(!Mathf.Approximately(audioSource.volume, targetVolume))
        {
            audioSource.volume = Mathf.MoveTowards(audioSource.volume, targetVolume, (maxVolume / fadeTime) * Time.deltaTime);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        // other.CompareTag("Player") : 태그로 Object 비교 시 CompareTag를 사용하는 것이 성능면으로 좋다.
        if (other.CompareTag("Player")) targetVolume = maxVolume;
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player")) targetVolume = 0.0f;
    }
}

마지막으로 MusicZone의 데이터들을 넣어주자.

0개의 댓글