본문 바로가기
유니티5 독학 & 게임 제작

유니티5 독학하기 그 82번째 걸음-종료 사운드 이후에 종료하기의 구현

by 인터넷떠돌이 2018. 9. 5.
반응형

안녕하세요?


원래는 종료버튼에 다른 버튼의 효과음과 같은 버튼소리를 붙이는 것이 싫어서, 다른 종류의 종료된다는 효과음을 붙인 다음에, 이 효과음이 끝나고 나서 게임이 종료가 되도록 만들었습니다. 원래를 간단한 조작이 될 것이라고 생각을 해서 가볍게 시작을 했습니다만, 의외로 일이 많아져서 상당히 힘들어 졌습니다. 이를 보아서 간단한 기능하나 추가하는 것이 상당히 어려운 일이라는 것을 알 수 있었습니다.



먼저 SoundBible에서 위 스크린샷과 같은 효과음을 다운로드 받도록 합니다.



이미 있었던 종료버튼에 위 스크린샷처럼 AudioSource에 다운로드 받은 사운드를 집어 넣도록 합니다.



이제 이 종료버튼의 효과음이 작동할 수 있도록 로직을 짜는 단계에 왔습니다.



일단 종료버튼에서 GetComponent를 사용해서 오디오 소스를 가지고 오도록 위 스크린샷과 같이 설정을 했습니다. 하지만 어째서 인지 제대로 작동을 하지 않았습니다.



알고봤더니 이렇게 일정시간 동안 기다리기를 해야 할 경우에는 코루틴(Coruoutine)이라는 것을 사용해야 한다고 합니다. 실제로 생각해 보니, 이렇게 실시간으로 기다리는 것은 한개의 프레임안에서 끝나는 것이 아니라 여러개의 프레임에 걸쳐서 해내야 하는 작업인데, 이런 작업을 하기 위해서는 실제로 코루틴이 필요한 것 이었습니다.



그런데 무슨 이유에서 인지 에러가 유니티5에서 떴습니다.




알고보니 return이라고 해서 반환하는 값이 null이라도 있어야 하는 것 이었습니다. 이게 없어서 생기는 에러였기 때문에, 위 스크린샷처럼 yield return null; 을 추가해 주고서야 에러가 없어졌습니다.



하지만 이번에는 어떻게 된 것인지 audiosource가 diabled되어 있어서 재생할 수 없다고 떴습니다.



인터넷을 찾아보니, 이론적으로는 위 스크린샷처럼 이렇게 오디오 소스를 일일히 광역변수 같은 것으로 첫머리에 선언을 해 주어야 작동을 한다고 합니다. 그래서 위 스크린샷처럼 일단 선언을 해 주도록 합니다.



그리고 위 스크린샷처럼 GetComponent구문을 주석처리해서 사용하지 않는 것으로 만들어 주도록 합니다.



그리고 유니티5로 돌아와서 계층뷰에서 위 스크린샷처럼 GameManager를 선택하도록 합니다.



여기다가 메인메뉴에서 뜨는 종료버튼을 가져다 놓도록 합니다.




그런데 문제는 게임오버 뷰에서는 사운드가 재생되지 않는 문제 점이 발생한 것 이었습니다.



일단 yield return new WaitForSecondsRealtime(); 이라는 구문을 추가하는 것으로 실시간으로 4초간 기다리라는 명령을 주도록 하고, 기존의 yield return null;은 주석 처리를 했습니다. 그러고도 결과는 나아지지 않았습니다.



그래서 하는 수 없이 게임오버 뷰에 있는 종료버튼의 사운드 소스를 exitSound2로 지정을 하도록 했습니다.



그리고 여기다가 게임오버 뷰의 종료버튼 게임 오브젝트를 지정해 놓도록 합니다.



그리고 나서 위 스크린샷처럼 if문을 지정했지만 소용이 없었습니다.



마지막으로 currentGameState가 menu일 때는 메뉴 캔버스에 있는 종료버튼의 AudioSource가 작동이 되도록 하고, 게임오버 상태가 되면 게임오버 뷰에 있는 종료버튼의 AudioSource가 작동이 되도록 설정을 했습니다.



위 동영상처럼 완성을 하는데 성공했습니다. 지금까지 작동이 안된 근본적인 이유가, currentGameState에 따라서 메인메뉴에 있는 종료 버튼이 비활성화 되는데, 이 버튼에 달려 있는 AudioSource를 재생하라고 명령을 내렸으니, 당연 실행이 되지 않았는 것 입니다. 즉, AudioSource를 실행시킬때는 될 수 있으면, 재생명령을 내리는 시점에서 그 AudioSource 컴포넌트가 붙어 있는 게임 오브젝트가 활성화가 되어 있는 것을 염두해 보아야 겠습니다.

반응형