Ch 14. 음악 교체 (+ Ignore Raycast Graphics, Script Execution Order)
카테고리: Unity Lesson 4
태그: Unity Game Engine
케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
🚀 Script Execution Order
Project Settings - Script Execution Order 을 통해 스크립트의 실행 순서를 제어할 수 있다.
여기저기 스크립트들의 Start() 에서 음악을 교체하거나 재생하기 위하여 싱글톤인 📜AudioManager 를 캐싱하려고 할 것이다. (물론 캐싱하지 않고 바로 AudioManager.instance 로 접근할 수도 있겠지만) 근데 만약 📜AudioManager 보다 해당 스크립트가 먼저 실행된다면 런타임 에러가 발생할 것이다. 📜AudioManager 에서 instance = this;
해주는 과정을 같은 Start가 아닌 Awake 에서 해주면 해결 될 것 같기도 하지만 강의자 분께서 새로운 방법을 알려주셨다. Project Settings 의 Script Execution Order 에서 스크립트 실행 우선순위를 설정할 수 있다.
대충 우선순위를 -50으로.. 이로써 다른 스크립트들보다 📜AudioManager가 가장 먼저 실행될 것이다.
🚀 Ignore Raycast Graphics
Ignore Raycast Graphics
가 체크 되어 있다면 UI 가 뒤집히면 Raycast 를 받지 못한다.
왼쪽 화살표 이미지 버튼의 사본을 만들어 Y 축으로 180도 회전시켜 오른쪽 화살표 이미지 버튼을 만들었댜. 그러나 버튼 이벤트도 잘 연결되잇는데도 불구하고 버튼 이벤트가 작동하지 않는 것이였다!!! 😥😥 혹시 Y축으로 180도 회전시켜서 뒤집혀진 모습이 되었기 때문에 못 받는건 아니겠지? 했는데 진짜길래 당황..
캔버스의 Graphic Raycaster 에서 Ignore Raycast Graphics
가 체크되어 있기 때문에 발생했던 문제였다. 이게 체크되어 있으면 이 캔버스의 산하 UI들은 만약 뒤집혀있으면 (그래서 표면이 뒤로가버리면) Raycast를 받지 못한다. 즉, 이벤트가 발동하지 못하는 것이다. 이걸 체크 해제 하면 뒤집어져있는 UI도 무리없이 Raycast를 받을 수 있게 된다.
🚀 코드
📜GameManager
NoteManager theNote;
[SerializeField] CenterFlame theMusic = null; // 처음에 비활성화 되있어서 Find로 찾을 수 없음
public void GameStart(int p_songNum, int p_bpm)
{
for(int i = 0; i < goGameUI.Length; i++)
{
goGameUI[i].SetActive(true);
}
theMusic.bpmName = "BGM" + p_songNum;
theNote.bpm = p_bpm;
- 📜CenterFlame 은 에디터에서 할당해주는 이유는
CenterFlame
은 시작시 비활성화 되어 있는데, 비활성화 상태에선 FindObjectOfType 함수로 찾을 수 없기 때문이다.- FindObjectOfType는 활성화 되어 있는 오브젝트들에서만 검색해준다.
- 음악마다
bpm
도 다 다름
📜CenterFlame
private void OnTriggerEnter2D(Collider2D collision)
{
if (!musicStart)
{
if (collision.CompareTag("Note"))
{
AudioManager.instance.PlayBGM(bpmName);
musicStart = true;
}
}
}
게임 시작하고 첫 노트 때 BGM 재생
📜StageMenu
public void BtnNext() // -> 버튼 이벤트
{
AudioManager.instance.PlaySFX("Touch");
if (++currentSong > songList.Length - 1)
currentSong = 0;
SettingSong();
}
public void BtnPrev() // <- 버튼 이벤트
{
AudioManager.instance.PlaySFX("Touch");
if (--currentSong < 0)
currentSong = songList.Length - 1;
SettingSong();
}
void SettingSong()
{
txtSongName.text = songList[currentSong].name;
txtSongComposer.text = songList[currentSong].composer;
imgDisk.sprite = songList[currentSong].sprite;
AudioManager.instance.PlayBGM("BGM" + currentSong);
}
스테이지 메뉴에서 왼오 화살표 버튼으로 음악들 넘길 때 BGM 들어볼 수 있음
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기