TIL 22

qkrrlcks00·2024년 9월 12일


오디오를 각씬마다 지정해주려고
using UnityEngine.SceneManagement;
int sceneIndex = SceneManager.GetActiveScene().buildIndex;
를 이용해 각 씬의 인덱스 번호를 확인후

StartScene == 0 나머지 게임씬들은 >1이니까

public void Start()
{
audioSource = GetComponent<AudioSource>();
int sceneIndex = SceneManager.GetActiveScene().buildIndex;
Debug.Log(sceneIndex);
if (SceneName == 0)
{
    audioSource.clip = this.BackGorundMusic;
    Debug.Log("if");
}
else
{
    audioSource.clip = this.GamePlaySound;
    Debug.Log("else");
}
audioSource.Stop();
audioSource.Play();
}

처음엔 이렇게 작성했는데 작동이 안돼서
디버그.로그를 추가해서 어디가 작동안하는지를 봤더니
SceneIdx까지는 무사작동하니 if else문에서 문제가 발생한것이였다.
그래서 알고보니 함수 스타트에서는 한번 실행이 되면 끝이고,
씬을 넘어가도 실행이 다시되는줄 알앗는데 그게 아니였다
다시 실행되게 하려면 파괴시켯다가 다시 로드하는 로직을 구현해야한다고 한다.

그래서 일단 public void ChangeBGM() 이라는 함수를 만들고
그 안에 저 코드들을 넣어준 후 함수를 스타트에서 작동시켰는데도
작동을 안했는데, 그 이유는 이 코드가 작동되는 시간은 매우 짧은데, 씬을 이동하는데는 코드가 작동되는시간보다 훨씬 느려서 이 함수가 SceneIndex를 받아와야하는데 속도가 느려서 받을수가 없엇던 것이다.
그래서 쩔수없이 해당씬으로 넘어가는 버튼에 인스턴스화시킨 오디오매니저를 불러와 함수를 넣어줫다
그리고 매개변수를 추가했다

그리고 스타트구문은 한번만 작동된다고 한다. 씬을 옮겨도 한번 작동했으면 작동하지 않는다. 작동하게 하려면 파괴햇다가 다시 로드해야한다고 한다.

AudioManager.Instance.ChangeBGM(0);public void Main()
{
    SceneManager.LoadScene(0);
    AudioManager.Instance.ChangeBGM(0);

}

LoadScene도 원래는 string처리되어 "eazyScene"이었는데 이것도 바꾸는게 좋다고 해서 바꿧다. 이렇게 바꾸니 무사히 알맞게 소리가 나왔다.

PlayerPrefs.DeleteAll(); //저장데이터 초기화

그런데 팀원이 작성한 코드중에 업데이트구문에 오디오를 쓰는 코드가 있었는데
위에 할때 업데이트에 넣었었는데 프레임마다 노래가 켜져서 귀가 나갈뻔했는데 어떻게 작동되는건지 물어봤다.

if (isHurry == false && time_Tmp <= 10f) 
{
    isHurry = true;        

    AudioManager.Instance.audioSource.clip = AudioManager.Instance.HurryUpMusic;
    AudioManager.Instance.audioSource.Stop();
    AudioManager.Instance.audioSource.Play();

if부분에 원하던 코드에 원하던값과 bool값을 넣고
원하던 부분이 true가 되는순간 if문이 작동하게 되고, if문 안에 넣어놓은 bool값이
반대값이 되면서 if문은 한번만 작동되기때문에 작동할수 있었다.

0개의 댓글