diff --git a/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/CustomerAiComponent.cs b/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/CustomerAiComponent.cs index 64c65fa36..3fcb49e1c 100644 --- a/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/CustomerAiComponent.cs +++ b/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/CustomerAiComponent.cs @@ -46,11 +46,19 @@ private async Task InitializeAiInternal(CustomerDataEntry inCustomerDataEntry) subtree = await customerState.GetOrLoadSubtree(inCustomerDataEntry.CustomerType); } - _behaviorTree.Subgraph = subtree; + // 에이전트 간 상태 공유를 방지하기 위해 서브트리 에셋을 런타임 인스턴스로 복제하여 사용합니다. + // Addressables에서 로드한 원본 Subtree(ScriptableObject)를 그대로 공유하면 변수/태스크 상태가 섞일 수 있습니다. + var subtreeInstance = subtree != null ? ScriptableObject.Instantiate(subtree) : null; + if (subtreeInstance == null) + { + Debug.LogError("[CustomerAiComponent] Subtree instance is null. AI 초기화 중단."); + return; + } + + _behaviorTree.Subgraph = subtreeInstance; + // 블랙보드는 이 BehaviorTree 인스턴스에 바인딩되어야 에이전트별 스코프가 분리됩니다. _blackboardComponent.InitializeWithBehaviorTree(_behaviorTree); _blackboardComponent.SetCustomerData(inCustomerDataEntry.Id); - // TODO : 1. Subtree - Action, Condition - // TODO : 2. Blackboard _behaviorTree.StartBehavior(); } }