싱글톤 디자인 패턴은 유니티상에서 다른 스크립트에 접근을 해야할 때 번거로움을 줄여주어
편하게 해주는 용도로 사용하는 디자인 패턴입니다.
단 싱글톤을 적용할 스크립트는 씬 내에서 하나밖에 존재하지 않다는 가정하에 사용해야 합니다.
예로 게임 내에서 돈을 관리하는 스크립트는 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 스크립트에 접근하였습니다.
혹 이해가 되지 않거나 다른 궁금한 점이 있으시다면 댓글 남겨주시면 최대한 빠른 시일 내에 답변 드리겠습니다.
감사합니다.
'Design Pattern' 카테고리의 다른 글
유니티 다중 오브젝트 풀링 코드 (Unity Multiple Object Pooling) (3) | 2021.07.03 |
---|---|
유니티 오브젝트 풀링 - 예제 및 코드 (Unity Object Pooling Design Pattern) (0) | 2021.06.29 |