안 쓰던 블로그

Prefab으로 생성한 Button 오브젝트를 클릭할 때마다 효과음 재생하기 본문

유니티/개발

Prefab으로 생성한 Button 오브젝트를 클릭할 때마다 효과음 재생하기

proqk 2021. 8. 4. 21:58
반응형

원하는 것:

 

Prefab으로 만든 Button 오브젝트가 클릭될 때마다 딸깍하는 효과음을 재생한다.

 

실패:

    public void OnClickbox5()
    {
        clicksound.PlayOneShot(clicksound.clip);
        gm5.putAnswerText(me);
    }

처음에 짰던 코드의 모습

Button이 눌릴 때마다 OnClickbox5() 가 실행되고, OnClickbox5 함수는 GameManager의 함수를 호출한다.

 

버튼이 눌린다 -> 효과음을 재생한다 -> 특정 행동을 시작한다

 

라는 의식의 흐름을 가지고 위와 같은 코드를 작성했다.

하지만 이렇게 하면 에러는 안 나지만 소리가 나지 않는다.

 

AudioClip도 잘 들어가 있고, 스크립트에도 문제가 없는데 소리가 재생되지 않아서 좀 헤맸다.

 

해결:

결론부터 말하면 OnClick() 이벤트가 아닌, GameManager같은 다른 스크립트에 AudioClip을 추가하고 Audio를 재생하면 소리가 잘 출력되었다.

 

코드는 바뀌지 않았고 단지 위치만 바뀌었을 뿐인데 소리가 나오지 않기도 하고 나오기도 한다.

나름대로 원인을 생각했는데, Prefab이기 때문인 듯 했다.

 

Prefab은 '재사용 가능한 게임 오브젝트'이다.

나는 Prefab을 '비슷한 동작을 하는 게임 오브젝트가 여러 개 필요할 때' 사용한다고 생각했다.

그래서 버튼을 누른다->효과음을 출력한다 라는 동일한 동작을 수행하는 이 경우는 프리팹의 역할 범위라고 생각해서, 프리팹에다가 Audio Source를 달고 Play() 를 시켰다.

 

이전 글(https://foxtrotin.tistory.com/509)이나 다른 이전 글(https://foxtrotin.tistory.com/510) 또는 (https://foxtrotin.tistory.com/512)를 지나며 느꼈는데 Prefab은 내가 생각한 역할보다 더 적은 범위만 커버할 수 있는 것 같다.

다시말해 Prefab은 빈 껍데기만 있는 게임 오브젝트를 만들기 혹은 아주 간단한 동작(예: 총알이 앞으로 이동)만 커버하고, 나머지 행동에 대해서는 GameManager 등의 다른 스크립트가 오버라이딩이나 추가하는 식으로 사용하는 느낌이 아닐까 싶다.

Prefab가 생성되면 같은 게임 오브젝트이기는 하지만, 뭔가 행동을 하길 바라며 이것저것 추가하기에는 제약이 너무 많다.

또한 유니티 내부적으로 처리되는 계산이 복잡한 건지, 오브젝트 생성 순서나 계산 실행 순서 등에서 개발자가 의도한 것과 다른 동작을 할 때가 종종 발생한다. (내가 초보 개발자라서 그럴 수도 있지만..)

 

아무튼 결론: Prefab 잘 알고 사용하자!

반응형
Comments