1. Component
Unity 엔진에서 사용하는 부품, Monobehavior 를 상속 받는 코드 ( Object -> component -> Monobehavior)
상속을 받아야 유니티가 GameObject 로 인식, Component 의 기능 ( start, update 등 ) 을 사용할 수 있다.
2. Manager
- 게임에서 항상 존재하며 전체적인 정보를 관리할 수 있는 오브젝트가 필요, 여러개가 뜨면 정보가 혼란스러울 수 있으니 한개의 인스턴스만 존재해야함 -> 싱글톤 패턴의 필요성
- Monobehavior 는 new 로 새로 할당받아 오브젝트를 생성할 수 없음 object를 상속받은 유니티 객체이기 때문에 new 불가
- 일반적인 C# 코드로 설계하면 monobehavior 를 제거해야 하지만 컴포넌트로 사용하기 어려움 -> 초기화를 할 수 없음
- 게임오브젝트로 생성 -> @Manager 스크립트 생성 후 해당 오브젝트에 스크립트로 붙여서 불러옴 (@ 는 컨벤션)
- @Manager 에서는 Init 함수를 이용하여 싱글톤 패턴 사용, 하나의 인스턴스만 가지도록 함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Managers : MonoBehaviour
{
static Managers s_instance;
public static Managers Instance { get { Init(); return s_instance;} }
// Start is called before the first frame update
void Start()
{
Init();
}
// Update is called once per frame
void Update()
{
}
static void Init()
{
if (s_instance == null)
{
GameObject go = GameObject.Find("@Managers");
if (go == null)
{
go = new GameObject { name = "@Managers"};
go.AddComponent<Managers>();
}
DontDestroyOnLoad(go);
s_instance = go.GetComponent<Managers>();
}
}
}
Managers 라는 s_instance 오브젝트 선언, 호출 시 Init 함수로 진입, 존재한다면 존재하는 인스턴스 리턴, 없다면 생성하여 리턴
따라서 s_instance 는 한개의 인스턴스만 존재할 수 있음
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Managers mg = Managers.Instance;
}
// Update is called once per frame
void Update()
{
}
}
다른 Script 에서 매니저 인스턴스를 불러올 때는 단순히 Managers.Instance 를 사용하여 호출