1 minute read

Generic

오늘은 제네릭(Generic)에 대해 학습했습니다. 제네릭은 다양한 형태나 클래스를 사용하여 해당 클래스나 메서드를 일반화하는 방법입니다.

기본 개념

  • 제네릭 타입 매개변수: <T>로 표현하며, 다양한 타입을 일반화된 방식으로 사용할 수 있습니다.
  • 형태 제약 조건: where T를 사용하여 제네릭 타입에 특정 제약을 줄 수 있습니다.
    • 예시:
      • where T : class: 참조 타입만 허용.
      • where T : new(): 매개변수 없는 생성자가 있는 타입만 허용.
      • where T : struct: 값 타입만 허용.
      • where T : SomeClass: 특정 클래스를 상속한 타입만 허용.
      • where T : SomeInterface: 특정 인터페이스를 구현한 타입만 허용.

예시

  • 클래스 제약 조건:
    public class MyClass<T> where T : SomeBaseClass
    {
        public T Instance { get; set; }
    }
    
  • 생성자 제약 조건:
    public class MyClass<T> where T : new()
    {
        public T CreateInstance()
        {
            return new T();
        }
    }
    
  • 유니티에서의 활용:
    public T LoadResource<T>(string path) where T : UnityEngine.Object
    {
        return Resources.Load<T>(path);
    }
    

dynamic 키워드

  • 런타임 타입: dynamic 키워드를 사용하면 런타임에 타입의 성질을 적용할 수 있습니다.
    dynamic dyn = "Hello, World!";
    Console.WriteLine(dyn.Length); // 런타임에 타입이 결정됨
    

Behaviour Tree

다음으로, Behaviour Tree(행동 트리)에 대해 간략히 살펴보겠습니다.

개념

  • Behaviour Tree: 주로 게임 AI에서 사용되는 모델로, 계층적 노드 구조를 사용하여 복잡한 행동을 관리합니다. 트리의 각 노드는 행동(액션), 조건, 제어 노드(셀렉터, 시퀀스) 등을 포함할 수 있습니다.

주요 구성 요소

  1. Action 노드: 특정 행동을 수행합니다.
  2. Condition 노드: 조건을 평가하여 트리의 진행 여부를 결정합니다.
  3. Composite 노드: 여러 하위 노드를 포함하며, 셀렉터(Selector)와 시퀀스(Sequence)가 일반적입니다.
  4. Decorator 노드: 하나의 하위 노드를 포함하며, 행동의 조건을 제어하거나 반복 등을 수행합니다.

예시 구조

[Selector]
    ├── [Sequence]
    │    ├── [Condition: IsHungry]
    │    └── [Action: FindFood]
    └── [Sequence]
         ├── [Condition: IsEnemyNearby]
         └── [Action: AttackEnemy]

유니티에서의 활용

유니티에서 Behaviour Tree를 구현하려면, 각 노드에 해당하는 클래스를 정의하고 트리 구조를 구성하는 스크립트를 작성합니다. 다양한 오픈 소스 라이브러리나 유니티 에셋 스토어에서 제공하는 Behaviour Tree 솔루션을 활용할 수도 있습니다.


이번 학습을 통해 제네릭과 Behaviour Tree의 기본 개념과 활용 방법을 이해할 수 있었습니다. 이를 바탕으로 더 효율적이고 확장성 있는 코드를 작성할 수 있을 것으로 기대됩니다.