싱글톤 디자인 패턴은 유니티상에서 다른 스크립트에 접근을 해야할 때 번거로움을 줄여주어

편하게 해주는 용도로 사용하는 디자인 패턴입니다.

 

단 싱글톤을 적용할 스크립트는 씬 내에서 하나밖에 존재하지 않다는 가정하에 사용해야 합니다.

 

예로 게임 내에서 돈을 관리하는 스크립트는 MoneyManager 스크립트 하나 뿐일 것이므로

MoneyManager에 싱글톤 디자인 패턴을 사용하여 스크립트에 접근하기 쉽고 간편하게 하는 것 입니다.

 

빠르게 코드 먼저 훑고 가겠습니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SingleTon<T> : MonoBehaviour
{
    private static T _instance;

    public static T instance
    {
        get
        {
            return _instance;
        }
    }
    protected virtual void Awake()
    {
        _instance = this.GetComponent<T>();
    }
}

 

싱글톤 스크립트는 이렇게 짭니다.

 

T.instance 로 접근하게 됩니다.

 

에제 보겠습니다

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CometManager : SingleTon<CometManager>
{
    public Transform waypoint;
    [HideInInspector] public Transform[] waypoints;

    public ObjectPooling comets;

    private void Start()
    {
        waypoints = waypoint.GetComponentsInChildren<Transform>();
        comets = GetComponent<ObjectPooling>();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            StartCoroutine(SpawnComet(10, 10));
        }
    }

    public IEnumerator SpawnComet(int cometCount, float _maxHealth)
    {
        yield return null;

        for (int i = 0; i < cometCount; i++)
        {
            Comet newComet = comets.Pooling().transform.GetComponent<Comet>();
            newComet.maxHealth = _maxHealth;
            newComet.gameObject.SetActive(true);

            yield return new WaitForSeconds(1);
        }
    }
}

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Comet : MonoBehaviour
{
    public float maxHealth;
    private float currentHealth;

    private int currentIndex;

    private void OnEnable()
    {
        currentIndex = 0;
        currentHealth = maxHealth;
        transform.position = CometManager.instance.waypoint.position;
        StartCoroutine(MoveToWayPoint());
    }

    private void OnDisable()
    {
        StopAllCoroutines();
    }

    private IEnumerator MoveToWayPoint()
    {
        while (true)
        {
            yield return null;

            transform.position = Vector3.MoveTowards(transform.position, CometManager.instance.waypoints[currentIndex].position, 2.0f * Time.deltaTime);

            if(transform.position == CometManager.instance.waypoints[currentIndex].position)
            {
                if(currentIndex >= 3)
                {
                    currentIndex = 0;
                }
                else
                {
                    currentIndex++;
                }
            }
        }
    }

    public void GetDamage(float _damage)
    {
        if(currentHealth - _damage > 0)
        {
            currentHealth -= _damage;
        }
        else
        {
            gameObject.SetActive(false);
        }
    }
}

 

 

 

씬 내에서 단 하나밖에 존재하지 않는 CometManager 스크립트를 생성 후 싱글톤을 사용하여

접근이 용이하게 만들었습니다.

 

Comet 스크립트 상에서 CometManager 스크립트에 접근할 때 CometManager.instance 이 코드 하나만으로

CometManager 스크립트에 접근하였습니다.

 

 

혹 이해가 되지 않거나 다른 궁금한 점이 있으시다면 댓글 남겨주시면 최대한 빠른 시일 내에 답변 드리겠습니다.

 

감사합니다.

+ Recent posts