[TIL] 48일차 - 팀 프로젝트 마무리

김유원·2024년 3월 4일
1

📝 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에 대하여 초기화와 선언을 제공하는 베이스 스크립트이다. 이번 프로젝트뿐만 아니라 여러 프로젝트에서 유용하게 쓰일 수 있는 싱글톤 베이스이기 때문에 필수적으로 숙지하려고 한다.

이번 프로젝트를 하면서 제네릭과 이벤트, 상속 등 필수적으로 사용되는 여러 개념을 활용할 수 있었어서 매우 큰 가르침이 되었다.

profile
개발 공부 블로그

0개의 댓글

관련 채용 정보