Project Name : 그 세상에서 살아남는 법 (How To Survive In That World)
Genre : Survive / Post Apocalypse
Introduction : 바이르서로 인해 모든것이 무너진 세상에서 살아가는 생존게임
Platform Plan : Mobile (Android & IOS)
Development Environment
Stat.cs : 기본적인 베이스 스탯(최상위 부모 클래스)
Attribute.cs : Stat의 파생 클래스로 CurValue/MaxValue와 같은 HP, EXP타입을 위한 클래스
Primary.cs : 스탯 포인트, 스킬 포인트, (Strength/Agility)와 같은 타입을 위한 클래스
StatController.cs : 위 스탯들을 저장하고 반환 관리하기 위한 컨트롤러
StatModifier.cs : 스탯들에 계산을 보다 효율적으로 관리하기 위한 스탯 수정자 (Operator Type)과 같은 것을 지정
StatDefinitionSO
StatTableSO
상속 구조 설계를 활용해서 위와 같은 시스템을 구축했습니다.
확장성과 재사용성을 매우 고려하고 안정성(Dictionary Key 값을 Enum 타입으로 사용 등)을 고려했습니다.
StatDefinitionSO에서 개발자는 시각화된 에디터를 활용하여 쉽게 스탯을 구성할 수 있습니다.
Stat : 기본이 되는 스탯 시스템 (베이스 밸류, StatDefinitionSO 기반)
Attribute : Stat을 상속 받는 파생 클래스 - Hp, Exp와 같은 CurValue/MaxValue가 존재하는 속성을 위함
Priamry : Stat을 상속 받는 파생 클래스 - Stat Point, Primary Stat(Strength, Agility) 같은 주 스탯을 위함
Stat Controller
Stat Modifier
StatDefinitionSO
StatTableSO
싱글톤을 확장성 있게 사용하기 위해서 루트(부모) 클래스로 만들었습니다.
현재 싱글톤은 비동기 작업에 영향을 받지 않기 위해 lock으로 다중 접근을 막은 상태이지만,
모든 싱글톤은 DontBeDestroyed 형태를 지니게 되는 구조로 설계 되어 있어 베이스를 두 개로 나누어 보다 확장성 있는 싱글톤으로 설계할 예정입니다.
이러한 싱글톤 베이스를 만들면 더 유연하게 사용이 가능합니다. 싱글톤 베이스를 기반으로 한 싱글톤 패턴은 확정성 있는 설계를 가능하게 하고 이를 통해 서브 클래스를 만들어서 사용할 수 있습니다. 다중으로 접근한는 것을 제어 하면 데이터의 일관성을 보장할 수 있습니다.
하지만 이러한 단점은 DontDestroyOnLoad를 사용하면 해당 객체가 씬 변경시에도 파괴되지 않아 계속 메모리에 남게 됩니다. 이로 인해 불필요한 메모리 사용이 발생할 수 있습니다. 또한 모든 싱글톤이 동일한 루트 클래스를 상속받게 만들면, 각 싱글톤이 다른 클래스를 상속받는 것을 제한하게 됩니다. 이로 인해 확장성이 제한될 수 있습니다.
이를 해결하기 위해 필요 없어진 싱글톤 인스턴스는 적절히 파괴하여 메모리 누수를 방지해야 합니다. 싱글톤이 다른 클래스를 상속받는 것을 제한하는 문제는 인터페이스를 사용하여 해결할 수 있습니다. 인터페이스를 사용하면 다른 클래스의 기능을 확장하면서도 싱글톤의 특성을 유지할 수 있습니다.
전략 패턴
을 사용 하였고,초기 전략으로는 상태(State)를 표현하는 각각에 액션(실질적인 행동)들로 구성 했습니다.
그리고 상태에서 전환(Transition)을 하기 위한 조건(Condition)들을 추가적으로 구성 했습니다.
이를 이제 시각화 하기 위해 SO로 전부 만들었고 이 과정에서 스크립트 템플릿
이필요 하다고 판단
ActionSO와 ConditionSO 기본 구성이 존재하는 Template을 만들었습니다.
ActionSO
StateSO
ConditionSO
TransitionSO
EnemyAI.cs에서 생성자를 통해 트리 구조를 구성.
만든 트리 구조를 BehaviorTreeRunner에 생성자의 파라미터에 할당하여 객체를 생성 후 .Operater 메소드로 트리를 순회
Behavior Tree Core (BT를 돌아가게 하는 베이스)
INode
BehaviorTreeRunner
DataContext
Action Node (실제 행동을 정의하는 가장 말단의 Leaf)
Composite Node (자식 노드가 2개이상, 자식 노드들의 평가를 진행)
RandomSelector
Selector
Sequence
Decorator Node (자식 노드를 1개만 가질 수 있다, 자식을 꾸며준다)
Inverter
Repeat
Succed
UntilFail
너무 많은 바인딩을 수행하면 성능에 영향을 줄 수 있기 때문에 필요이상의 바인딩을 피하고 필요한 경우를 사용해야합니다.
바인딩을 최소화하기 위해서는 빈번하게 업데이트를 하지 않아도 되는 바인딩은 맨 처음 한번만 바인딩을 실시하고 만약 지속적으로 업데이트를 해야하는 바인딩의 경우 업데이트의 빈도의 수를 줄이거나 데이터가 변경할 때에만 업데이트를 실시하도록 개선할 예정입니다.