📝 24.03.04
최종 프로젝트 전 마지막 팀 프로젝트를 완성했다.
프로젝트는 생각보다 빠르게 진행되어 무사히 완성할 수 있었다. 내가 담당한 부분들은 사운드, 그리고 이상 현상 오브젝트들이었다.
이 중 사운드 매니저를 내가 짠 부분에서 팀원분이 약간 수정했는데 정말 많이 배웠어서 기록해두겠다.
SoundManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundManager : SingletoneBase<SoundManager>
{
public AudioSource bgmPlayer;
public AudioSource sfxPlayer;
private void Awake()
{
isDontDestroy = true;
}
private void OnEnable()
{
bgmPlayer = ResourceManager.Instance.Instantiate("SoundPlayer/BGMPlayer",transform).GetComponent<AudioSource>();
sfxPlayer = ResourceManager.Instance.Instantiate("SoundPlayer/SFXPlayer", transform).GetComponent<AudioSource>();
}
public void PlayBGM(AudioClip _clip)
{
bgmPlayer.clip = _clip;
bgmPlayer.Play();
}
public void StopBGM()
{
bgmPlayer.Stop();
}
public void PlaySFX(AudioClip _clip)
{
sfxPlayer.PlayOneShot(_clip);
}
}
코드 구현부는 대부분 특별할 것이 없다. 하지만 SingletoneBase<SoundManager>
을 상속 받고 있다는 점을 주목해야한다.
그렇다면 SingletonBase<SoundManager>
스크립트가 어떤 구조인지 알아야 한다.
SingletoneBase.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingletoneBase<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;
protected bool isDontDestroy;
//Property
public static T Instance
{
get
{
if(_instance == null)
{
_instance = FindObjectOfType(typeof(T)) as T;
if (_instance == null)
{
//Create Object
string typeName = typeof(T).Name;
GameObject obj = new GameObject(typeName);
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
public virtual void Init()
{
if(Instance != null && Instance != this)
{
Destroy(gameObject);
Debug.Log(transform.name + " is Destroy");
}
else
{
_instance = this as T;
if (isDontDestroy)
{
DontDestroyOnLoad(gameObject);
}
Debug.Log(transform.name + " is Init");
}
}
}
싱글톤화 된 모든 스크립트들(대부분 Manager 스크립트)이 모두 상속하는 베이스 스크립트이다.
제네릭으로 선언하여 모든 instance
에 대하여 초기화와 선언을 제공하는 베이스 스크립트이다. 이번 프로젝트뿐만 아니라 여러 프로젝트에서 유용하게 쓰일 수 있는 싱글톤 베이스이기 때문에 필수적으로 숙지하려고 한다.
이번 프로젝트를 하면서 제네릭과 이벤트, 상속 등 필수적으로 사용되는 여러 개념을 활용할 수 있었어서 매우 큰 가르침이 되었다.