[Unity3D] 특정 상황에서 사운드가 발생하게 만들기



음악 & 사운드는 게임에서 빼먹을 수 없는 중요한 요소 중 하나이다. 사운드를 적절하게 사용하기 위해서 최소한 AudioSource와 AudioClip 정도만 알아도 사용할 수 있다.
AudioSource는 AudioClip을 재생시키기 위한 컴포넌트며, 라디오로 따지면 라디오의 본체라고 할 수 있고, AudioClip은 라디오에 넣는 CD, 즉 음원 파일이다.

따라서 방법을 먼저 짧게 설명하자면, 오브젝트에 AudioSource를 붙이고, 이 AudioSource에 AudioClip을 넣어서 원하는 타이밍에 재생시키면 된다. 아래의 과정을 따라해보자.


1. 원하는 오브젝트에 AudioSource를 부착해준다. (하단의 Add Component -> Audio Source를 검색해서 찾아준다.)



2. Audio Source에 있는 Audio Clip이 음악을 넣는 곳이다. 쉽게 생각한다면 Audio Source라는 라디오에 Audio Clip이라는 CD를 넣는 것이라 볼 수 있겠다. 본인이 넣고 싶은 음악을 넣자.


3. Audio Source의 속성으로 음악을 원하는 타이밍에 원하는 소리로 나오게 할 수 있다. 가령 Play On Awake는 시작할 때 무조건 한 번 음악이 발생하고, Loop는 음악이 무한 반복 될 것이다. 다른 속성들도 직접 사용해보면서 어떤 기능을 하는지 확인해보자. (사실 필자도 다 사용해보지 않아서 무슨 기능인지 다 모른다.)

Play On Awake를 체크하면 게임이 시작할 때나, 해당 오브젝트가 생성될 때 음악이 한번 실행되는데, 효과음 등은 원하는 타이밍만 나오게 하고 싶을 것이다. 따라서 특정 행동을 하게 될 때 코드로 사운드를 실행할 수 있게 만들어보자.


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StepCollision : MonoBehaviour
{
    private Stage s;
    private Sprite StepOff, StepOn;

//
    AudioSource audioSource;
    public AudioClip StepOnSound;
    private void Awake()
    {
        StepOff = gameObject.GetComponent<SpriteRenderer>().sprite;
        StepOn = Resources.Load<Sprite>(gameObject.tag);

        audioSource = this.gameObject.GetComponent<AudioSource>();
    }


    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (this.gameObject.tag.Contains(collision.gameObject.tag))
        {
            s = GameObject.FindWithTag("accepted").GetComponent<Stage>();
            collision.GetComponent<CollisionManager>().isStepOn = true;
            this.audioSource.Play();
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOn;
            s.currStepCnt++;
        }
        else if(gameObject.tag.Contains("left") && collision.gameObject.tag.Contains("left"))
        {
            this.audioSource.Play();
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOn;
        }
        else if (gameObject.tag.Contains("right") && collision.gameObject.tag.Contains("right"))
        {
            this.audioSource.Play();
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOn;
        }
        else if (gameObject.tag.Contains("up") && collision.gameObject.tag.Contains("up"))
        {
            this.audioSource.Play();
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOn;
        }
        else if (gameObject.tag.Contains("down") && collision.gameObject.tag.Contains("down"))
        {
            this.audioSource.Play();
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOn;
        }

    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (this.gameObject.tag.Contains(collision.gameObject.tag))
        {
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOff;
            s = GameObject.FindWithTag("accepted").GetComponent<Stage>();
            collision.GetComponent<CollisionManager>().isStepOn = false;
            s.currStepCnt--;
        }
        else if ((gameObject.tag.Contains("down") && collision.gameObject.tag.Contains("down")) ||
            (gameObject.tag.Contains("up") && collision.gameObject.tag.Contains("up")) ||
            (gameObject.tag.Contains("left") && collision.gameObject.tag.Contains("left")) ||
            (gameObject.tag.Contains("right") && collision.gameObject.tag.Contains("right")))
        {
            this.gameObject.GetComponent<SpriteRenderer>().sprite = StepOff;
        }
    }
}

AudioSource audioSource를 선언해주자. public으로 선언해서 Inspector창에 직접 끌어다놔도 되고, Start() 함수나 Awake() 함수에서 현재 부착된 AudioSource로 선언해줘도 된다. 편한대로 하자.

이 오디오를 실행시킬 수 있는 코드는 AudioSource.Play() 다. 이 때 Play on Awake에 체크를 해놨다면 이미 실행 된 것이니 소리가 원하는 타이밍에 나오는 것이 아니게 되므로 Play On Awake 체크를 해제해주자. 또한 Loop를 사용하게 될 경우 효과음처럼 한번 발생하는 것이 아니라 계속 소리가 나게 될 것이다. 계속 반복해야 하는 배경 음악 같은 경우 체크를 해줘야 겠지만 효과음엔 적절치 않다. 역시 체크 해제 해주자.

이제 원하는 액션을 취하면 소리가 잘 나오는 것을 확인할 수 있을 것이다.

댓글

댓글 쓰기