나 개발자 진짜 되냐?

[ Unity 3D 서바이벌 게임 만들기 11 ] 사운드 및 뮤직 존 생성 본문

유니티를 공부해봐요!/중급이에요!

[ Unity 3D 서바이벌 게임 만들기 11 ] 사운드 및 뮤직 존 생성

Snow Rabbit 2024. 11. 3. 00:21

진짜 마지막으로 

사운드

 

함께 보시죠!

 


 

스크립트를 만들어보자

 

Palyer에 FootSteps을 만들자!

 

만들고 Player 오브젝트에 와서

 

두개 추가!

 

< FootSteps.cs >

using UnityEngine;

public class FootSteps : MonoBehaviour
{
    public AudioClip[] footstepClips; //오디오 소리를 모아두는 클립
    private AudioSource audioSource; // 오디오소스컴포넌트
    private Rigidbody _rigidbody; // 발자국이니 중력
    public float footstepThreshold; // rigidbody가 쓰이는지 아닌지 받아오는 값
    public float footstepRate; // 간격
    private float footStepTime; // 시간받아서

    private void Start()
    {
        _rigidbody = GetComponent<Rigidbody>(); // 컴포넌트 캐싱
        audioSource = GetComponent<AudioSource>(); 
    }

    private void Update()
    {
        if (Mathf.Abs(_rigidbody.velocity.y) < 0.1f) // 절대값 찾기 = 땅에 붙어있다.
        {
            if (_rigidbody.velocity.magnitude > footstepThreshold) // 벡터3의 변화량의 크기값 > 미리 설정 값
            {
                if (Time.time - footStepTime > footstepRate) // 시간을 재준다.
                {
                    footStepTime = Time.time; //시간을 현재시간으로
                    audioSource.PlayOneShot(footstepClips[Random.Range(0, footstepClips.Length)]); // 오디오 실행
                    // OneShot을 각각의 리소스들이 끊기지 않고 이어지게끔 [ 랜덤값 추출, 길이만큼]
                }
            }
        }
    }
}

 

변수 선언

 

Start에서는 일단 get 해주고

 

Update에서 값을 움직이도록 설정한다.

 

 

다음에

유니티로 돌아와서

 

스크립트에 값 쓰고

 

여기 클립에

오디오를 넣어주어야 하는데

검색에다가 grass 하면

다섯 개가 나온다.

플레이어 오면

인스펙터창 오른쪽에 자물쇠 있는데 그 부분을 잠가주고

시작하자!

( 움직이지 않게 )

 

다음에 블록 씌워서 한꺼번에 넣기!

 

넣을 때 여기 칸에 넣지 말고

Clips 여기 글씨에 넣으면 잘 들어가진다.

 

 

자 다음은

음악이 흘러나올 곳 스크립트도 짜보자

 

만들고

빈오브젝트도 하나 만들어서

 

설정!

 

 

자, 코드 작성해 보자

 

< MusicZone.cs >

 

using UnityEngine;

public class MusicZone : MonoBehaviour
{
    public AudioSource audioSource; //오디오 소스
    public float fadeTime; 
    public float maxVolume;
    private float targetVolume;

    private void Start()
    {
        targetVolume = 0.0f; // 일단 볼륨 0
        audioSource = GetComponent<AudioSource>();
        audioSource.volume = targetVolume; //그리고 일단 0으로 맞추고
        audioSource.Play(); // 노래를 재생시켜놓는다.

    }

    private void Update()
    {   // Approximately는 소수점 연산에서 아주 미세하게 다룰 수 있는 친구
        if (!Mathf.Approximately(audioSource.volume, targetVolume)) //근사값이 아닐때
        {   // 그때그때 오디오 소스의 볼륨값과 타겟볼륨값이 바뀔때마다 if문의 실행여부 결정
            audioSource.volume = Mathf.MoveTowards(audioSource.volume, targetVolume, (maxVolume / fadeTime) * Time.deltaTime);
            //MoveTowards 는 점진적으로 증가!
        }
    }

    private void OnTriggerEnter(Collider other) //아까 트리거 채크한거!
    {
        if (other.CompareTag("Player")) // 플레이어가 들어오면
            targetVolume = maxVolume; // 최대 볼륨으로!
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player")) //나간게 플레이어면
            targetVolume = 0.0f; // 소리 끄기
    }
}

 

변수

 

일단

 

처음부터 음악을 계속 켜둔다

단지 소리 볼륨을 끌뿐..

 

근삿값이 아니면

실행되며

 

여기서 fadeTime이 만약에 2초라면

2만큼 점진적으로 커지면 너무 커질 수 있다.

그래서 max를 나눠서 천천히

점진적으로 올라갈 수 있게 해 준다.

 

그리고

지금은 소리가 꺼져있으니

사람이 오면 다시 키도록 만든다.

 

사람이 오면..?

Trigger!!

 

 

 

자 이제 유니티로 가서

 

해주면

노래가 들렸다가 작아졌다가 루룰랄라 된다.

 

호옥시 안된다!

 

palyer 태그를 다시 보자

나는 player가 아니어서 계속 소리가 안 들렸었다..!!

 

이렇게 

멀미 왕의

3D게임

- 완 -