모름

싱글턴 패턴을 대표적으로 많이 쓰는것이라 다들 기본적인 이해는 있으실겁니다. 전역변수에 올려놓고 어디서든 접근가능한 객체로 만드는 패턴입니다. 다들 익숙하신 내용이니 최대한 간단하게 설명하고 넘어가겠습니다.

 

장점

 

싱글턴을 활용하면 한 씬에 있는 오브젝트들이 싱글턴 객체에 접근하여 데이터를 쉽게 공유할수 있습니다. 더 나아가 씬이 바뀌어도 데이터를 유지하며 공유를 계속할수 있습니다. (이 경우엔 유니티의 DontDestroyOnLoad 메소드를 사용해야합니다)

 

 

 

 

단점

 

싱글턴을 사용하게 되면 많은 오브젝트들과 연결되어 관리가 복잡해질수 있습니다. 예를 들어 다양한 곳에서 호출하게 되니 싱글턴 객체의 데이터가 언제 어느시점에 바뀌는지 파악하기가 어려울수도 있습니다.

 

 

 

 

언제 사용할까 - 사용 전

 

using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class DisableSoundGenerator : MonoBehaviour
{
    public AudioClip sound;

    private AudioSource audioSource;

    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    private void OnDisable()
    {
        audioSource.clip = sound;
        audioSource.Play();
    }
}

 

총알이 발사되고 나서 사라질때 사운드를 재생시키는 스크립트를 만들었습니다. 총알이 땅바닥에 떨어진 후 사라지기 직전 (OnDisable(유니티 라이프사이클 참고))에 총알에 함께있는 AudioSource 콤포넌트를 통해 사운드를 재생해야합니다. 하지만...

 

 

 

오류가 납니다. 왜냐하면 오브젝트가 사라져서 사운드를 재생시킬 AudioSource 콤포넌트가 없어졌기 때문입니다. 이럴때 싱클턴 패턴을 활용한 오디오 매니저를 활용할 수 있습니다. 

 

 

 

 

언제 사용할까 - 사용 후

 

 

오디오 매니저를 생성했습니다. 

 

using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class AudioManager : MonoBehaviour
{
    public static AudioManager Instance;

    private AudioSource audioSource;

    private void Awake()
    {
        Instance = this;
        audioSource = GetComponent<AudioSource>();
    }

    public void PlaySound(AudioClip clip)
    {
    	Debug.Log("<color=yellow>Sound Play!!</color> : " + clip.name);
        audioSource.PlayOneShot(clip);
    }
}

 

스태틱으로 Instance 라는 이름의 전역변수를 넣어서 자기 자신을 전역변수에 넣어주었습니다. 여기서 예방문을 추가하거나 씬이 전환될때 사라지지 않도록 하는 돈디스트로이 함수를 추가로 작성해줄수 있습니다. 그리고 이 오디오 매니저를 총알이 사라질때 불러주도록 하겠습니다.

 

using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class DisableSoundGenerator : MonoBehaviour
{
    public AudioClip sound;

    private AudioSource audioSource;

    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    private void OnDisable()
    {
        AudioManager.Instance.PlaySound(sound);
    }
}

 

결과는 오디오매니저의 사운드재생 함수를 불렀으므로 오디오매니저의 디버그 로그가 호출되어야 할것입니다. 그럼 사운드가 정상 출력된 것입니다.

 

 

 

총알이 사라졌음에도 소리가 재생되었습니다. 이렇게 오브젝트 혹은 어떠한 기능을 관리해주거나 할 때 용이한게 싱글턴 패턴입니다.

 

한 줄 정리 : 신중하게 전역변수에 올려놓고 어디서든 접근가능한 객체로 만드는 패턴