아래는 간단하게 구현해본 컴포넌트 패턴이다, gameObject라는 매개체 즉 자기 자신을 통해 해당 오브젝트가 존재하는지 확인 및 추가 기능.
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
public class GameObject
{
// 컴포넌트 리스트
public List<Type> lstComp = new List<Type>();
public T GetComponent<T>() where T : Component
{
// 리스트가 해당 오브젝트를 가지고 있을 시
if (lstComp.Contains(typeof(T)))
{
Type type = lstComp[lstComp.IndexOf(typeof(T))];
T comp = null;
if (type == typeof(AComponent))
comp = new AComponent() as T;
else if (type == typeof(BComponent))
comp = new BComponent() as T;
return comp;
}
return null;
}
// 해당 컴포넌트를 T로 받아 추가
public void AddComponent<T>() where T : Component
{
Console.WriteLine("Added");
lstComp.Add(typeof(T));
}
}
public class Monobehaviour
{
public GameObject gameObject = new GameObject();
}
public class Component
{
public virtual void Print()
{
}
}
public class AComponent : Component
{
public override void Print()
{
Console.WriteLine("AComponent");
}
}
public class BComponent : Component
{
public override void Print()
{
Console.WriteLine("BComponent");
}
}
public class Test : Monobehaviour
{
void Run()
{
// AComponent는 추가를 안했으므로 null
AComponent AComp = gameObject.GetComponent<AComponent>();
if (AComp != null)
AComp.Print();
// BComponent 추가 후 출력
gameObject.AddComponent<BComponent>();
BComponent BComp = gameObject.GetComponent<BComponent>();
if (BComp != null)
BComp.Print();
}
static void Main()
{
// 테스트
Test test = new Test();
test.Run();
}
}
}
'게임엔진 > Unity' 카테고리의 다른 글
[Unity] 프리팹 (Prefab) (0) | 2022.08.18 |
---|---|
[Unity] EventSystem을 이용해 아이템UI 드래그 및 다른 슬롯에 등록하기(IDragHandler, IDropHandler) (0) | 2022.08.16 |
[Unity] / [SerializeField] [HideInInspector] [Serializable] 어트리뷰트 인스펙터 공개/비공개 (0) | 2022.08.13 |
[Unity] Debug 클래스 (에디터 출력용) (0) | 2022.08.08 |
[Unity] 스크립트 파일 (0) | 2022.08.07 |