객체를 생성하기 위한 로직을 별도의 팩토리 클래스나 메서드로 분리해서 객체 생성의 책임을 팩토리가 가지게 하고 생성 방식을 팩토리에서 유연하게 정의할 수 있는 디자인 패턴이다.
현재 프로젝트에서 Enemy클래스는 Behaviour Tree와 Blackboard로 AI로직이 구성된다.
public Enemy : Monobehaviour
{
BehaviourTree tree;
void Update() => tree.Process();
private void SetupAI()
{
tree = new();
//...Create Nodes
}
}
각각의 몬스터마다 해당 클래스를 상속받아 사용할 수도 있겠지만 상속 구조가 깊어질수록 가독성이 떨어지고 바뀌는 로직이 많지 않음에도 AI 로직이 바뀔 때마다 Enemy를 상속받아 사용해야한다.
팩토리 패턴과 ScriptableObject로 구조를 바꿔보자.
public Enemy : Monobehaviour
{
[SerializeField] BehaviourFactory treeFactory;
BehaviourTree tree;
void Start()
{
tree = treeFactory.Create(this);
}
}
public abstract class BehaviourTreeFactory : ScriptableObject
{
public abstract BehaviourTree Create<T>(T enemy) where T : Enemy;
}
추상 클래스를 상속받아 SO를 구현하고 Enemy의 treeFactory에 인스펙터를 통해 주입함으로써 AI 행동 로직의 생성방식과 Enemy클래스 간의 결합을 해소할 수 있다.
훌륭하다.하산해라.