다른 컴포넌트를 받아오려면 어떻게 해야할까?
public class Player : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GameObject go = GameObject.Find("@Managers"); // @Managers 오브젝트의
Managers mo = go.GetComponent<Managers>(); // Managers 스크립트를 받아와 달라
}
이걸 매번해야할까? 자주사용되는 부분이라면??
Singleton을 사용해보자
// Managers를 Singleton 선언
public class Managers : MonoBehaviour
{
static Managers Instance; // 유일성 보장
static Managers GetInstances() { return Instance; }
void Start()
{
Instance = this;
}
하지만 이 방법도
그림과 같이 gameobject를 여러개 생성해 버릴시 그에 따라 Script도 여러개가 만들어지기에 Singleton이라 할 수 없다
public class Managers : MonoBehaviour
{
static Managers Instance; // 유일성 보장
static Managers GetInstances() { return Instance; }
void Start()
{
// 여러 Gameobject중 하나의 Gameobject만 사용한다
GameObject go = GameObject.Find("@Managers");
Instance = go.GetComponent<Managers>();
}
// 사용은 이렇게
Managers ms = Managers.GetInstances();
그런데 @Managers
가 없는 상황이라면?(실수로 삭제 한다든지)
public class Managers : MonoBehaviour
{
static Managers Instance;
static Managers GetInstances() { Init(); return Instance; }
void Start()
{
Init();
}
static void Init()
{
if(Instance == null)
{
GameObject go = GameObject.Find("@Managers");
if(go == null)
{
go = new GameObject{name = "@Managers"};
go.AddComponent<Managers>();
}
DontDestroyOnLoad(go); // 절대 삭제하지말아 달라는 의미 이후에 설명
Instance = go.GetComponent<Managers>();
}
}
추가적 수정
public class Managers : MonoBehaviour
{
static Managers s_instance;
public static Managers Instance { get { Init(); return s_instance; } }
// 사용은 이렇게
Managers ms = Managers.Instance;