

유니티 정신차려!
게임을 제작하다 보면 배경 음악을 추가해야된다. 그렇다면 배경 음악이 시작 되는 씬에서 겹치게 되는 경우가 있는데 이를 해결하는 방법을 알아보자.
일단 기본적으로 씬을 넘어간다면 오브젝트들이 다 바뀐다는것을 안다. 배경음악을 안끊기게 하려면 어떻게 해야되는지 다들 알것이다.
바로 DontDestroyObject() 라는 메소드를 사용하면 되는데. 이 메소드를 사용하게 되면 씬을 이동 시켜도 삭제가 되지 않는 오브젝트가 되는데. 이것을 사용하려면 엄청난 고민을 해야된다.
왜냐 바로 사용하게 되면 생각치도 못한 버그들이 날아오를 것이다.
네? 생각치도 못한 버그요?
1. 일단 최적화가 문제
2. 만약 씬을 왔다갔다 한다면 생각치 못한 버그들이 생김
3. 관리하기가 힘듦
이런 단점들이 생긴다. 그렇기에 무조건 사용할 매니저 오브젝트나, 자주 사용하게 되는 배경음악이 들어간 오브젝트들이 파괴 되지 않도록 지정한다.
Q. 그렇다면 파괴되지 않도록 나둔 오브젝트는 절대 파괴 안되나요?
A. 아니요.. 씬 이동시에만 파괴 안되고 쉽게 파괴 됩니다.
그렇다.. 말만 Dont Destroy이지 사실.. Destroy메소드 하나면 사실 파괴된다.. 일단 씬을 왔다 갔다하면 계속 파괴되지 않는 오브젝트가 생성이되어 누적이 될텐데 그렇다면 생각치 못한 에러들을 볼 수가 있다. 그렇다면 관리가 쉽게 되어야 된다는 이야긴데 그러기 위해 Destroy 메소드 하나로 파괴가 된다 할 수 있다.
자 이제 본격적으로 끊기지 않으면서 겹쳐지지 않는 배경음악 제작을 해보자. 그러기 위해 이제 순차적으로 만들 코드를 생각해보자
- 일단 파괴가 안되야됨
- 그리고 2개 이상이 되면 하나는 파괴되야됨
이런식으로 한번 생각해보자. 그렇다면 의사 코드도 한번에 제작이 가능하다
void Start(){
if(같은 오브젝트 두개?){
현재 오브젝트 삭제
}
현재 오브젝트 파괴 안되게 한다.
}
이런식으로 제작한다면 이제 간단하게 제작이 가능하게 된다. 일단 나의 코드는 이런식으로 제작이 된다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MusicManager : MonoBehaviour
{
private List<MusicManager> objs;
private void Awake()
{
if (objs.Count > 1)
{
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
}
}
진짜진짜 너무 간단하게 나오는 코드다.. 괜히 생각을 어렵게 하다간 이런 코드보다 더 긴 코드가 나오게 되는데, 더이상 말은 안하겠다..

이제 저걸 사용하게 된다면, 씬을 이동해도 동일하게 나오는 오브젝트가 있어도 누적되지 않고 하나만 남게 되는데 이걸 이용하게 된다면, 여러 오브젝트를 넣어도 겹치는 문제는 해결 된다!