From c6fc56e9c6e83d75f9acf40d91e3e4d6f28df63a Mon Sep 17 00:00:00 2001 From: dal4segno Date: Mon, 30 Mar 2026 15:34:21 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=93=9C=EB=A1=9C=EA=B7=B8=20BT=20?= =?UTF-8?q?=EC=9D=98=EC=82=AC=EA=B2=B0=EC=A0=95=20=ED=88=AC=EB=AA=85?= =?UTF-8?q?=ED=99=94=20=E2=80=94=20=EB=AA=A8=EB=93=A0=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EC=9D=84=20BT=20=EB=85=B8=EB=93=9C=EB=A1=9C=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BossCombatPatternRole enum 완전 제거, BossPatternData에 직접 필드 추가 - 14개 패턴별 Check*/Use*Action → CheckPatternReadyCondition + UsePatternByRoleAction으로 통합 - BT 계단식 Branch 체인 구조 도입 (BranchingConditionComposite + FloatingPort) - 패턴별 고유 전제 조건을 BT Condition으로 분리 - Punish: IsDownedTargetInRangeCondition (다운 대상 반경) - Mobility: IsTargetBeyondDistanceCondition (원거리 대상) - Utility: IsTargetBeyondDistanceCondition (원거리 대상) - Primary: IsTargetInAttackRangeCondition (사거리 이내) - Phase 진입 조건을 BT에서 확인 가능하도록 IsMinPhaseSatisfiedCondition 추가 - IsPatternReady()에서 minPhase 체크 분리 → 전용 Condition으로 노출 - Secondary 패턴 개념 제거 (secondaryPattern, 보조 차례, 교대 카운터 로직 전부 삭제) - CanResolvePatternTargetCondition 삭제 (7개 중 5개가 노이즈) - RebuildDrogBehaviorAuthoringGraph로 BT 에셋 자동 재구성 메뉴 제공 --- Assets/_Game/AI/BT_Drog.asset | 4641 +++++++---------- .../Prefabs/Bosses/Prefab_Boss_Drog.prefab | 29 +- .../Actions/BossPatternActionBase.cs | 7 + .../CheckMobilityPatternReadyAction.cs | 20 - .../CheckMobilityPatternReadyAction.cs.meta | 2 - .../Actions/CheckPatternReadyActionBase.cs | 40 - .../CheckPatternReadyActionBase.cs.meta | 2 - .../Actions/CheckPrimaryPatternReadyAction.cs | 20 - .../CheckPrimaryPatternReadyAction.cs.meta | 2 - .../Actions/CheckPunishPatternReadyAction.cs | 20 - .../CheckPunishPatternReadyAction.cs.meta | 2 - .../CheckSecondaryPatternReadyAction.cs | 20 - .../CheckSecondaryPatternReadyAction.cs.meta | 2 - .../CheckSecondaryPatternTurnAction.cs | 26 - .../CheckSecondaryPatternTurnAction.cs.meta | 2 - .../CheckSignaturePatternReadyAction.cs | 31 - .../CheckSignaturePatternReadyAction.cs.meta | 2 - .../Actions/CheckTargetInAttackRangeAction.cs | 35 - .../CheckTargetInAttackRangeAction.cs.meta | 2 - .../Actions/CheckUtilityPatternReadyAction.cs | 18 - .../CheckUtilityPatternReadyAction.cs.meta | 2 - .../Actions/UseMobilityPatternAction.cs | 20 - .../Actions/UseMobilityPatternAction.cs.meta | 2 - .../Actions/UsePatternByRoleAction.cs | 153 + .../Actions/UsePatternByRoleAction.cs.meta | 2 + .../Actions/UsePatternRoleActionBase.cs | 67 - .../Actions/UsePatternRoleActionBase.cs.meta | 2 - .../Actions/UsePrimaryPatternAction.cs | 20 - .../Actions/UsePrimaryPatternAction.cs.meta | 2 - .../Actions/UsePunishPatternAction.cs | 20 - .../Actions/UsePunishPatternAction.cs.meta | 2 - .../Actions/UseSecondaryPatternAction.cs | 20 - .../Actions/UseSecondaryPatternAction.cs.meta | 2 - .../Actions/UseSignaturePatternAction.cs | 54 - .../Actions/UseSignaturePatternAction.cs.meta | 2 - .../Actions/UseUtilityPatternAction.cs | 16 - .../Actions/UseUtilityPatternAction.cs.meta | 2 - .../Conditions/CheckPatternReadyCondition.cs | 38 + .../CheckPatternReadyCondition.cs.meta | 2 + .../IsDownedTargetInRangeCondition.cs | 63 + .../IsDownedTargetInRangeCondition.cs.meta | 2 + .../IsMinPhaseSatisfiedCondition.cs | 39 + .../IsMinPhaseSatisfiedCondition.cs.meta | 2 + .../IsTargetBeyondDistanceCondition.cs | 65 + .../IsTargetBeyondDistanceCondition.cs.meta | 2 + .../IsTargetInAttackRangeCondition.cs | 38 + .../IsTargetInAttackRangeCondition.cs.meta | 2 + .../Conditions/PatternReadyHelper.cs | 53 + .../Conditions/PatternReadyHelper.cs.meta | 2 + Assets/_Game/Scripts/AI/BossPatternData.cs | 52 + .../RebuildDrogBehaviorAuthoringGraph.cs | 845 ++- .../Enemy/BossCombatBehaviorContext.cs | 279 +- .../Scripts/Enemy/BossCombatPatternRole.cs | 29 - .../Enemy/BossCombatPatternRole.cs.meta | 2 - .../Skills/Effects/ReviveEffect.cs.meta | 2 + git status | 0 56 files changed, 3287 insertions(+), 3541 deletions(-) delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs.meta create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs.meta delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs delete mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs.meta create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs.meta create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs.meta create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs.meta create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs.meta create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs.meta create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs create mode 100644 Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs.meta delete mode 100644 Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs delete mode 100644 Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs.meta create mode 100644 Assets/_Game/Scripts/Skills/Effects/ReviveEffect.cs.meta create mode 100644 git status diff --git a/Assets/_Game/AI/BT_Drog.asset b/Assets/_Game/AI/BT_Drog.asset index 0cf6e19b..abc959ed 100644 --- a/Assets/_Game/AI/BT_Drog.asset +++ b/Assets/_Game/AI/BT_Drog.asset @@ -134,8 +134,8 @@ MonoBehaviour: rid: 8805855836547055694 BlackboardGroupReferences: [] Root: - rid: 8805856136597078341 - m_VersionTimestamp: 639099724152825848 + rid: 8805856269227525015 + m_VersionTimestamp: 639104799373030722 - rid: 8805855836547055694 type: {class: BlackboardReference, ns: Unity.Behavior, asm: Unity.Behavior} data: @@ -200,7 +200,483 @@ MonoBehaviour: m_Value1: 14990413519379198129 Name: Die m_Value: 0 - - rid: 8805856136597078137 + - rid: 8805856269227525015 + type: {class: ParallelAllComposite, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 0 + m_Value1: 0 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: -2 + m_Children: + - rid: 8805856269227525016 + - rid: 8805856269227525017 + m_RegisteredObservers: [] + - rid: 8805856269227525016 + type: {class: Start, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 12926427516212381427 + m_Value1: 13609470914763854367 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525015 + m_Child: + rid: -2 + Repeat: 1 + AllowMultipleRepeatsPerTick: 0 + - rid: 8805856269227525017 + type: {class: Start, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 8989316484262271890 + m_Value1: 12367023464936917972 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525015 + m_Child: + rid: 8805856269227525018 + Repeat: 1 + AllowMultipleRepeatsPerTick: 0 + - rid: 8805856269227525018 + type: {class: RepeaterModifier, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 5268063935716045465 + m_Value1: 5146618338856714899 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525017 + m_Child: + rid: 8805856269227525019 + m_AllowMultipleRepeatsPerTick: 0 + - rid: 8805856269227525019 + type: {class: BranchingConditionComposite, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 11241001772939149685 + m_Value1: 9295882054626491943 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525018 + m_Children: + - rid: 8805856269227525020 + - rid: 8805856269227525021 + m_RegisteredObservers: [] + m_Conditions: + - rid: 8805856269227525022 + - rid: 8805856269227525023 + m_RequiresAllConditions: 1 + True: + rid: 8805856269227525020 + False: + rid: 8805856269227525021 + m_CurrentChild: + rid: -2 + m_ObserverType: 0 + - rid: 8805856269227525020 + type: {class: UsePatternByRoleAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 2677930281532527712 + m_Value1: 7726220348036807889 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525019 + Target: + rid: 8805856000049152397 + Pattern: + rid: 8805856269227525024 + - rid: 8805856269227525021 + type: {class: BranchingConditionComposite, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 8327927419675812684 + m_Value1: 10072200931220654995 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525019 + m_Children: + - rid: 8805856269227525025 + - rid: 8805856269227525026 + m_RegisteredObservers: [] + m_Conditions: + - rid: 8805856269227525027 + - rid: 8805856269227525028 + - rid: 8805856269227525029 + m_RequiresAllConditions: 1 + True: + rid: 8805856269227525025 + False: + rid: 8805856269227525026 + m_CurrentChild: + rid: -2 + m_ObserverType: 0 + - rid: 8805856269227525022 + type: {class: CheckPatternReadyCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + Pattern: + rid: 8805856269227525030 + - rid: 8805856269227525023 + type: {class: IsDownedTargetInRangeCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + searchRadius: 6 + - rid: 8805856269227525024 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2} + - rid: 8805856269227525025 + type: {class: UsePatternByRoleAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 149109160836573172 + m_Value1: 323805923604219201 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525021 + Target: + rid: 8805856000049152397 + Pattern: + rid: 8805856269227525031 + - rid: 8805856269227525026 + type: {class: BranchingConditionComposite, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 12950134585428520469 + m_Value1: 2864686471085039664 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525021 + m_Children: + - rid: 8805856269227525032 + - rid: 8805856269227525033 + m_RegisteredObservers: [] + m_Conditions: + - rid: 8805856269227525034 + - rid: 8805856269227525035 + m_RequiresAllConditions: 0 + True: + rid: 8805856269227525032 + False: + rid: 8805856269227525033 + m_CurrentChild: + rid: -2 + m_ObserverType: 0 + - rid: 8805856269227525027 + type: {class: CheckPatternReadyCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + Pattern: + rid: 8805856269227525036 + - rid: 8805856269227525028 + type: {class: IsTargetBeyondDistanceCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + minDistance: 8 + - rid: 8805856269227525029 + type: {class: IsMinPhaseSatisfiedCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + MinPhase: + rid: 8805856269227525037 + - rid: 8805856269227525030 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2} + - rid: 8805856269227525031 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2} + - rid: 8805856269227525032 + type: {class: UsePatternByRoleAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 5342162068454118625 + m_Value1: 8901977204758072783 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525026 + Target: + rid: 8805856000049152397 + Pattern: + rid: 8805856269227525038 + - rid: 8805856269227525033 + type: {class: BranchingConditionComposite, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 11006004594879318474 + m_Value1: 14490470959355756182 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525026 + m_Children: + - rid: 8805856269227525039 + - rid: 8805856269227525040 + m_RegisteredObservers: [] + m_Conditions: + - rid: 8805856269227525041 + - rid: 8805856269227525042 + m_RequiresAllConditions: 1 + True: + rid: 8805856269227525039 + False: + rid: 8805856269227525040 + m_CurrentChild: + rid: -2 + m_ObserverType: 0 + - rid: 8805856269227525034 + type: {class: CheckPatternReadyCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + Pattern: + rid: 8805856269227525043 + - rid: 8805856269227525035 + type: {class: IsMinPhaseSatisfiedCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + MinPhase: + rid: 8805856269227525044 + - rid: 8805856269227525036 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2} + - rid: 8805856269227525037 + type: {class: 'BlackboardVariable`1[[System.Int32, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: 2 + - rid: 8805856269227525038 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5e732b41722c45288bb6234f3e3fa638, type: 2} + - rid: 8805856269227525039 + type: {class: UsePatternByRoleAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 9833866619716928802 + m_Value1: 6415428456755657778 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525033 + Target: + rid: 8805856000049152397 + Pattern: + rid: 8805856269227525045 + - rid: 8805856269227525040 + type: {class: BranchingConditionComposite, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 10643186511267873346 + m_Value1: 12703122167978814222 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525033 + m_Children: + - rid: 8805856269227525046 + - rid: 8805856269227525047 + m_RegisteredObservers: [] + m_Conditions: + - rid: 8805856269227525048 + - rid: 8805856269227525049 + m_RequiresAllConditions: 1 + True: + rid: 8805856269227525046 + False: + rid: 8805856269227525047 + m_CurrentChild: + rid: -2 + m_ObserverType: 0 + - rid: 8805856269227525041 + type: {class: IsTargetInAttackRangeCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + Target: + rid: 8805856000049152397 + - rid: 8805856269227525042 + type: {class: CheckPatternReadyCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + Pattern: + rid: 8805856269227525050 + - rid: 8805856269227525043 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5e732b41722c45288bb6234f3e3fa638, type: 2} + - rid: 8805856269227525044 + type: {class: 'BlackboardVariable`1[[System.Int32, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: 3 + - rid: 8805856269227525045 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5efd8123be76bf844875d386d9d5f73d, type: 2} + - rid: 8805856269227525046 + type: {class: UsePatternByRoleAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 15007004193645173442 + m_Value1: 1535451547344369852 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525040 + Target: + rid: 8805856000049152397 + Pattern: + rid: 8805856269227525051 + - rid: 8805856269227525047 + type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} + data: + ID: + m_Value0: 11906955134252451376 + m_Value1: 8402916368466438215 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525040 + m_Children: + - rid: 8805856269227525052 + - rid: 8805856269227525053 + - rid: 8805856269227525054 + m_RegisteredObservers: [] + - rid: 8805856269227525048 + type: {class: CheckPatternReadyCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + Pattern: + rid: 8805856269227525055 + - rid: 8805856269227525049 + type: {class: IsTargetBeyondDistanceCondition, ns: Colosseum.AI.BehaviorActions.Conditions, asm: Colosseum.Game} + data: + Graph: + rid: 8805855836547055693 + minDistance: 8 + - rid: 8805856269227525050 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5efd8123be76bf844875d386d9d5f73d, type: 2} + - rid: 8805856269227525051 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 9f7ab8078af64fd9a6ff4c9ce6aa9d3a, type: 2} + - rid: 8805856269227525052 + type: {class: RefreshPrimaryTargetAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 6031716053513131039 + m_Value1: 10032030764933197590 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525047 + Target: + rid: 8805856000049152397 + - rid: 8805856269227525053 + type: {class: ValidateTargetAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 5471677900419173541 + m_Value1: 4960626904753073021 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525047 + Target: + rid: 8805856000049152397 + - rid: 8805856269227525054 + type: {class: ChaseTargetAction, ns: , asm: Colosseum.Game} + data: + ID: + m_Value0: 2373202216728637918 + m_Value1: 9490989094193705521 + Graph: + rid: 8805855836547055693 + m_Parent: + rid: 8805856269227525047 + Target: + rid: 8805856000049152397 + Speed: + rid: 8805856269227525056 + StopDistance: + rid: 8805856269227525057 + - rid: 8805856269227525055 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 9f7ab8078af64fd9a6ff4c9ce6aa9d3a, type: 2} + - rid: 8805856269227525056 type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: @@ -208,63 +684,7 @@ MonoBehaviour: m_Value1: 0 Name: m_Value: 0 - - rid: 8805856136597078138 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078139 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078140 - type: {class: 'BlackboardVariable`1[[System.String, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: Player - - rid: 8805856136597078141 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078142 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 20 - - rid: 8805856136597078143 - type: {class: 'BlackboardVariable`1[[DistanceTargetSelectionMode, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 1 - - rid: 8805856136597078144 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078145 + - rid: 8805856269227525057 type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: @@ -272,567 +692,6 @@ MonoBehaviour: m_Value1: 0 Name: m_Value: 2 - - rid: 8805856136597078341 - type: {class: Start, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 7657228776283104922 - m_Value1: 16772886399284712568 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: -2 - m_Child: - rid: 8805856136597078342 - Repeat: 1 - AllowMultipleRepeatsPerTick: 0 - - rid: 8805856136597078342 - type: {class: RepeaterModifier, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 16489647340780765286 - m_Value1: 14294957566231656474 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078341 - m_Child: - rid: 8805856136597078343 - m_AllowMultipleRepeatsPerTick: 0 - - rid: 8805856136597078343 - type: {class: SelectorComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 13835762612853047502 - m_Value1: 10351314461570932065 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078342 - m_Children: - - rid: 8805856136597078344 - - rid: 8805856136597078345 - - rid: 8805856136597078346 - - rid: 8805856136597078347 - - rid: 8805856136597078348 - - rid: 8805856136597078349 - - rid: 8805856136597078350 - - rid: 8805856136597078351 - m_RegisteredObservers: [] - - rid: 8805856136597078344 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 1640160973324030378 - m_Value1: 11484093609442816256 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078352 - - rid: 8805856136597078353 - - rid: 8805856136597078354 - - rid: 8805856136597078355 - m_RegisteredObservers: [] - - rid: 8805856136597078345 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 2986324727887438546 - m_Value1: 15659622172221145214 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078356 - - rid: 8805856136597078357 - - rid: 8805856136597078358 - m_RegisteredObservers: [] - - rid: 8805856136597078346 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 2628616810029967692 - m_Value1: 8911671866817271994 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078359 - - rid: 8805856136597078360 - - rid: 8805856136597078361 - m_RegisteredObservers: [] - - rid: 8805856136597078347 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 5908712952747285537 - m_Value1: 2700738087473014022 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078362 - - rid: 8805856136597078363 - - rid: 8805856136597078364 - m_RegisteredObservers: [] - - rid: 8805856136597078348 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 14200886672397312432 - m_Value1: 6846400485852263594 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078365 - - rid: 8805856136597078366 - - rid: 8805856136597078367 - - rid: 8805856136597078368 - - rid: 8805856136597078369 - - rid: 8805856136597078370 - m_RegisteredObservers: [] - - rid: 8805856136597078349 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 12187960159655539639 - m_Value1: 13063970618005646156 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078371 - - rid: 8805856136597078372 - - rid: 8805856136597078373 - - rid: 8805856136597078374 - - rid: 8805856136597078375 - m_RegisteredObservers: [] - - rid: 8805856136597078350 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 4369047217316331969 - m_Value1: 16826364055676638134 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078376 - - rid: 8805856136597078377 - - rid: 8805856136597078378 - - rid: 8805856136597078379 - - rid: 8805856136597078380 - m_RegisteredObservers: [] - - rid: 8805856136597078351 - type: {class: SequenceComposite, ns: Unity.Behavior, asm: Unity.Behavior} - data: - ID: - m_Value0: 6706805684068505244 - m_Value1: 7209631016975282225 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078343 - m_Children: - - rid: 8805856136597078381 - - rid: 8805856136597078382 - - rid: 8805856136597078383 - m_RegisteredObservers: [] - - rid: 8805856136597078352 - type: {class: RefreshPrimaryTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 11400719671795435197 - m_Value1: 17281190817203388328 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078344 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078353 - type: {class: ValidateTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 13529433310916340832 - m_Value1: 5203583972900102727 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078344 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078354 - type: {class: CheckSignaturePatternReadyAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 12486607573875606279 - m_Value1: 4293839600165827873 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078344 - - rid: 8805856136597078355 - type: {class: UseSignaturePatternAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 2920935235362566225 - m_Value1: 17862926224475967811 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078344 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078356 - type: {class: SelectNearestDownedTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 3520243862187252380 - m_Value1: 13622344859838722053 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078345 - Target: - rid: 8805856000049152397 - SearchRadius: - rid: 8805856136597078137 - - rid: 8805856136597078357 - type: {class: CheckPunishPatternReadyAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 14211410605366726566 - m_Value1: 11846560099732607330 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078345 - - rid: 8805856136597078358 - type: {class: UsePunishPatternAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 9536500637394960869 - m_Value1: 1735916863168101490 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078345 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078359 - type: {class: SelectAlternateTargetByDistanceAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 12811253761538613245 - m_Value1: 11848098845992540870 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078346 - Target: - rid: 8805856000049152397 - MinRange: - rid: 8805856136597078138 - MaxRange: - rid: 8805856136597078139 - - rid: 8805856136597078360 - type: {class: CheckUtilityPatternReadyAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 1882992474643620628 - m_Value1: 16424711565896793561 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078346 - - rid: 8805856136597078361 - type: {class: UseUtilityPatternAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 14944211692500294551 - m_Value1: 8601135727167681389 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078346 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078362 - type: {class: SelectTargetByDistanceAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 2379244962883356385 - m_Value1: 11186466091875931898 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078347 - Target: - rid: 8805856000049152397 - Tag: - rid: 8805856136597078140 - MinRange: - rid: 8805856136597078141 - MaxRange: - rid: 8805856136597078142 - SelectionMode: - rid: 8805856136597078143 - - rid: 8805856136597078363 - type: {class: CheckMobilityPatternReadyAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 9745824210043443406 - m_Value1: 12658101166944221129 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078347 - - rid: 8805856136597078364 - type: {class: UseMobilityPatternAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 10988665489064705763 - m_Value1: 7884647647648404927 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078347 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078365 - type: {class: RefreshPrimaryTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 5485518100470492637 - m_Value1: 6165309145915554291 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078348 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078366 - type: {class: ValidateTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 2931761933069587625 - m_Value1: 11393963839998539183 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078348 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078367 - type: {class: CheckTargetInAttackRangeAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 6895209906380228850 - m_Value1: 4260157662023272517 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078348 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078368 - type: {class: CheckSecondaryPatternTurnAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 2945009719999225082 - m_Value1: 4774016316557628407 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078348 - - rid: 8805856136597078369 - type: {class: CheckSecondaryPatternReadyAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 8341076082815011953 - m_Value1: 13391738151519513509 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078348 - - rid: 8805856136597078370 - type: {class: UseSecondaryPatternAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 2291336731499387333 - m_Value1: 9471223776772276981 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078348 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078371 - type: {class: RefreshPrimaryTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 18340640364428583313 - m_Value1: 5393169888022349063 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078349 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078372 - type: {class: ValidateTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 967848143511409115 - m_Value1: 2190737669509569426 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078349 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078373 - type: {class: CheckTargetInAttackRangeAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 15881751730403996656 - m_Value1: 5235051836517849575 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078349 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078374 - type: {class: CheckPrimaryPatternReadyAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 15192721005489896472 - m_Value1: 9440737873813259958 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078349 - - rid: 8805856136597078375 - type: {class: UsePrimaryPatternAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 17195117203300879142 - m_Value1: 5472944431026075126 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078349 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078376 - type: {class: RefreshPrimaryTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 3311591387161337986 - m_Value1: 11679750513442712347 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078350 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078377 - type: {class: ValidateTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 5169149097723200579 - m_Value1: 16927446473414507368 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078350 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078378 - type: {class: CheckTargetInAttackRangeAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 8387853058547066814 - m_Value1: 1278974181390518347 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078350 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078379 - type: {class: CheckSecondaryPatternReadyAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 4617016094989799669 - m_Value1: 15705954090531111330 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078350 - - rid: 8805856136597078380 - type: {class: UseSecondaryPatternAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 17291184047077805124 - m_Value1: 5592532357394043239 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078350 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078381 - type: {class: RefreshPrimaryTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 3098776211428300300 - m_Value1: 5911564416344222412 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078351 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078382 - type: {class: ValidateTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 2481204555457523578 - m_Value1: 6713595649020738346 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078351 - Target: - rid: 8805856000049152397 - - rid: 8805856136597078383 - type: {class: ChaseTargetAction, ns: , asm: Colosseum.Game} - data: - ID: - m_Value0: 6176121077448322589 - m_Value1: 1066163558297469453 - Graph: - rid: 8805855836547055693 - m_Parent: - rid: 8805856136597078351 - Target: - rid: 8805856000049152397 - Speed: - rid: 8805856136597078144 - StopDistance: - rid: 8805856136597078145 --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 @@ -848,50 +707,34 @@ MonoBehaviour: Blackboard: {fileID: -6591390698989283165} m_Description: m_Nodes: - - rid: 8805856136597078146 - - rid: 8805856136597078147 - - rid: 8805856136597078148 - - rid: 8805856136597078149 - - rid: 8805856136597078150 - - rid: 8805856136597078151 - - rid: 8805856136597078152 - - rid: 8805856136597078153 - - rid: 8805856136597078154 - - rid: 8805856136597078155 - - rid: 8805856136597078156 - - rid: 8805856136597078157 - - rid: 8805856136597078158 - - rid: 8805856136597078159 - - rid: 8805856136597078160 - - rid: 8805856136597078161 - - rid: 8805856136597078162 - - rid: 8805856136597078163 - - rid: 8805856136597078164 - - rid: 8805856136597078165 - - rid: 8805856136597078166 - - rid: 8805856136597078167 - - rid: 8805856136597078168 - - rid: 8805856136597078169 - - rid: 8805856136597078170 - - rid: 8805856136597078171 - - rid: 8805856136597078172 - - rid: 8805856136597078173 - - rid: 8805856136597078174 - - rid: 8805856136597078175 - - rid: 8805856136597078176 - - rid: 8805856136597078177 - - rid: 8805856136597078178 - - rid: 8805856136597078179 - - rid: 8805856136597078180 - - rid: 8805856136597078181 - - rid: 8805856136597078182 - - rid: 8805856136597078183 - - rid: 8805856136597078184 - - rid: 8805856136597078185 - - rid: 8805856136597078186 - - rid: 8805856136597078187 - - rid: 8805856136597078188 - m_VersionTimestamp: 639099724152825848 + - rid: 8805856269227524882 + - rid: 8805856269227524883 + - rid: 8805856269227524884 + - rid: 8805856269227524885 + - rid: 8805856269227524886 + - rid: 8805856269227524887 + - rid: 8805856269227524888 + - rid: 8805856269227524889 + - rid: 8805856269227524890 + - rid: 8805856269227524891 + - rid: 8805856269227524892 + - rid: 8805856269227524893 + - rid: 8805856269227524894 + - rid: 8805856269227524895 + - rid: 8805856269227524896 + - rid: 8805856269227524897 + - rid: 8805856269227524898 + - rid: 8805856269227524899 + - rid: 8805856269227524900 + - rid: 8805856269227524901 + - rid: 8805856269227524902 + - rid: 8805856269227524903 + - rid: 8805856269227524904 + - rid: 8805856269227524905 + - rid: 8805856269227524906 + - rid: 8805856269227524907 + - rid: 8805856269227524908 + m_VersionTimestamp: 639104799373030722 m_SerializedVersion: 2 m_DebugInfo: {fileID: -6758363554468061369} m_RuntimeGraph: {fileID: -3933356984444701103} @@ -923,14 +766,36 @@ MonoBehaviour: Variables: [] NamedChildren: [] IsPlaceholder: 0 - - Name: Try In Order + - Name: Conditional Branch Story: - RuntimeTypeString: Unity.Behavior.SelectorComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null + RuntimeTypeString: Unity.Behavior.BranchingConditionComposite, Unity.Behavior, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null RuntimeTypeID: - m_Value0: 11477120919463386923 - m_Value1: 7730102824742023565 + m_Value0: 12334964803190848789 + m_Value1: 14608808926743427008 Variables: [] + NamedChildren: + - True + - False + IsPlaceholder: 0 + - Name: Use Pattern By Role + Story: "[Pattern] \uD328\uD134 \uC2E4\uD589" + RuntimeTypeString: UsePatternByRoleAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, + PublicKeyToken=null + RuntimeTypeID: + m_Value0: 2454480496765486002 + m_Value1: 7378678863862367010 + Variables: + - Name: Pattern + Type: + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + Tooltip: + - Name: Target + Type: + m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + Tooltip: NamedChildren: [] IsPlaceholder: 0 - Name: Sequence @@ -974,267 +839,6 @@ MonoBehaviour: Tooltip: NamedChildren: [] IsPlaceholder: 0 - - Name: Check Signature Pattern Ready - Story: "\uC2DC\uADF8\uB2C8\uCC98 \uD328\uD134 \uC900\uBE44 \uC5EC\uBD80 \uD655\uC778" - RuntimeTypeString: CheckSignaturePatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 1030782630751220403 - m_Value1: 8038162636159494067 - Variables: [] - NamedChildren: [] - IsPlaceholder: 0 - - Name: Use Signature Pattern - Story: "\uC2DC\uADF8\uB2C8\uCC98 \uD328\uD134 \uC2E4\uD589" - RuntimeTypeString: UseSignaturePatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 14286087438207586071 - m_Value1: 15323400873876216743 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Select Nearest Downed Target - Story: "[SearchRadius] \uBC18\uACBD \uB0B4 \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uB2E4\uC6B4 - \uB300\uC0C1\uC744 [Target]\uC73C\uB85C \uC120\uD0DD" - RuntimeTypeString: SelectNearestDownedTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 3479009025465913838 - m_Value1: 8189696432825349292 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - - Name: SearchRadius - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Check Punish Pattern Ready - Story: "\uC9D5\uBC8C \uD328\uD134 \uC900\uBE44 \uC5EC\uBD80 \uD655\uC778" - RuntimeTypeString: CheckPunishPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 17241132588797744616 - m_Value1: 12089745580882483368 - Variables: [] - NamedChildren: [] - IsPlaceholder: 0 - - Name: Use Punish Pattern - Story: "\uC9D5\uBC8C \uD328\uD134 \uC2E4\uD589" - RuntimeTypeString: UsePunishPatternAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - RuntimeTypeID: - m_Value0: 15871296011671630677 - m_Value1: 8078034232868777638 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Select Alternate Target By Distance - Story: "\uC8FC \uB300\uC0C1\uC774 \uC544\uB2CC \uC6D0\uAC70\uB9AC \uB300\uC0C1 - \uC120\uD0DD" - RuntimeTypeString: SelectAlternateTargetByDistanceAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 7800294410885785375 - m_Value1: 11729698070567409544 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - - Name: MinRange - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - Tooltip: - - Name: MaxRange - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Check Utility Pattern Ready - Story: "\uC6D0\uAC70\uB9AC \uACAC\uC81C \uD328\uD134 \uC900\uBE44 \uC644\uB8CC" - RuntimeTypeString: CheckUtilityPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 18180505372114330595 - m_Value1: 15822642056788521351 - Variables: [] - NamedChildren: [] - IsPlaceholder: 0 - - Name: Use Utility Pattern - Story: "\uC6D0\uAC70\uB9AC \uACAC\uC81C \uD328\uD134 \uC2E4\uD589" - RuntimeTypeString: UseUtilityPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 7732628824466497010 - m_Value1: 7506655028499186872 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Select Target By Distance - Story: "[Tag] \uB300\uC0C1 \uC911 [MinRange] \uC774\uC0C1 [MaxRange] \uC774\uD558 - \uBC94\uC704\uC5D0\uC11C [SelectionMode] \uBC29\uC2DD\uC73C\uB85C [Target] - \uC120\uD0DD" - RuntimeTypeString: SelectTargetByDistanceAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 17676628481821338191 - m_Value1: 4731651210062498751 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - - Name: Tag - Type: - m_SerializableType: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - Tooltip: - - Name: MinRange - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - Tooltip: - - Name: MaxRange - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - Tooltip: - - Name: SelectionMode - Type: - m_SerializableType: DistanceTargetSelectionMode, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Check Mobility Pattern Ready - Story: "\uAE30\uB3D9 \uD328\uD134 \uC900\uBE44 \uC5EC\uBD80 \uD655\uC778" - RuntimeTypeString: CheckMobilityPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 8450458953142456155 - m_Value1: 940103638269631644 - Variables: [] - NamedChildren: [] - IsPlaceholder: 0 - - Name: Use Mobility Pattern - Story: "\uAE30\uB3D9 \uD328\uD134 \uC2E4\uD589" - RuntimeTypeString: UseMobilityPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 10758284640051141051 - m_Value1: 14733138854283253894 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Check Target In Attack Range - Story: "[Target]\uC774 \uBCF4\uC2A4 \uACF5\uACA9 \uC0AC\uAC70\uB9AC \uC548\uC5D0 - \uC788\uB294\uC9C0 \uD655\uC778" - RuntimeTypeString: CheckTargetInAttackRangeAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 17746747867388412438 - m_Value1: 14905810610476077465 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Check Secondary Pattern Turn - Story: "\uD604\uC7AC \uADFC\uC811 \uD328\uD134 \uCC28\uB840\uAC00 \uBCF4\uC870 - \uD328\uD134\uC778\uC9C0 \uD655\uC778" - RuntimeTypeString: CheckSecondaryPatternTurnAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 5206874914379224296 - m_Value1: 5224171301583253166 - Variables: [] - NamedChildren: [] - IsPlaceholder: 0 - - Name: Check Secondary Pattern Ready - Story: "\uBCF4\uC870 \uD328\uD134 \uC900\uBE44 \uC5EC\uBD80 \uD655\uC778" - RuntimeTypeString: CheckSecondaryPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 16451084940216554610 - m_Value1: 9193361044710023086 - Variables: [] - NamedChildren: [] - IsPlaceholder: 0 - - Name: Use Secondary Pattern - Story: "\uBCF4\uC870 \uD328\uD134 \uC2E4\uD589" - RuntimeTypeString: UseSecondaryPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 19154378423494993 - m_Value1: 8816885395727024046 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - - Name: Check Primary Pattern Ready - Story: "\uAE30\uBCF8 \uD328\uD134 \uC900\uBE44 \uC5EC\uBD80 \uD655\uC778" - RuntimeTypeString: CheckPrimaryPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 17240727157284954760 - m_Value1: 16165053335543343767 - Variables: [] - NamedChildren: [] - IsPlaceholder: 0 - - Name: Use Primary Pattern - Story: "\uAE30\uBCF8 \uD328\uD134 \uC2E4\uD589" - RuntimeTypeString: UsePrimaryPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - RuntimeTypeID: - m_Value0: 13565513945432512325 - m_Value1: 17399476701763261371 - Variables: - - Name: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - Tooltip: - NamedChildren: [] - IsPlaceholder: 0 - Name: ChaseTarget Story: "\uD0C0\uAC9F \uCD94\uC801" RuntimeTypeString: ChaseTargetAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, @@ -1267,22 +871,22 @@ MonoBehaviour: m_SubgraphsInfo: [] m_BlackboardMissingManagedRef: 0 m_GraphMissingManagedRef: 0 - m_HasMissingTypeInManagedRef: 0 + m_HasMissingTypeInManagedRef: 1 references: version: 2 RefIds: - rid: -2 type: {class: , ns: , asm: } - - rid: 8805856136597078146 + - rid: 8805856269227524882 type: {class: StartNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - Position: {x: 420, y: -620} + Position: {x: 0, y: 0} ID: - m_Value0: 7657228776283104922 - m_Value1: 16772886399284712568 + m_Value0: 12926427516212381427 + m_Value1: 13609470914763854367 Parents: [] PortModels: - - rid: 8805856136597078189 + - rid: 8805856269227524909 NodeType: m_SerializableType: Unity.Behavior.Start, Unity.Behavior, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -1292,17 +896,36 @@ MonoBehaviour: m_FieldValues: [] Repeat: 1 AllowMultipleRepeatsPerTick: 0 - - rid: 8805856136597078147 - type: {class: RepeatNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + - rid: 8805856269227524883 + type: {class: StartNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - Position: {x: 420, y: -470} + Position: {x: 420, y: -800} ID: - m_Value0: 16489647340780765286 - m_Value1: 14294957566231656474 + m_Value0: 8989316484262271890 + m_Value1: 12367023464936917972 Parents: [] PortModels: - - rid: 8805856136597078190 - - rid: 8805856136597078191 + - rid: 8805856269227524910 + NodeType: + m_SerializableType: Unity.Behavior.Start, Unity.Behavior, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 3335272451348827663 + m_Value1: 11549843281177505721 + m_FieldValues: [] + Repeat: 1 + AllowMultipleRepeatsPerTick: 0 + - rid: 8805856269227524884 + type: {class: RepeatNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: 420, y: -620} + ID: + m_Value0: 5268063935716045465 + m_Value1: 5146618338856714899 + Parents: [] + PortModels: + - rid: 8805856269227524911 + - rid: 8805856269227524912 NodeType: m_SerializableType: Unity.Behavior.RepeaterModifier, Unity.Behavior, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -1317,429 +940,529 @@ MonoBehaviour: m_RepeatMode: 0 k__BackingField: 0 k__BackingField: 1 - - rid: 8805856136597078148 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + - rid: 8805856269227524885 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: - Position: {x: 420, y: -280} + Position: {x: -597, y: -690} ID: - m_Value0: 13835762612853047502 - m_Value1: 10351314461570932065 + m_Value0: 1659366052713446922 + m_Value1: 10940051124348011685 Parents: [] PortModels: - - rid: 8805856136597078192 - - rid: 8805856136597078193 - NodeType: - m_SerializableType: Unity.Behavior.SelectorComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 11477120919463386923 - m_Value1: 7730102824742023565 - m_FieldValues: [] - - rid: 8805856136597078149 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + - rid: 8805856269227524913 + - rid: 8805856269227524914 + ParentNodeID: + m_Value0: 11241001772939149685 + m_Value1: 9295882054626491943 + PortName: True + - rid: 8805856269227524886 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: - Position: {x: -1020, y: -40} + Position: {x: -1011, y: -686} ID: - m_Value0: 1640160973324030378 - m_Value1: 11484093609442816256 + m_Value0: 15951939750221078641 + m_Value1: 16176814756459756267 Parents: [] PortModels: - - rid: 8805856136597078194 - - rid: 8805856136597078195 - NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078150 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + - rid: 8805856269227524915 + - rid: 8805856269227524916 + ParentNodeID: + m_Value0: 11241001772939149685 + m_Value1: 9295882054626491943 + PortName: False + - rid: 8805856269227524887 + type: {class: BranchingConditionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - Position: {x: -780, y: -40} + Position: {x: -800, y: -800} ID: - m_Value0: 2986324727887438546 - m_Value1: 15659622172221145214 + m_Value0: 11241001772939149685 + m_Value1: 9295882054626491943 Parents: [] PortModels: - - rid: 8805856136597078196 - - rid: 8805856136597078197 + - rid: 8805856269227524917 + - rid: 8805856269227524918 + - rid: 8805856269227524919 NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078151 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -380, y: -40} - ID: - m_Value0: 2628616810029967692 - m_Value1: 8911671866817271994 - Parents: [] - PortModels: - - rid: 8805856136597078198 - - rid: 8805856136597078199 - NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078152 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 20, y: -40} - ID: - m_Value0: 5908712952747285537 - m_Value1: 2700738087473014022 - Parents: [] - PortModels: - - rid: 8805856136597078200 - - rid: 8805856136597078201 - NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078153 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 420, y: -40} - ID: - m_Value0: 14200886672397312432 - m_Value1: 6846400485852263594 - Parents: [] - PortModels: - - rid: 8805856136597078202 - - rid: 8805856136597078203 - NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078154 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 820, y: -40} - ID: - m_Value0: 12187960159655539639 - m_Value1: 13063970618005646156 - Parents: [] - PortModels: - - rid: 8805856136597078204 - - rid: 8805856136597078205 - NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078155 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1220, y: -40} - ID: - m_Value0: 4369047217316331969 - m_Value1: 16826364055676638134 - Parents: [] - PortModels: - - rid: 8805856136597078206 - - rid: 8805856136597078207 - NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078156 - type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1620, y: -40} - ID: - m_Value0: 6706805684068505244 - m_Value1: 7209631016975282225 - Parents: [] - PortModels: - - rid: 8805856136597078208 - - rid: 8805856136597078209 - NodeType: - m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 10181448252506100447 - m_Value1: 8737116843063128493 - m_FieldValues: [] - - rid: 8805856136597078157 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -1140, y: 240} - ID: - m_Value0: 11400719671795435197 - m_Value1: 17281190817203388328 - Parents: [] - PortModels: - - rid: 8805856136597078210 - - rid: 8805856136597078211 - NodeType: - m_SerializableType: RefreshPrimaryTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1676760785695660983 - m_Value1: 3474893727400520085 - m_FieldValues: - - rid: 8805856136597078212 - - rid: 8805856136597078158 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -1020, y: 240} - ID: - m_Value0: 13529433310916340832 - m_Value1: 5203583972900102727 - Parents: [] - PortModels: - - rid: 8805856136597078213 - - rid: 8805856136597078214 - NodeType: - m_SerializableType: ValidateTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1389171756588788969 - m_Value1: 2283983672959160206 - m_FieldValues: - - rid: 8805856136597078215 - - rid: 8805856136597078159 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -900, y: 240} - ID: - m_Value0: 12486607573875606279 - m_Value1: 4293839600165827873 - Parents: [] - PortModels: - - rid: 8805856136597078216 - - rid: 8805856136597078217 - NodeType: - m_SerializableType: CheckSignaturePatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1030782630751220403 - m_Value1: 8038162636159494067 - m_FieldValues: [] - - rid: 8805856136597078160 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -780, y: 240} - ID: - m_Value0: 2920935235362566225 - m_Value1: 17862926224475967811 - Parents: [] - PortModels: - - rid: 8805856136597078218 - - rid: 8805856136597078219 - NodeType: - m_SerializableType: UseSignaturePatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 14286087438207586071 - m_Value1: 15323400873876216743 - m_FieldValues: - - rid: 8805856136597078220 - - rid: 8805856136597078161 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -740, y: 240} - ID: - m_Value0: 3520243862187252380 - m_Value1: 13622344859838722053 - Parents: [] - PortModels: - - rid: 8805856136597078221 - - rid: 8805856136597078222 - NodeType: - m_SerializableType: SelectNearestDownedTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 3479009025465913838 - m_Value1: 8189696432825349292 - m_FieldValues: - - rid: 8805856136597078223 - - rid: 8805856136597078224 - - rid: 8805856136597078162 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -620, y: 240} - ID: - m_Value0: 14211410605366726566 - m_Value1: 11846560099732607330 - Parents: [] - PortModels: - - rid: 8805856136597078225 - - rid: 8805856136597078226 - NodeType: - m_SerializableType: CheckPunishPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 17241132588797744616 - m_Value1: 12089745580882483368 - m_FieldValues: [] - - rid: 8805856136597078163 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -500, y: 240} - ID: - m_Value0: 9536500637394960869 - m_Value1: 1735916863168101490 - Parents: [] - PortModels: - - rid: 8805856136597078227 - - rid: 8805856136597078228 - NodeType: - m_SerializableType: UsePunishPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 15871296011671630677 - m_Value1: 8078034232868777638 - m_FieldValues: - - rid: 8805856136597078229 - - rid: 8805856136597078164 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -500, y: 240} - ID: - m_Value0: 12811253761538613245 - m_Value1: 11848098845992540870 - Parents: [] - PortModels: - - rid: 8805856136597078230 - - rid: 8805856136597078231 - NodeType: - m_SerializableType: SelectAlternateTargetByDistanceAction, Colosseum.Game, + m_SerializableType: Unity.Behavior.BranchingConditionComposite, Unity.Behavior, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null NodeTypeID: - m_Value0: 7800294410885785375 - m_Value1: 11729698070567409544 - m_FieldValues: - - rid: 8805856136597078232 - - rid: 8805856136597078233 - - rid: 8805856136597078234 - - rid: 8805856136597078165 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: -380, y: 240} - ID: - m_Value0: 1882992474643620628 - m_Value1: 16424711565896793561 - Parents: [] - PortModels: - - rid: 8805856136597078235 - - rid: 8805856136597078236 - NodeType: - m_SerializableType: CheckUtilityPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 18180505372114330595 - m_Value1: 15822642056788521351 + m_Value0: 12334964803190848789 + m_Value1: 14608808926743427008 m_FieldValues: [] - - rid: 8805856136597078166 + k__BackingField: + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.CheckPatternReadyCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 2454480496479154849 + m_Value1: 6148895925901394722 + NodeModel: + rid: 8805856269227524887 + m_FieldValues: + - rid: 8805856269227524920 + OperatorFieldModel: + rid: -2 + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.IsDownedTargetInRangeCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 4913483284257105364 + m_Value1: 33609211461305668 + NodeModel: + rid: 8805856269227524887 + m_FieldValues: [] + OperatorFieldModel: + rid: -2 + k__BackingField: 1 + k__BackingField: 0 + k__BackingField: 0 + - rid: 8805856269227524888 type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - Position: {x: -260, y: 240} + Position: {x: -598, y: -601} ID: - m_Value0: 14944211692500294551 - m_Value1: 8601135727167681389 + m_Value0: 2677930281532527712 + m_Value1: 7726220348036807889 Parents: [] PortModels: - - rid: 8805856136597078237 - - rid: 8805856136597078238 + - rid: 8805856269227524922 + - rid: 8805856269227524923 NodeType: - m_SerializableType: UseUtilityPatternAction, Colosseum.Game, Version=0.0.0.0, + m_SerializableType: UsePatternByRoleAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null NodeTypeID: - m_Value0: 7732628824466497010 - m_Value1: 7506655028499186872 + m_Value0: 2454480496765486002 + m_Value1: 7378678863862367010 m_FieldValues: - - rid: 8805856136597078239 - - rid: 8805856136597078167 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + - rid: 8805856269227524924 + - rid: 8805856269227524925 + - rid: 8805856269227524889 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: - Position: {x: -100, y: 240} + Position: {x: -597, y: -470} ID: - m_Value0: 2379244962883356385 - m_Value1: 11186466091875931898 + m_Value0: 12871022827721849984 + m_Value1: 9526508521646450847 Parents: [] PortModels: - - rid: 8805856136597078240 - - rid: 8805856136597078241 - NodeType: - m_SerializableType: SelectTargetByDistanceAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 17676628481821338191 - m_Value1: 4731651210062498751 - m_FieldValues: - - rid: 8805856136597078242 - - rid: 8805856136597078243 - - rid: 8805856136597078244 - - rid: 8805856136597078245 - - rid: 8805856136597078246 - - rid: 8805856136597078168 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + - rid: 8805856269227524926 + - rid: 8805856269227524927 + ParentNodeID: + m_Value0: 8327927419675812684 + m_Value1: 10072200931220654995 + PortName: True + - rid: 8805856269227524890 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: - Position: {x: 20, y: 240} + Position: {x: -1011, y: -466} ID: - m_Value0: 9745824210043443406 - m_Value1: 12658101166944221129 + m_Value0: 10490030815034474748 + m_Value1: 14362510368680266244 Parents: [] PortModels: - - rid: 8805856136597078247 - - rid: 8805856136597078248 + - rid: 8805856269227524928 + - rid: 8805856269227524929 + ParentNodeID: + m_Value0: 8327927419675812684 + m_Value1: 10072200931220654995 + PortName: False + - rid: 8805856269227524891 + type: {class: BranchingConditionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -800, y: -580} + ID: + m_Value0: 8327927419675812684 + m_Value1: 10072200931220654995 + Parents: [] + PortModels: + - rid: 8805856269227524930 + - rid: 8805856269227524931 + - rid: 8805856269227524932 NodeType: - m_SerializableType: CheckMobilityPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null + m_SerializableType: Unity.Behavior.BranchingConditionComposite, Unity.Behavior, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null NodeTypeID: - m_Value0: 8450458953142456155 - m_Value1: 940103638269631644 + m_Value0: 12334964803190848789 + m_Value1: 14608808926743427008 m_FieldValues: [] - - rid: 8805856136597078169 + k__BackingField: + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.CheckPatternReadyCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 2454480496479154849 + m_Value1: 6148895925901394722 + NodeModel: + rid: 8805856269227524891 + m_FieldValues: + - rid: 8805856269227524933 + OperatorFieldModel: + rid: -2 + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.IsTargetBeyondDistanceCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 6142984678801929957 + m_Value1: 38413051063830101 + NodeModel: + rid: 8805856269227524891 + m_FieldValues: [] + OperatorFieldModel: + rid: -2 + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.IsMinPhaseSatisfiedCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 9831488861562598627 + m_Value1: 15987178195918588296 + NodeModel: + rid: 8805856269227524891 + m_FieldValues: + - rid: 8805856269227524935 + OperatorFieldModel: + rid: -2 + k__BackingField: 1 + k__BackingField: 0 + k__BackingField: 0 + - rid: 8805856269227524892 type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - Position: {x: 140, y: 240} + Position: {x: -598, y: -381} ID: - m_Value0: 10988665489064705763 - m_Value1: 7884647647648404927 + m_Value0: 149109160836573172 + m_Value1: 323805923604219201 Parents: [] PortModels: - - rid: 8805856136597078249 - - rid: 8805856136597078250 + - rid: 8805856269227524936 + - rid: 8805856269227524937 NodeType: - m_SerializableType: UseMobilityPatternAction, Colosseum.Game, Version=0.0.0.0, + m_SerializableType: UsePatternByRoleAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null NodeTypeID: - m_Value0: 10758284640051141051 - m_Value1: 14733138854283253894 + m_Value0: 2454480496765486002 + m_Value1: 7378678863862367010 m_FieldValues: - - rid: 8805856136597078251 - - rid: 8805856136597078170 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + - rid: 8805856269227524938 + - rid: 8805856269227524939 + - rid: 8805856269227524893 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: - Position: {x: 240, y: 240} + Position: {x: -597, y: -250} ID: - m_Value0: 5485518100470492637 - m_Value1: 6165309145915554291 + m_Value0: 6662675976562466331 + m_Value1: 14233409137891226921 Parents: [] PortModels: - - rid: 8805856136597078252 - - rid: 8805856136597078253 + - rid: 8805856269227524940 + - rid: 8805856269227524941 + ParentNodeID: + m_Value0: 12950134585428520469 + m_Value1: 2864686471085039664 + PortName: True + - rid: 8805856269227524894 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + Position: {x: -1011, y: -246} + ID: + m_Value0: 12597302202605536644 + m_Value1: 5885533327313682309 + Parents: [] + PortModels: + - rid: 8805856269227524942 + - rid: 8805856269227524943 + ParentNodeID: + m_Value0: 12950134585428520469 + m_Value1: 2864686471085039664 + PortName: False + - rid: 8805856269227524895 + type: {class: BranchingConditionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -800, y: -360} + ID: + m_Value0: 12950134585428520469 + m_Value1: 2864686471085039664 + Parents: [] + PortModels: + - rid: 8805856269227524944 + - rid: 8805856269227524945 + - rid: 8805856269227524946 + NodeType: + m_SerializableType: Unity.Behavior.BranchingConditionComposite, Unity.Behavior, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 12334964803190848789 + m_Value1: 14608808926743427008 + m_FieldValues: [] + k__BackingField: + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.CheckPatternReadyCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 2454480496479154849 + m_Value1: 6148895925901394722 + NodeModel: + rid: 8805856269227524895 + m_FieldValues: + - rid: 8805856269227524947 + OperatorFieldModel: + rid: -2 + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.IsMinPhaseSatisfiedCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 9831488861562598627 + m_Value1: 15987178195918588296 + NodeModel: + rid: 8805856269227524895 + m_FieldValues: + - rid: 8805856269227524948 + OperatorFieldModel: + rid: -2 + k__BackingField: 0 + k__BackingField: 0 + k__BackingField: 0 + - rid: 8805856269227524896 + type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -598, y: -161} + ID: + m_Value0: 5342162068454118625 + m_Value1: 8901977204758072783 + Parents: [] + PortModels: + - rid: 8805856269227524949 + - rid: 8805856269227524950 + NodeType: + m_SerializableType: UsePatternByRoleAction, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 2454480496765486002 + m_Value1: 7378678863862367010 + m_FieldValues: + - rid: 8805856269227524951 + - rid: 8805856269227524952 + - rid: 8805856269227524897 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + Position: {x: -597, y: 190} + ID: + m_Value0: 13696340203351307661 + m_Value1: 16402911895767258470 + Parents: [] + PortModels: + - rid: 8805856269227524953 + - rid: 8805856269227524954 + ParentNodeID: + m_Value0: 11006004594879318474 + m_Value1: 14490470959355756182 + PortName: True + - rid: 8805856269227524898 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + Position: {x: -1011, y: 194} + ID: + m_Value0: 6762566799293817621 + m_Value1: 3038289036036612429 + Parents: [] + PortModels: + - rid: 8805856269227524955 + - rid: 8805856269227524956 + ParentNodeID: + m_Value0: 11006004594879318474 + m_Value1: 14490470959355756182 + PortName: False + - rid: 8805856269227524899 + type: {class: BranchingConditionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -800, y: 80} + ID: + m_Value0: 11006004594879318474 + m_Value1: 14490470959355756182 + Parents: [] + PortModels: + - rid: 8805856269227524957 + - rid: 8805856269227524958 + - rid: 8805856269227524959 + NodeType: + m_SerializableType: Unity.Behavior.BranchingConditionComposite, Unity.Behavior, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 12334964803190848789 + m_Value1: 14608808926743427008 + m_FieldValues: [] + k__BackingField: + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.IsTargetInAttackRangeCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 6064932678942799703 + m_Value1: 7649403111828602074 + NodeModel: + rid: 8805856269227524899 + m_FieldValues: + - rid: 8805856269227524960 + OperatorFieldModel: + rid: -2 + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.CheckPatternReadyCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 2454480496479154849 + m_Value1: 6148895925901394722 + NodeModel: + rid: 8805856269227524899 + m_FieldValues: + - rid: 8805856269227524961 + OperatorFieldModel: + rid: -2 + k__BackingField: 1 + k__BackingField: 0 + k__BackingField: 0 + - rid: 8805856269227524900 + type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -598, y: 279} + ID: + m_Value0: 9833866619716928802 + m_Value1: 6415428456755657778 + Parents: [] + PortModels: + - rid: 8805856269227524962 + - rid: 8805856269227524963 + NodeType: + m_SerializableType: UsePatternByRoleAction, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 2454480496765486002 + m_Value1: 7378678863862367010 + m_FieldValues: + - rid: 8805856269227524964 + - rid: 8805856269227524965 + - rid: 8805856269227524901 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + Position: {x: -597, y: 410} + ID: + m_Value0: 1347524083260899529 + m_Value1: 15714149976659177536 + Parents: [] + PortModels: + - rid: 8805856269227524966 + - rid: 8805856269227524967 + ParentNodeID: + m_Value0: 10643186511267873346 + m_Value1: 12703122167978814222 + PortName: True + - rid: 8805856269227524902 + type: {class: FloatingPortNodeModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + Position: {x: -1011, y: 414} + ID: + m_Value0: 18375769474541327182 + m_Value1: 12637469485295803464 + Parents: [] + PortModels: + - rid: 8805856269227524968 + - rid: 8805856269227524969 + ParentNodeID: + m_Value0: 10643186511267873346 + m_Value1: 12703122167978814222 + PortName: False + - rid: 8805856269227524903 + type: {class: BranchingConditionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -800, y: 300} + ID: + m_Value0: 10643186511267873346 + m_Value1: 12703122167978814222 + Parents: [] + PortModels: + - rid: 8805856269227524970 + - rid: 8805856269227524971 + - rid: 8805856269227524972 + NodeType: + m_SerializableType: Unity.Behavior.BranchingConditionComposite, Unity.Behavior, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 12334964803190848789 + m_Value1: 14608808926743427008 + m_FieldValues: [] + k__BackingField: + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.CheckPatternReadyCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 2454480496479154849 + m_Value1: 6148895925901394722 + NodeModel: + rid: 8805856269227524903 + m_FieldValues: + - rid: 8805856269227524973 + OperatorFieldModel: + rid: -2 + - ConditionType: + m_SerializableType: Colosseum.AI.BehaviorActions.Conditions.IsTargetBeyondDistanceCondition, + Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + ConditionTypeID: + m_Value0: 6142984678801929957 + m_Value1: 38413051063830101 + NodeModel: + rid: 8805856269227524903 + m_FieldValues: [] + OperatorFieldModel: + rid: -2 + k__BackingField: 1 + k__BackingField: 0 + k__BackingField: 0 + - rid: 8805856269227524904 + type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -598, y: 499} + ID: + m_Value0: 15007004193645173442 + m_Value1: 1535451547344369852 + Parents: [] + PortModels: + - rid: 8805856269227524975 + - rid: 8805856269227524976 + NodeType: + m_SerializableType: UsePatternByRoleAction, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 2454480496765486002 + m_Value1: 7378678863862367010 + m_FieldValues: + - rid: 8805856269227524977 + - rid: 8805856269227524978 + - rid: 8805856269227524905 + type: {class: CompositeNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -800, y: 520} + ID: + m_Value0: 11906955134252451376 + m_Value1: 8402916368466438215 + Parents: [] + PortModels: + - rid: 8805856269227524979 + - rid: 8805856269227524980 + NodeType: + m_SerializableType: Unity.Behavior.SequenceComposite, Unity.Behavior, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + NodeTypeID: + m_Value0: 10181448252506100447 + m_Value1: 8737116843063128493 + m_FieldValues: [] + - rid: 8805856269227524906 + type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + Position: {x: -640, y: 600} + ID: + m_Value0: 6031716053513131039 + m_Value1: 10032030764933197590 + Parents: [] + PortModels: + - rid: 8805856269227524981 + - rid: 8805856269227524982 NodeType: m_SerializableType: RefreshPrimaryTargetAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -1747,18 +1470,18 @@ MonoBehaviour: m_Value0: 1676760785695660983 m_Value1: 3474893727400520085 m_FieldValues: - - rid: 8805856136597078254 - - rid: 8805856136597078171 + - rid: 8805856269227524983 + - rid: 8805856269227524907 type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - Position: {x: 360, y: 240} + Position: {x: -480, y: 600} ID: - m_Value0: 2931761933069587625 - m_Value1: 11393963839998539183 + m_Value0: 5471677900419173541 + m_Value1: 4960626904753073021 Parents: [] PortModels: - - rid: 8805856136597078255 - - rid: 8805856136597078256 + - rid: 8805856269227524984 + - rid: 8805856269227524985 NodeType: m_SerializableType: ValidateTargetAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -1766,318 +1489,18 @@ MonoBehaviour: m_Value0: 1389171756588788969 m_Value1: 2283983672959160206 m_FieldValues: - - rid: 8805856136597078257 - - rid: 8805856136597078172 + - rid: 8805856269227524986 + - rid: 8805856269227524908 type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - Position: {x: 480, y: 240} + Position: {x: -320, y: 600} ID: - m_Value0: 6895209906380228850 - m_Value1: 4260157662023272517 + m_Value0: 2373202216728637918 + m_Value1: 9490989094193705521 Parents: [] PortModels: - - rid: 8805856136597078258 - - rid: 8805856136597078259 - NodeType: - m_SerializableType: CheckTargetInAttackRangeAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 17746747867388412438 - m_Value1: 14905810610476077465 - m_FieldValues: - - rid: 8805856136597078260 - - rid: 8805856136597078173 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 600, y: 240} - ID: - m_Value0: 2945009719999225082 - m_Value1: 4774016316557628407 - Parents: [] - PortModels: - - rid: 8805856136597078261 - - rid: 8805856136597078262 - NodeType: - m_SerializableType: CheckSecondaryPatternTurnAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 5206874914379224296 - m_Value1: 5224171301583253166 - m_FieldValues: [] - - rid: 8805856136597078174 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 720, y: 240} - ID: - m_Value0: 8341076082815011953 - m_Value1: 13391738151519513509 - Parents: [] - PortModels: - - rid: 8805856136597078263 - - rid: 8805856136597078264 - NodeType: - m_SerializableType: CheckSecondaryPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 16451084940216554610 - m_Value1: 9193361044710023086 - m_FieldValues: [] - - rid: 8805856136597078175 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 840, y: 240} - ID: - m_Value0: 2291336731499387333 - m_Value1: 9471223776772276981 - Parents: [] - PortModels: - - rid: 8805856136597078265 - - rid: 8805856136597078266 - NodeType: - m_SerializableType: UseSecondaryPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 19154378423494993 - m_Value1: 8816885395727024046 - m_FieldValues: - - rid: 8805856136597078267 - - rid: 8805856136597078176 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 760, y: 240} - ID: - m_Value0: 18340640364428583313 - m_Value1: 5393169888022349063 - Parents: [] - PortModels: - - rid: 8805856136597078268 - - rid: 8805856136597078269 - NodeType: - m_SerializableType: RefreshPrimaryTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1676760785695660983 - m_Value1: 3474893727400520085 - m_FieldValues: - - rid: 8805856136597078270 - - rid: 8805856136597078177 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 880, y: 240} - ID: - m_Value0: 967848143511409115 - m_Value1: 2190737669509569426 - Parents: [] - PortModels: - - rid: 8805856136597078271 - - rid: 8805856136597078272 - NodeType: - m_SerializableType: ValidateTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1389171756588788969 - m_Value1: 2283983672959160206 - m_FieldValues: - - rid: 8805856136597078273 - - rid: 8805856136597078178 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1000, y: 240} - ID: - m_Value0: 15881751730403996656 - m_Value1: 5235051836517849575 - Parents: [] - PortModels: - - rid: 8805856136597078274 - - rid: 8805856136597078275 - NodeType: - m_SerializableType: CheckTargetInAttackRangeAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 17746747867388412438 - m_Value1: 14905810610476077465 - m_FieldValues: - - rid: 8805856136597078276 - - rid: 8805856136597078179 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1120, y: 240} - ID: - m_Value0: 15192721005489896472 - m_Value1: 9440737873813259958 - Parents: [] - PortModels: - - rid: 8805856136597078277 - - rid: 8805856136597078278 - NodeType: - m_SerializableType: CheckPrimaryPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 17240727157284954760 - m_Value1: 16165053335543343767 - m_FieldValues: [] - - rid: 8805856136597078180 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1240, y: 240} - ID: - m_Value0: 17195117203300879142 - m_Value1: 5472944431026075126 - Parents: [] - PortModels: - - rid: 8805856136597078279 - - rid: 8805856136597078280 - NodeType: - m_SerializableType: UsePrimaryPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 13565513945432512325 - m_Value1: 17399476701763261371 - m_FieldValues: - - rid: 8805856136597078281 - - rid: 8805856136597078181 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1160, y: 240} - ID: - m_Value0: 3311591387161337986 - m_Value1: 11679750513442712347 - Parents: [] - PortModels: - - rid: 8805856136597078282 - - rid: 8805856136597078283 - NodeType: - m_SerializableType: RefreshPrimaryTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1676760785695660983 - m_Value1: 3474893727400520085 - m_FieldValues: - - rid: 8805856136597078284 - - rid: 8805856136597078182 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1280, y: 240} - ID: - m_Value0: 5169149097723200579 - m_Value1: 16927446473414507368 - Parents: [] - PortModels: - - rid: 8805856136597078285 - - rid: 8805856136597078286 - NodeType: - m_SerializableType: ValidateTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1389171756588788969 - m_Value1: 2283983672959160206 - m_FieldValues: - - rid: 8805856136597078287 - - rid: 8805856136597078183 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1400, y: 240} - ID: - m_Value0: 8387853058547066814 - m_Value1: 1278974181390518347 - Parents: [] - PortModels: - - rid: 8805856136597078288 - - rid: 8805856136597078289 - NodeType: - m_SerializableType: CheckTargetInAttackRangeAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 17746747867388412438 - m_Value1: 14905810610476077465 - m_FieldValues: - - rid: 8805856136597078290 - - rid: 8805856136597078184 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1520, y: 240} - ID: - m_Value0: 4617016094989799669 - m_Value1: 15705954090531111330 - Parents: [] - PortModels: - - rid: 8805856136597078291 - - rid: 8805856136597078292 - NodeType: - m_SerializableType: CheckSecondaryPatternReadyAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 16451084940216554610 - m_Value1: 9193361044710023086 - m_FieldValues: [] - - rid: 8805856136597078185 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1640, y: 240} - ID: - m_Value0: 17291184047077805124 - m_Value1: 5592532357394043239 - Parents: [] - PortModels: - - rid: 8805856136597078293 - - rid: 8805856136597078294 - NodeType: - m_SerializableType: UseSecondaryPatternAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 19154378423494993 - m_Value1: 8816885395727024046 - m_FieldValues: - - rid: 8805856136597078295 - - rid: 8805856136597078186 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1560, y: 240} - ID: - m_Value0: 3098776211428300300 - m_Value1: 5911564416344222412 - Parents: [] - PortModels: - - rid: 8805856136597078296 - - rid: 8805856136597078297 - NodeType: - m_SerializableType: RefreshPrimaryTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1676760785695660983 - m_Value1: 3474893727400520085 - m_FieldValues: - - rid: 8805856136597078298 - - rid: 8805856136597078187 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1680, y: 240} - ID: - m_Value0: 2481204555457523578 - m_Value1: 6713595649020738346 - Parents: [] - PortModels: - - rid: 8805856136597078299 - - rid: 8805856136597078300 - NodeType: - m_SerializableType: ValidateTargetAction, Colosseum.Game, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - NodeTypeID: - m_Value0: 1389171756588788969 - m_Value1: 2283983672959160206 - m_FieldValues: - - rid: 8805856136597078301 - - rid: 8805856136597078188 - type: {class: ActionNodeModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - Position: {x: 1800, y: 240} - ID: - m_Value0: 6176121077448322589 - m_Value1: 1066163558297469453 - Parents: [] - PortModels: - - rid: 8805856136597078302 - - rid: 8805856136597078303 + - rid: 8805856269227524987 + - rid: 8805856269227524988 NodeType: m_SerializableType: ChaseTargetAction, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -2085,270 +1508,160 @@ MonoBehaviour: m_Value0: 4737707736320149768 m_Value1: 7523468823499502926 m_FieldValues: - - rid: 8805856136597078304 - - rid: 8805856136597078305 - - rid: 8805856136597078306 - - rid: 8805856136597078189 + - rid: 8805856269227524989 + - rid: 8805856269227525058 + - rid: 8805856269227525059 + - rid: 8805856269227524909 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078146 - m_Connections: - - rid: 8805856136597078190 - - rid: 8805856136597078190 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078147 - m_Connections: - - rid: 8805856136597078189 - - rid: 8805856136597078191 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078147 - m_Connections: - - rid: 8805856136597078192 - - rid: 8805856136597078192 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078148 - m_Connections: - - rid: 8805856136597078191 - - rid: 8805856136597078193 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078148 - m_Connections: - - rid: 8805856136597078194 - - rid: 8805856136597078196 - - rid: 8805856136597078198 - - rid: 8805856136597078200 - - rid: 8805856136597078202 - - rid: 8805856136597078204 - - rid: 8805856136597078206 - - rid: 8805856136597078208 - - rid: 8805856136597078194 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078149 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078195 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078149 - m_Connections: - - rid: 8805856136597078210 - - rid: 8805856136597078213 - - rid: 8805856136597078216 - - rid: 8805856136597078218 - - rid: 8805856136597078196 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078150 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078197 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078150 - m_Connections: - - rid: 8805856136597078221 - - rid: 8805856136597078225 - - rid: 8805856136597078227 - - rid: 8805856136597078198 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078151 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078199 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078151 - m_Connections: - - rid: 8805856136597078230 - - rid: 8805856136597078235 - - rid: 8805856136597078237 - - rid: 8805856136597078200 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078152 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078201 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078152 - m_Connections: - - rid: 8805856136597078240 - - rid: 8805856136597078247 - - rid: 8805856136597078249 - - rid: 8805856136597078202 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078153 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078203 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078153 - m_Connections: - - rid: 8805856136597078252 - - rid: 8805856136597078255 - - rid: 8805856136597078258 - - rid: 8805856136597078261 - - rid: 8805856136597078263 - - rid: 8805856136597078265 - - rid: 8805856136597078204 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078154 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078205 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078154 - m_Connections: - - rid: 8805856136597078268 - - rid: 8805856136597078271 - - rid: 8805856136597078274 - - rid: 8805856136597078277 - - rid: 8805856136597078279 - - rid: 8805856136597078206 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078155 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078207 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078155 - m_Connections: - - rid: 8805856136597078282 - - rid: 8805856136597078285 - - rid: 8805856136597078288 - - rid: 8805856136597078291 - - rid: 8805856136597078293 - - rid: 8805856136597078208 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078156 - m_Connections: - - rid: 8805856136597078193 - - rid: 8805856136597078209 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078156 - m_Connections: - - rid: 8805856136597078296 - - rid: 8805856136597078299 - - rid: 8805856136597078302 - - rid: 8805856136597078210 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078157 - m_Connections: - - rid: 8805856136597078195 - - rid: 8805856136597078211 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078157 + rid: 8805856269227524882 m_Connections: [] - - rid: 8805856136597078212 + - rid: 8805856269227524910 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524883 + m_Connections: + - rid: 8805856269227524911 + - rid: 8805856269227524911 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524884 + m_Connections: + - rid: 8805856269227524910 + - rid: 8805856269227524912 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524884 + m_Connections: + - rid: 8805856269227524917 + - rid: 8805856269227524913 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524885 + m_Connections: + - rid: 8805856269227524918 + - rid: 8805856269227524914 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524885 + m_Connections: + - rid: 8805856269227524922 + - rid: 8805856269227524915 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524886 + m_Connections: + - rid: 8805856269227524919 + - rid: 8805856269227524916 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524886 + m_Connections: + - rid: 8805856269227524930 + - rid: 8805856269227524917 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524887 + m_Connections: + - rid: 8805856269227524912 + - rid: 8805856269227524918 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: True + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524887 + m_Connections: + - rid: 8805856269227524913 + - rid: 8805856269227524919 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: False + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524887 + m_Connections: + - rid: 8805856269227524915 + - rid: 8805856269227524920 + type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + FieldName: Pattern + Type: + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + LocalValue: + rid: 8805856269227524990 + LinkedVariable: + rid: -2 + - rid: 8805856269227524922 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524888 + m_Connections: + - rid: 8805856269227524914 + - rid: 8805856269227524923 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524888 + m_Connections: [] + - rid: 8805856269227524924 + type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + FieldName: Pattern + Type: + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + LocalValue: + rid: 8805856269227524992 + LinkedVariable: + rid: -2 + - rid: 8805856269227524925 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2356,168 +1669,132 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078307 + rid: 8805856269227524993 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078213 + rid: 8805856269227524994 + - rid: 8805856269227524926 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: InputPort m_PortDataFlowType: 0 - m_IsFloating: 0 + m_IsFloating: 1 m_NodeModel: - rid: 8805856136597078158 + rid: 8805856269227524889 m_Connections: - - rid: 8805856136597078195 - - rid: 8805856136597078214 + - rid: 8805856269227524931 + - rid: 8805856269227524927 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078158 - m_Connections: [] - - rid: 8805856136597078215 + rid: 8805856269227524889 + m_Connections: + - rid: 8805856269227524936 + - rid: 8805856269227524928 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524890 + m_Connections: + - rid: 8805856269227524932 + - rid: 8805856269227524929 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524890 + m_Connections: + - rid: 8805856269227524944 + - rid: 8805856269227524930 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524891 + m_Connections: + - rid: 8805856269227524916 + - rid: 8805856269227524931 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: True + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524891 + m_Connections: + - rid: 8805856269227524926 + - rid: 8805856269227524932 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: False + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524891 + m_Connections: + - rid: 8805856269227524928 + - rid: 8805856269227524933 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: Target + FieldName: Pattern Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078309 + rid: 8805856269227524995 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078216 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078159 - m_Connections: - - rid: 8805856136597078195 - - rid: 8805856136597078217 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078159 - m_Connections: [] - - rid: 8805856136597078218 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078160 - m_Connections: - - rid: 8805856136597078195 - - rid: 8805856136597078219 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078160 - m_Connections: [] - - rid: 8805856136597078220 + rid: -2 + - rid: 8805856269227524935 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: Target + FieldName: MinPhase Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078310 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078221 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078161 - m_Connections: - - rid: 8805856136597078197 - - rid: 8805856136597078222 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078161 - m_Connections: [] - - rid: 8805856136597078223 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078311 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078224 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: SearchRadius - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 LocalValue: - rid: 8805856136597078312 + rid: 8805856269227524997 LinkedVariable: rid: -2 - - rid: 8805856136597078225 + - rid: 8805856269227524936 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: InputPort m_PortDataFlowType: 0 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078162 + rid: 8805856269227524892 m_Connections: - - rid: 8805856136597078197 - - rid: 8805856136597078226 + - rid: 8805856269227524927 + - rid: 8805856269227524937 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078162 + rid: 8805856269227524892 m_Connections: [] - - rid: 8805856136597078227 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + - rid: 8805856269227524938 + type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078163 - m_Connections: - - rid: 8805856136597078197 - - rid: 8805856136597078228 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078163 - m_Connections: [] - - rid: 8805856136597078229 + FieldName: Pattern + Type: + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + LocalValue: + rid: 8805856269227524998 + LinkedVariable: + rid: -2 + - rid: 8805856269227524939 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2525,100 +1802,132 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078313 + rid: 8805856269227524999 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078230 + rid: 8805856269227524994 + - rid: 8805856269227524940 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: InputPort m_PortDataFlowType: 0 - m_IsFloating: 0 + m_IsFloating: 1 m_NodeModel: - rid: 8805856136597078164 + rid: 8805856269227524893 m_Connections: - - rid: 8805856136597078199 - - rid: 8805856136597078231 + - rid: 8805856269227524945 + - rid: 8805856269227524941 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078164 - m_Connections: [] - - rid: 8805856136597078232 + rid: 8805856269227524893 + m_Connections: + - rid: 8805856269227524949 + - rid: 8805856269227524942 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524894 + m_Connections: + - rid: 8805856269227524946 + - rid: 8805856269227524943 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524894 + m_Connections: + - rid: 8805856269227524957 + - rid: 8805856269227524944 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524895 + m_Connections: + - rid: 8805856269227524929 + - rid: 8805856269227524945 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: True + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524895 + m_Connections: + - rid: 8805856269227524940 + - rid: 8805856269227524946 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: False + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524895 + m_Connections: + - rid: 8805856269227524942 + - rid: 8805856269227524947 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: Target + FieldName: Pattern Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078314 + rid: 8805856269227525000 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078233 + rid: -2 + - rid: 8805856269227524948 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: MinRange + FieldName: MinPhase Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 LocalValue: - rid: 8805856136597078315 + rid: 8805856269227525001 LinkedVariable: rid: -2 - - rid: 8805856136597078234 + - rid: 8805856269227524949 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524896 + m_Connections: + - rid: 8805856269227524941 + - rid: 8805856269227524950 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524896 + m_Connections: [] + - rid: 8805856269227524951 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: MaxRange + FieldName: Pattern Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078316 + rid: 8805856269227525002 LinkedVariable: rid: -2 - - rid: 8805856136597078235 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078165 - m_Connections: - - rid: 8805856136597078199 - - rid: 8805856136597078236 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078165 - m_Connections: [] - - rid: 8805856136597078237 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078166 - m_Connections: - - rid: 8805856136597078199 - - rid: 8805856136597078238 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078166 - m_Connections: [] - - rid: 8805856136597078239 + - rid: 8805856269227524952 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2626,29 +1935,80 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078317 + rid: 8805856269227525003 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078240 + rid: 8805856269227524994 + - rid: 8805856269227524953 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: InputPort m_PortDataFlowType: 0 - m_IsFloating: 0 + m_IsFloating: 1 m_NodeModel: - rid: 8805856136597078167 + rid: 8805856269227524897 m_Connections: - - rid: 8805856136597078201 - - rid: 8805856136597078241 + - rid: 8805856269227524958 + - rid: 8805856269227524954 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078167 - m_Connections: [] - - rid: 8805856136597078242 + rid: 8805856269227524897 + m_Connections: + - rid: 8805856269227524962 + - rid: 8805856269227524955 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524898 + m_Connections: + - rid: 8805856269227524959 + - rid: 8805856269227524956 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524898 + m_Connections: + - rid: 8805856269227524970 + - rid: 8805856269227524957 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524899 + m_Connections: + - rid: 8805856269227524943 + - rid: 8805856269227524958 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: True + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524899 + m_Connections: + - rid: 8805856269227524953 + - rid: 8805856269227524959 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: False + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524899 + m_Connections: + - rid: 8805856269227524955 + - rid: 8805856269227524960 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2656,92 +2016,173 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078318 + rid: 8805856269227525004 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078243 + rid: 8805856269227524994 + - rid: 8805856269227524961 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: Tag + FieldName: Pattern Type: - m_SerializableType: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078319 + rid: 8805856269227525005 LinkedVariable: rid: -2 - - rid: 8805856136597078244 + - rid: 8805856269227524962 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524900 + m_Connections: + - rid: 8805856269227524954 + - rid: 8805856269227524963 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524900 + m_Connections: [] + - rid: 8805856269227524964 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: MinRange + FieldName: Pattern Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078320 + rid: 8805856269227525006 LinkedVariable: rid: -2 - - rid: 8805856136597078245 + - rid: 8805856269227524965 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: MaxRange + FieldName: Target Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 + m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078321 + rid: 8805856269227525007 + LinkedVariable: + rid: 8805856269227524994 + - rid: 8805856269227524966 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524901 + m_Connections: + - rid: 8805856269227524971 + - rid: 8805856269227524967 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524901 + m_Connections: + - rid: 8805856269227524975 + - rid: 8805856269227524968 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524902 + m_Connections: + - rid: 8805856269227524972 + - rid: 8805856269227524969 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524902 + m_Connections: + - rid: 8805856269227524979 + - rid: 8805856269227524970 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524903 + m_Connections: + - rid: 8805856269227524956 + - rid: 8805856269227524971 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: True + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524903 + m_Connections: + - rid: 8805856269227524966 + - rid: 8805856269227524972 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: False + m_PortDataFlowType: 1 + m_IsFloating: 1 + m_NodeModel: + rid: 8805856269227524903 + m_Connections: + - rid: 8805856269227524968 + - rid: 8805856269227524973 + type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + FieldName: Pattern + Type: + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + LocalValue: + rid: 8805856269227525008 LinkedVariable: rid: -2 - - rid: 8805856136597078246 + - rid: 8805856269227524975 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524904 + m_Connections: + - rid: 8805856269227524967 + - rid: 8805856269227524976 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524904 + m_Connections: [] + - rid: 8805856269227524977 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: - FieldName: SelectionMode + FieldName: Pattern Type: - m_SerializableType: DistanceTargetSelectionMode, Colosseum.Game, Version=0.0.0.0, + m_SerializableType: Colosseum.AI.BossPatternData, Colosseum.Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078322 + rid: 8805856269227525010 LinkedVariable: rid: -2 - - rid: 8805856136597078247 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078168 - m_Connections: - - rid: 8805856136597078201 - - rid: 8805856136597078248 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078168 - m_Connections: [] - - rid: 8805856136597078249 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078169 - m_Connections: - - rid: 8805856136597078201 - - rid: 8805856136597078250 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078169 - m_Connections: [] - - rid: 8805856136597078251 + - rid: 8805856269227524978 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2749,29 +2190,51 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078323 + rid: 8805856269227525011 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078252 + rid: 8805856269227524994 + - rid: 8805856269227524979 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: InputPort m_PortDataFlowType: 0 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078170 + rid: 8805856269227524905 m_Connections: - - rid: 8805856136597078203 - - rid: 8805856136597078253 + - rid: 8805856269227524969 + - rid: 8805856269227524980 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078170 + rid: 8805856269227524905 + m_Connections: + - rid: 8805856269227524981 + - rid: 8805856269227524984 + - rid: 8805856269227524987 + - rid: 8805856269227524981 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: InputPort + m_PortDataFlowType: 0 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524906 + m_Connections: + - rid: 8805856269227524980 + - rid: 8805856269227524982 + type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + data: + m_Name: OutputPort + m_PortDataFlowType: 1 + m_IsFloating: 0 + m_NodeModel: + rid: 8805856269227524906 m_Connections: [] - - rid: 8805856136597078254 + - rid: 8805856269227524983 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2779,29 +2242,29 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078324 + rid: 8805856269227525012 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078255 + rid: 8805856269227524994 + - rid: 8805856269227524984 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: InputPort m_PortDataFlowType: 0 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078171 + rid: 8805856269227524907 m_Connections: - - rid: 8805856136597078203 - - rid: 8805856136597078256 + - rid: 8805856269227524980 + - rid: 8805856269227524985 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078171 + rid: 8805856269227524907 m_Connections: [] - - rid: 8805856136597078257 + - rid: 8805856269227524986 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2809,29 +2272,29 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078325 + rid: 8805856269227525013 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078258 + rid: 8805856269227524994 + - rid: 8805856269227524987 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: InputPort m_PortDataFlowType: 0 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078172 + rid: 8805856269227524908 m_Connections: - - rid: 8805856136597078203 - - rid: 8805856136597078259 + - rid: 8805856269227524980 + - rid: 8805856269227524988 type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: m_Name: OutputPort m_PortDataFlowType: 1 m_IsFloating: 0 m_NodeModel: - rid: 8805856136597078172 + rid: 8805856269227524908 m_Connections: [] - - rid: 8805856136597078260 + - rid: 8805856269227524989 type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} data: FieldName: Target @@ -2839,468 +2302,26 @@ MonoBehaviour: m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null LocalValue: - rid: 8805856136597078326 + rid: 8805856269227525014 LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078261 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + rid: 8805856269227524994 + - rid: 8805856269227524990 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078173 - m_Connections: - - rid: 8805856136597078203 - - rid: 8805856136597078262 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2} + - rid: 8805856269227524992 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078173 - m_Connections: [] - - rid: 8805856136597078263 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078174 - m_Connections: - - rid: 8805856136597078203 - - rid: 8805856136597078264 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078174 - m_Connections: [] - - rid: 8805856136597078265 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078175 - m_Connections: - - rid: 8805856136597078203 - - rid: 8805856136597078266 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078175 - m_Connections: [] - - rid: 8805856136597078267 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078327 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078268 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078176 - m_Connections: - - rid: 8805856136597078205 - - rid: 8805856136597078269 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078176 - m_Connections: [] - - rid: 8805856136597078270 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078328 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078271 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078177 - m_Connections: - - rid: 8805856136597078205 - - rid: 8805856136597078272 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078177 - m_Connections: [] - - rid: 8805856136597078273 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078329 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078274 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078178 - m_Connections: - - rid: 8805856136597078205 - - rid: 8805856136597078275 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078178 - m_Connections: [] - - rid: 8805856136597078276 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078330 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078277 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078179 - m_Connections: - - rid: 8805856136597078205 - - rid: 8805856136597078278 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078179 - m_Connections: [] - - rid: 8805856136597078279 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078180 - m_Connections: - - rid: 8805856136597078205 - - rid: 8805856136597078280 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078180 - m_Connections: [] - - rid: 8805856136597078281 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078331 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078282 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078181 - m_Connections: - - rid: 8805856136597078207 - - rid: 8805856136597078283 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078181 - m_Connections: [] - - rid: 8805856136597078284 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078332 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078285 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078182 - m_Connections: - - rid: 8805856136597078207 - - rid: 8805856136597078286 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078182 - m_Connections: [] - - rid: 8805856136597078287 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078333 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078288 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078183 - m_Connections: - - rid: 8805856136597078207 - - rid: 8805856136597078289 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078183 - m_Connections: [] - - rid: 8805856136597078290 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078334 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078291 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078184 - m_Connections: - - rid: 8805856136597078207 - - rid: 8805856136597078292 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078184 - m_Connections: [] - - rid: 8805856136597078293 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078185 - m_Connections: - - rid: 8805856136597078207 - - rid: 8805856136597078294 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078185 - m_Connections: [] - - rid: 8805856136597078295 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078335 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078296 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078186 - m_Connections: - - rid: 8805856136597078209 - - rid: 8805856136597078297 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078186 - m_Connections: [] - - rid: 8805856136597078298 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078336 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078299 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078187 - m_Connections: - - rid: 8805856136597078209 - - rid: 8805856136597078300 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078187 - m_Connections: [] - - rid: 8805856136597078301 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078337 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078302 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: InputPort - m_PortDataFlowType: 0 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078188 - m_Connections: - - rid: 8805856136597078209 - - rid: 8805856136597078303 - type: {class: PortModel, ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} - data: - m_Name: OutputPort - m_PortDataFlowType: 1 - m_IsFloating: 0 - m_NodeModel: - rid: 8805856136597078188 - m_Connections: [] - - rid: 8805856136597078304 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Target - Type: - m_SerializableType: UnityEngine.GameObject, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - LocalValue: - rid: 8805856136597078338 - LinkedVariable: - rid: 8805856136597078308 - - rid: 8805856136597078305 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: Speed - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - LocalValue: - rid: 8805856136597078339 - LinkedVariable: - rid: -2 - - rid: 8805856136597078306 - type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} - data: - FieldName: StopDistance - Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - LocalValue: - rid: 8805856136597078340 - LinkedVariable: - rid: -2 - - rid: 8805856136597078307 + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2} + - rid: 8805856269227524993 type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: @@ -3308,7 +2329,7 @@ MonoBehaviour: m_Value1: 0 Name: m_Value: {fileID: 0} - - rid: 8805856136597078308 + - rid: 8805856269227524994 type: {class: 'TypedVariableModel`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior.GraphFramework, asm: Unity.Behavior.GraphFramework} data: ID: @@ -3318,7 +2339,31 @@ MonoBehaviour: IsExposed: 1 m_IsShared: 0 m_Value: {fileID: 0} - - rid: 8805856136597078309 + - rid: 8805856269227524995 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2} + - rid: 8805856269227524997 + type: {class: 'BlackboardVariable`1[[System.Int32, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: 2 + - rid: 8805856269227524998 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2} + - rid: 8805856269227524999 type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: @@ -3326,7 +2371,31 @@ MonoBehaviour: m_Value1: 0 Name: m_Value: {fileID: 0} - - rid: 8805856136597078310 + - rid: 8805856269227525000 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5e732b41722c45288bb6234f3e3fa638, type: 2} + - rid: 8805856269227525001 + type: {class: 'BlackboardVariable`1[[System.Int32, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: 3 + - rid: 8805856269227525002 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5e732b41722c45288bb6234f3e3fa638, type: 2} + - rid: 8805856269227525003 type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: @@ -3334,7 +2403,7 @@ MonoBehaviour: m_Value1: 0 Name: m_Value: {fileID: 0} - - rid: 8805856136597078311 + - rid: 8805856269227525004 type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: @@ -3342,7 +2411,101 @@ MonoBehaviour: m_Value1: 0 Name: m_Value: {fileID: 0} - - rid: 8805856136597078312 + - rid: 8805856269227525005 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5efd8123be76bf844875d386d9d5f73d, type: 2} + - rid: 8805856269227525006 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 5efd8123be76bf844875d386d9d5f73d, type: 2} + - rid: 8805856269227525007 + type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 0} + - rid: 8805856269227525008 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 9f7ab8078af64fd9a6ff4c9ce6aa9d3a, type: 2} + - rid: 8805856269227525010 + type: {class: 'BlackboardVariable`1[[Colosseum.AI.BossPatternData, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 11400000, guid: 9f7ab8078af64fd9a6ff4c9ce6aa9d3a, type: 2} + - rid: 8805856269227525011 + type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 0} + - rid: 8805856269227525012 + type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 0} + - rid: 8805856269227525013 + type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 0} + - rid: 8805856269227525014 + type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} + data: + GUID: + m_Value0: 0 + m_Value1: 0 + Name: + m_Value: {fileID: 0} + - rid: 8805856269227525058 + type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + FieldName: Speed + Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + LocalValue: + rid: 8805856269227525060 + LinkedVariable: + rid: -2 + - rid: 8805856269227525059 + type: {class: BehaviorGraphNodeModel/FieldModel, ns: Unity.Behavior, asm: Unity.Behavior.Authoring} + data: + FieldName: StopDistance + Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + LocalValue: + rid: 8805856269227525061 + LinkedVariable: + rid: -2 + - rid: 8805856269227525060 type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: @@ -3350,223 +2513,7 @@ MonoBehaviour: m_Value1: 0 Name: m_Value: 0 - - rid: 8805856136597078313 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078314 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078315 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078316 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078317 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078318 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078319 - type: {class: 'BlackboardVariable`1[[System.String, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: Player - - rid: 8805856136597078320 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078321 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 20 - - rid: 8805856136597078322 - type: {class: 'BlackboardVariable`1[[DistanceTargetSelectionMode, Colosseum.Game]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 1 - - rid: 8805856136597078323 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078324 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078325 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078326 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078327 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078328 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078329 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078330 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078331 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078332 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078333 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078334 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078335 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078336 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078337 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078338 - type: {class: 'BlackboardVariable`1[[UnityEngine.GameObject, UnityEngine.CoreModule]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: {fileID: 0} - - rid: 8805856136597078339 - type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} - data: - GUID: - m_Value0: 0 - m_Value1: 0 - Name: - m_Value: 0 - - rid: 8805856136597078340 + - rid: 8805856269227525061 type: {class: 'BlackboardVariable`1[[System.Single, mscorlib]]', ns: Unity.Behavior, asm: Unity.Behavior} data: GUID: diff --git a/Assets/_Game/Prefabs/Bosses/Prefab_Boss_Drog.prefab b/Assets/_Game/Prefabs/Bosses/Prefab_Boss_Drog.prefab index 184c6b69..a2189d28 100644 --- a/Assets/_Game/Prefabs/Bosses/Prefab_Boss_Drog.prefab +++ b/Assets/_Game/Prefabs/Bosses/Prefab_Boss_Drog.prefab @@ -2001,7 +2001,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 860882280 + GlobalObjectIdHash: 223369646 InScenePlacedSourceGlobalObjectIdHash: 223369646 DeferredDespawnTick: 0 Ownership: 1 @@ -2030,11 +2030,13 @@ MonoBehaviour: characterStats: {fileID: -5454809204868423215} animator: {fileID: 4019041888965840580} navMeshAgent: {fileID: 5153439431748782209} + abnormalityManager: {fileID: 0} enemyData: {fileID: 11400000, guid: f21773b42c60c4b40b609966f09146aa, type: 2} useThreatSystem: 1 damageThreatMultiplier: 1 threatDecayPerSecond: 0 retargetThreshold: 0 + shieldStateAbnormality: {fileID: 0} phases: [] initialBehaviorGraph: {fileID: -3933356984444701103, guid: 9ade9280028e9da4aa0151fe8e9ec454, type: 2} phaseTransitionInvincibilityTime: 2 @@ -2185,23 +2187,26 @@ MonoBehaviour: bossEnemy: {fileID: 6949205239376088310} enemyBase: {fileID: 6949205239376088310} skillController: {fileID: 8818883032728065057} + abnormalityManager: {fileID: 0} navMeshAgent: {fileID: 5153439431748782209} - mainPattern: {fileID: 11400000, guid: 5efd8123be76bf844875d386d9d5f73d, type: 2} - slamPattern: {fileID: 11400000, guid: 4a52d59d590b4eaa9ef92b7984eb08c7, type: 2} - leapPattern: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2} + behaviorGraphAgent: {fileID: 0} + primaryPattern: {fileID: 11400000, guid: 5efd8123be76bf844875d386d9d5f73d, type: 2} + secondaryPattern: {fileID: 11400000, guid: 4a52d59d590b4eaa9ef92b7984eb08c7, type: 2} + mobilityPattern: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2} utilityPattern: {fileID: 11400000, guid: 9f7ab8078af64fd9a6ff4c9ce6aa9d3a, type: 2} - downPunishPattern: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2} + comboPattern: {fileID: 0} + punishPattern: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2} signaturePattern: {fileID: 11400000, guid: 5e732b41722c45288bb6234f3e3fa638, type: 2} phase2HealthThreshold: 0.75 phase3HealthThreshold: 0.4 - targetRefreshInterval: 0.2 - leapDistanceThreshold: 8 - downPunishSearchRadius: 6 + primaryTargetRefreshInterval: 0.2 + mobilityTriggerDistance: 8 + punishSearchRadius: 6 utilityTriggerDistance: 5 - phase1SlamInterval: 3 - phase2SlamInterval: 2 - phase3SlamInterval: 2 - signatureMinPhase: 2 + phase1SecondaryInterval: 3 + phase2SecondaryInterval: 2 + phase3SecondaryInterval: 2 + basicLoopMinCountAfterBigPattern: 2 signatureRequiredDamageRatio: 0.1 signatureTelegraphAbnormality: {fileID: 11400000, guid: fb1a782e44ff4dc19fd8b3c633360752, type: 2} signatureSuccessStaggerDuration: 2 diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/BossPatternActionBase.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/BossPatternActionBase.cs index 7e03e99e..71846a1b 100644 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/BossPatternActionBase.cs +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/BossPatternActionBase.cs @@ -210,6 +210,13 @@ public abstract partial class BossPatternActionBase : Action skillTarget = ResolveStepTarget(activeTarget); if (skillTarget == null) { + if (activePattern != null && activePattern.SkipJumpStepOnNoTarget) + { + UsePatternAction.MarkPatternUsed(GameObject, activePattern); + LogDebug($"점프 대상 없음, 조합 패턴 조기 종료: {activePattern.PatternName}"); + return Status.Success; + } + LogDebug($"점프 타겟을 찾지 못해 실패: {activePattern.PatternName}"); return Status.Failure; } diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs deleted file mode 100644 index cac0d366..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 기동 패턴 준비 여부를 확인하는 체크 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Check Mobility Pattern Ready", - story: "기동 패턴 준비 여부 확인", - category: "Action", - id: "5b4f133ba50f46759c1c1d3347eb0b0d")] -public partial class CheckMobilityPatternReadyAction : CheckPatternReadyActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Mobility; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs.meta deleted file mode 100644 index 079dbf5d..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckMobilityPatternReadyAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 489f56d9043e6d24fbe8e5574b6729be \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs deleted file mode 100644 index 7c069ab3..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; - -using Colosseum.AI; -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -using Action = Unity.Behavior.Action; - -/// -/// 지정된 공통 패턴 역할의 준비 여부를 확인하는 체크 액션 기반 클래스입니다. -/// -[Serializable, GeneratePropertyBag] -public abstract partial class CheckPatternReadyActionBase : Action -{ - /// - /// 현재 액션이 검사할 패턴 역할입니다. - /// - protected abstract BossCombatPatternRole PatternRole { get; } - - protected override Status OnStart() - { - BossCombatBehaviorContext context = GameObject.GetComponent(); - if (context == null) - return Status.Failure; - - if (context.IsBehaviorSuppressed) - return Status.Failure; - - BossPatternData pattern = context.GetPattern(PatternRole); - if (pattern == null) - return Status.Failure; - - if (context.CurrentPatternPhase < pattern.MinPhase) - return Status.Failure; - - return UsePatternAction.IsPatternReady(GameObject, pattern) ? Status.Success : Status.Failure; - } -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs.meta deleted file mode 100644 index 50b6f0f6..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 59a58b1d5cc33f943a1af10764ee11b5 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs deleted file mode 100644 index cec1c3a0..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 기본 패턴 준비 여부를 확인하는 체크 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Check Primary Pattern Ready", - story: "기본 패턴 준비 여부 확인", - category: "Action", - id: "88626617015e43ef97ea4dd05cce55e0")] -public partial class CheckPrimaryPatternReadyAction : CheckPatternReadyActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Primary; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs.meta deleted file mode 100644 index e870a180..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPrimaryPatternReadyAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: e3b45dc2b81beac44a35a3a6545c0488 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs deleted file mode 100644 index 32de2a02..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 징벌 패턴 준비 여부를 확인하는 체크 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Check Punish Pattern Ready", - story: "징벌 패턴 준비 여부 확인", - category: "Action", - id: "e855b3f8bdce44efa85859358d67c7a7")] -public partial class CheckPunishPatternReadyAction : CheckPatternReadyActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Punish; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs.meta deleted file mode 100644 index 176ff300..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPunishPatternReadyAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 2211d1182dbbf7741b0058718afae162 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs deleted file mode 100644 index 2a031f35..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 보조 패턴 준비 여부를 확인하는 체크 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Check Secondary Pattern Ready", - story: "보조 패턴 준비 여부 확인", - category: "Action", - id: "72d4626f97fe4de4aedfda612961957f")] -public partial class CheckSecondaryPatternReadyAction : CheckPatternReadyActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Secondary; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs.meta deleted file mode 100644 index f7bd368a..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternReadyAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: e155d7ca234bf8148bef34617a3a8739 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs deleted file mode 100644 index 3e90e61e..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -using Action = Unity.Behavior.Action; - -/// -/// 현재 근접 패턴 차례가 보조 패턴인지 확인하는 공통 체크 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Check Secondary Pattern Turn", - story: "현재 근접 패턴 차례가 보조 패턴인지 확인", - category: "Action", - id: "e85477bd25894248aeeea8b41efc7f48")] -public partial class CheckSecondaryPatternTurnAction : Action -{ - protected override Status OnStart() - { - BossCombatBehaviorContext context = GameObject.GetComponent(); - return context != null && context.IsNextSecondaryPattern() ? Status.Success : Status.Failure; - } -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs.meta deleted file mode 100644 index c1258b5c..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSecondaryPatternTurnAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 435950077eea65d43beb6bfaba38dc60 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs deleted file mode 100644 index ba910dd8..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -using Action = Unity.Behavior.Action; - -/// -/// 시그니처 패턴 사용 가능 여부를 확인하는 체크 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Check Signature Pattern Ready", - story: "시그니처 패턴 준비 여부 확인", - category: "Action", - id: "b3b2916257134e0eb3a71a5f544a8d6f")] -public partial class CheckSignaturePatternReadyAction : Action -{ - protected override Status OnStart() - { - BossCombatBehaviorContext context = GameObject.GetComponent(); - if (context != null && context.IsBehaviorSuppressed) - return Status.Failure; - - return context != null && context.IsSignaturePatternReady() - ? Status.Success - : Status.Failure; - } -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs.meta deleted file mode 100644 index 22e49f9d..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckSignaturePatternReadyAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: b27f3137292d5704d802b5cfb58037e4 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs deleted file mode 100644 index de5137aa..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; -using UnityEngine; - -using Action = Unity.Behavior.Action; - -/// -/// 현재 타겟이 보스의 공격 사거리 안에 있는지 확인하는 공통 체크 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Check Target In Attack Range", - story: "[Target]이 보스 공격 사거리 안에 있는지 확인", - category: "Action", - id: "16821bba281d49f699d1ac9ec613dcce")] -public partial class CheckTargetInAttackRangeAction : Action -{ - [SerializeReference] - public BlackboardVariable Target; - - protected override Status OnStart() - { - if (Target?.Value == null) - return Status.Failure; - - EnemyBase enemyBase = GameObject.GetComponent(); - float attackRange = enemyBase != null && enemyBase.Data != null ? enemyBase.Data.AttackRange : 2f; - float distance = Vector3.Distance(GameObject.transform.position, Target.Value.transform.position); - return distance <= attackRange + 0.25f ? Status.Success : Status.Failure; - } -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs.meta deleted file mode 100644 index db814576..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckTargetInAttackRangeAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 5b3844411f6dd784089c40c5d4325b45 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs deleted file mode 100644 index 1d33296c..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -using Action = Unity.Behavior.Action; - -/// -/// 공통 원거리 견제 패턴의 준비 여부를 확인합니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription(name: "Check Utility Pattern Ready", story: "원거리 견제 패턴 준비 완료", category: "Action", id: "e3a3f4bd4f214efc873109631e5195db")] -public partial class CheckUtilityPatternReadyAction : CheckPatternReadyActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Utility; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs.meta deleted file mode 100644 index 973796cb..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckUtilityPatternReadyAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 15de0eb23ee195a42a07c23c18f9fa9a \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs deleted file mode 100644 index 43528456..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 기동 패턴을 실행하는 공통 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Use Mobility Pattern", - story: "기동 패턴 실행", - category: "Action", - id: "bb19ca5ae11a4d9586180f7cba9f76cc")] -public partial class UseMobilityPatternAction : UsePatternRoleActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Mobility; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs.meta deleted file mode 100644 index 0b8c90b0..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseMobilityPatternAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 137700b0db09e724899700f0da861132 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs new file mode 100644 index 00000000..a84b2e5b --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs @@ -0,0 +1,153 @@ +using System; + +using Colosseum.AI; +using Colosseum.Enemy; + +using Unity.Behavior; +using Unity.Properties; +using UnityEngine; + +/// +/// 지정된 패턴을 실행하는 범용 액션 노드입니다. +/// Pattern 필드에 BossPatternData 에셋을 직접 할당합니다. +/// 타겟 해석과 등록은 Condition에서 처리되므로, 이 액션은 순수하게 패턴만 실행합니다. +/// 시그니처 패턴은 내부적으로 TryStartSignaturePattern 경로를 사용합니다. +/// +[Serializable, GeneratePropertyBag] +[NodeDescription( + name: "Use Pattern By Role", + story: "[Pattern] 패턴 실행", + category: "Action", + id: "b2c3d4e5-1111-2222-3333-555566667777")] +public partial class UsePatternByRoleAction : BossPatternActionBase +{ + [SerializeReference] + [Tooltip("실행할 패턴")] + public BlackboardVariable Pattern; + + /// + /// 시그니처 패턴 실행 상태 추적 + /// + private bool signatureStarted; + + protected override Status OnStart() + { + BossPatternData pattern = Pattern?.Value; + if (pattern == null) + return Status.Failure; + + if (pattern.IsSignature) + return StartSignaturePattern(); + + // 타겟 해석은 ResolveStepTarget에서 처리됨 + // 여기서는 RegisterPatternUse만 호출 (근접 패턴 전용) + if (pattern.IsMelee) + { + BossCombatBehaviorContext context = GameObject.GetComponent(); + context?.RegisterPatternUse(pattern); + } + + // base.OnStart는 TryResolvePattern → ExecuteCurrentStep 호출 + return base.OnStart(); + } + + protected override Status OnUpdate() + { + BossPatternData pattern = Pattern?.Value; + if (pattern == null) + return Status.Failure; + + if (pattern.IsSignature) + return UpdateSignaturePattern(); + + return base.OnUpdate(); + } + + protected override void OnEnd() + { + if (signatureStarted) + { + signatureStarted = false; + return; + } + + base.OnEnd(); + } + + /// + /// 시그니처 패턴 시작 + /// + private Status StartSignaturePattern() + { + BossCombatBehaviorContext context = GameObject.GetComponent(); + if (context == null) + return Status.Failure; + + GameObject target = Target != null ? Target.Value : null; + signatureStarted = context.TryStartSignaturePattern(target); + return signatureStarted ? Status.Running : Status.Failure; + } + + /// + /// 시그니처 패턴 업데이트 + /// + private Status UpdateSignaturePattern() + { + if (!signatureStarted) + return Status.Failure; + + BossCombatBehaviorContext context = GameObject.GetComponent(); + if (context == null) + return Status.Failure; + + return context.IsSignaturePatternActive + ? Status.Running + : Status.Success; + } + + /// + /// BossPatternActionBase.TryResolvePattern 구현. + /// Condition에서 이미 타겟을 해석했으므로, Target.Value를 그대로 사용합니다. + /// + protected override bool TryResolvePattern(out BossPatternData pattern, out GameObject target) + { + pattern = Pattern?.Value; + target = Target != null ? Target.Value : null; + + if (pattern == null) + return false; + + if (!UsePatternAction.IsPatternReady(GameObject, pattern)) + return false; + + if (target == null) + return false; + + return true; + } + + protected override GameObject ResolveStepTarget(GameObject fallbackTarget) + { + BossPatternData pattern = Pattern?.Value; + if (pattern == null) + return base.ResolveStepTarget(fallbackTarget); + + BossCombatBehaviorContext context = GameObject.GetComponent(); + if (context == null) + return base.ResolveStepTarget(fallbackTarget); + + TargetResolveMode targetMode = pattern.TargetMode; + + if (targetMode == TargetResolveMode.Mobility) + return context.IsValidMobilityTarget(fallbackTarget) + ? fallbackTarget + : context.FindMobilityTarget(); + + if (targetMode == TargetResolveMode.Utility) + return context.IsValidUtilityTarget(fallbackTarget) + ? fallbackTarget + : context.FindUtilityTarget(); + + return base.ResolveStepTarget(fallbackTarget); + } +} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs.meta new file mode 100644 index 00000000..f036e01a --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternByRoleAction.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 330e28c06aa715a4999a2ac322ee7748 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs deleted file mode 100644 index 86d2477f..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; - -using Colosseum.AI; -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; -using UnityEngine; - -/// -/// 지정된 공통 패턴 역할을 실행하는 액션 기반 클래스입니다. -/// -[Serializable, GeneratePropertyBag] -public abstract partial class UsePatternRoleActionBase : BossPatternActionBase -{ - /// - /// 현재 액션이 실행할 공통 패턴 역할입니다. - /// - protected abstract BossCombatPatternRole PatternRole { get; } - - protected override bool TryResolvePattern(out BossPatternData pattern, out GameObject target) - { - BossCombatBehaviorContext context = GameObject.GetComponent(); - pattern = context != null ? context.GetPattern(PatternRole) : null; - target = Target != null ? Target.Value : null; - - if (pattern == null || !UsePatternAction.IsPatternReady(GameObject, pattern)) - return false; - - if (target == null && PatternRole.IsMeleeRole()) - target = ResolvePrimaryTarget(); - - if (target == null && PatternRole == BossCombatPatternRole.Mobility) - target = context != null ? context.FindMobilityTarget() : null; - - if (target == null && PatternRole == BossCombatPatternRole.Utility) - target = context != null ? context.FindUtilityTarget() : null; - - if (target == null) - return false; - - if (PatternRole.IsMeleeRole() && context != null) - context.RegisterPatternUse(PatternRole); - - return true; - } - - protected override GameObject ResolveStepTarget(GameObject fallbackTarget) - { - BossCombatBehaviorContext context = GameObject.GetComponent(); - if (PatternRole == BossCombatPatternRole.Mobility && context != null) - { - return context.IsValidMobilityTarget(fallbackTarget) - ? fallbackTarget - : context.FindMobilityTarget(); - } - - if (PatternRole == BossCombatPatternRole.Utility && context != null) - { - return context.IsValidUtilityTarget(fallbackTarget) - ? fallbackTarget - : context.FindUtilityTarget(); - } - - return base.ResolveStepTarget(fallbackTarget); - } -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs.meta deleted file mode 100644 index bf61d208..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePatternRoleActionBase.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 33384929fd7ec3c4f9240ac748de185c \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs deleted file mode 100644 index f6bf79f4..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 기본 패턴을 실행하는 공통 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Use Primary Pattern", - story: "기본 패턴 실행", - category: "Action", - id: "45d71c690f6342bcbbd348b6df5b77f1")] -public partial class UsePrimaryPatternAction : UsePatternRoleActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Primary; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs.meta deleted file mode 100644 index a75ed8fa..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePrimaryPatternAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 2d8de0b13ad776845a14b35e16485f53 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs deleted file mode 100644 index 785aaa19..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 징벌 패턴을 실행하는 공통 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Use Punish Pattern", - story: "징벌 패턴 실행", - category: "Action", - id: "55f3c204a22b42dca6ae96e555f11a70")] -public partial class UsePunishPatternAction : UsePatternRoleActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Punish; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs.meta deleted file mode 100644 index f8b684ef..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UsePunishPatternAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 16cef0dbbe7946d46b3021b0c1802669 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs deleted file mode 100644 index 19b4b796..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 보조 패턴을 실행하는 공통 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Use Secondary Pattern", - story: "보조 패턴 실행", - category: "Action", - id: "5169d341ce0c4400ae7fa3b58dde5b7a")] -public partial class UseSecondaryPatternAction : UsePatternRoleActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Secondary; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs.meta deleted file mode 100644 index 8f2c03c7..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSecondaryPatternAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 79cd3375939c8a244bad9d8e1f02a45d \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs deleted file mode 100644 index ccea4b0c..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; -using UnityEngine; - -using Action = Unity.Behavior.Action; - -/// -/// 보스 공통 시그니처 패턴을 실행하는 액션입니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription( - name: "Use Signature Pattern", - story: "시그니처 패턴 실행", - category: "Action", - id: "178f8888d56042c6a75b4d6ee8a7a7d4")] -public partial class UseSignaturePatternAction : Action -{ - [SerializeReference] - public BlackboardVariable Target; - - private BossCombatBehaviorContext combatBehaviorContext; - private bool started; - - protected override Status OnStart() - { - combatBehaviorContext = GameObject.GetComponent(); - if (combatBehaviorContext == null) - return Status.Failure; - - GameObject target = Target != null ? Target.Value : null; - started = combatBehaviorContext.TryStartSignaturePattern(target); - return started ? Status.Running : Status.Failure; - } - - protected override Status OnUpdate() - { - if (!started || combatBehaviorContext == null) - return Status.Failure; - - return combatBehaviorContext.IsSignaturePatternActive - ? Status.Running - : Status.Success; - } - - protected override void OnEnd() - { - started = false; - combatBehaviorContext = null; - } -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs.meta deleted file mode 100644 index 890aa5b0..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseSignaturePatternAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 0680aed4d244d7844918883e06e718d5 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs deleted file mode 100644 index f32bfa99..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -using Colosseum.Enemy; - -using Unity.Behavior; -using Unity.Properties; - -/// -/// 공통 원거리 견제 패턴을 실행합니다. -/// -[Serializable, GeneratePropertyBag] -[NodeDescription(name: "Use Utility Pattern", story: "원거리 견제 패턴 실행", category: "Action", id: "f29d4556f2d04f6bb80418f9f9fe2c68")] -public partial class UseUtilityPatternAction : UsePatternRoleActionBase -{ - protected override BossCombatPatternRole PatternRole => BossCombatPatternRole.Utility; -} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs.meta deleted file mode 100644 index f01e91da..00000000 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseUtilityPatternAction.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 36c98678f964a7447bede88fedc04561 \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs new file mode 100644 index 00000000..236f4dce --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs @@ -0,0 +1,38 @@ +using System; + +using Colosseum.AI; + +using Unity.Behavior; +using Unity.Properties; +using UnityEngine; + +using Condition = Unity.Behavior.Condition; + +namespace Colosseum.AI.BehaviorActions.Conditions +{ + /// + /// 지정된 패턴이 준비되었는지 확인하는 범용 조건 노드입니다. + /// Pattern 필드에 BossPatternData 에셋을 직접 할당합니다. + /// + [Serializable, GeneratePropertyBag] + [Condition(name: "Check Pattern Ready", story: "[Pattern] 패턴이 준비되었는가?", id: "a1b2c3d4-1111-2222-3333-444455556666")] + [NodeDescription( + name: "Check Pattern Ready", + story: "Check [Pattern] pattern ready", + category: "Condition/Pattern")] + public partial class CheckPatternReadyCondition : Condition + { + [SerializeReference] + [Tooltip("준비 여부를 확인할 패턴")] + public BlackboardVariable Pattern; + + public override bool IsTrue() + { + BossPatternData pattern = Pattern?.Value; + if (pattern == null) + return false; + + return PatternReadyHelper.IsPatternReady(GameObject, pattern); + } + } +} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs.meta new file mode 100644 index 00000000..f0759ac8 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/CheckPatternReadyCondition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b1a4d12e73d0f4a40a3a1d5a9c1fce6e \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs new file mode 100644 index 00000000..90b65e5d --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs @@ -0,0 +1,63 @@ +using System; + +using Colosseum.Combat; +using Colosseum.Player; + +using Unity.Behavior; +using Unity.Properties; +using UnityEngine; + +using Condition = Unity.Behavior.Condition; + +namespace Colosseum.AI.BehaviorActions.Conditions +{ + /// + /// 다운된 적대 대상이 지정 반경 이내에 존재하는지 확인합니다. + /// 징벌(Punish) 패턴의 전제 조건으로 사용됩니다. + /// + [Serializable, GeneratePropertyBag] + [Condition(name: "Downed Target In Range", story: "다운된 대상이 [{SearchRadius}]m 이내에 있는가?", id: "d4e5f6a7-3333-4444-555566667777")] + [NodeDescription( + name: "Downed Target In Range", + story: "Downed target within [{SearchRadius}]m", + category: "Condition/Pattern")] + public partial class IsDownedTargetInRangeCondition : Condition + { + [Min(0f)] + [Tooltip("다운된 대상을 탐색할 최대 반경")] + [SerializeField] + private float searchRadius = 6f; + + public override bool IsTrue() + { + HitReactionController[] controllers = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None); + + for (int i = 0; i < controllers.Length; i++) + { + HitReactionController controller = controllers[i]; + if (controller == null || !controller.IsDowned) + continue; + + GameObject candidate = controller.gameObject; + if (candidate == null || !candidate.activeInHierarchy) + continue; + + if (candidate == GameObject) + continue; + + if (Team.IsSameTeam(GameObject, candidate)) + continue; + + IDamageable damageable = candidate.GetComponent(); + if (damageable != null && damageable.IsDead) + continue; + + float distance = Vector3.Distance(GameObject.transform.position, candidate.transform.position); + if (distance <= searchRadius) + return true; + } + + return false; + } + } +} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs.meta new file mode 100644 index 00000000..2971babd --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsDownedTargetInRangeCondition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bc4fae13a78a0fb46863950d1c6b5b8d \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs new file mode 100644 index 00000000..80381441 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs @@ -0,0 +1,39 @@ +using System; + +using Colosseum.Enemy; + +using Unity.Behavior; +using Unity.Properties; +using UnityEngine; + +using Condition = Unity.Behavior.Condition; + +namespace Colosseum.AI.BehaviorActions.Conditions +{ + /// + /// 현재 보스 페이즈가 지정된 최소 페이즈 이상인지 확인하는 조건 노드입니다. + /// 패턴의 Phase 진입 조건을 BT에서 시각적으로 확인할 수 있습니다. + /// + [Serializable, GeneratePropertyBag] + [Condition(name: "Min Phase Satisfied", story: "현재 페이즈가 [MinPhase] 이상인가?", id: "e3f4a5b6-7777-8888-9999-ddddddddeeee")] + [NodeDescription( + name: "Min Phase Satisfied", + story: "현재 페이즈가 [MinPhase] 이상인가?", + category: "Condition/Phase")] + public partial class IsMinPhaseSatisfiedCondition : Condition + { + [SerializeReference] + [Tooltip("최소 요구 페이즈 (1=Phase 1부터)")] + public BlackboardVariable MinPhase; + + public override bool IsTrue() + { + int minPhase = MinPhase?.Value ?? 1; + if (minPhase <= 1) + return true; + + BossCombatBehaviorContext context = GameObject.GetComponent(); + return context != null && context.CurrentPatternPhase >= minPhase; + } + } +} \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs.meta new file mode 100644 index 00000000..1deea6fd --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsMinPhaseSatisfiedCondition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 46c95824ad6561f44833252a6f25852a \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs new file mode 100644 index 00000000..ee7342b7 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs @@ -0,0 +1,65 @@ +using System; +using System.Linq; + +using Colosseum.Combat; + +using Unity.Behavior; +using Unity.Properties; +using UnityEngine; + +using Condition = Unity.Behavior.Condition; + +namespace Colosseum.AI.BehaviorActions.Conditions +{ + /// + /// 지정 거리 이상 떨어진 적대 대상이 존재하는지 확인합니다. + /// 기동(도약) 또는 유틸리티(투척) 패턴의 전제 조건으로 사용됩니다. + /// + [Serializable, GeneratePropertyBag] + [Condition(name: "Target Beyond Distance", story: "[{MinDistance}]m 이상 떨어진 대상이 있는가?", id: "e5f6a7b8-4444-5555-666677778888")] + [NodeDescription( + name: "Target Beyond Distance", + story: "Target beyond [{MinDistance}]m exists", + category: "Condition/Pattern")] + public partial class IsTargetBeyondDistanceCondition : Condition + { + [Min(0f)] + [Tooltip("이 거리 이상 떨어진 대상이 있는지 확인")] + [SerializeField] + private float minDistance = 8f; + + public override bool IsTrue() + { + IDamageable[] targets = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None) + .OfType() + .ToArray(); + + for (int i = 0; i < targets.Length; i++) + { + IDamageable target = targets[i]; + if (target == null) + continue; + + Component component = target as Component; + if (component == null || !component.gameObject.activeInHierarchy) + continue; + + GameObject candidate = component.gameObject; + if (candidate == GameObject) + continue; + + if (Team.IsSameTeam(GameObject, candidate)) + continue; + + if (target.IsDead) + continue; + + float distance = Vector3.Distance(GameObject.transform.position, candidate.transform.position); + if (distance >= minDistance) + return true; + } + + return false; + } + } +} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs.meta new file mode 100644 index 00000000..e2993650 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetBeyondDistanceCondition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2e40fb41bbe354f4dafbe5b94fc6f9da \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs new file mode 100644 index 00000000..3a2bac81 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs @@ -0,0 +1,38 @@ +using System; + +using Colosseum.Enemy; + +using Unity.Behavior; +using Unity.Properties; +using UnityEngine; + +using Condition = Unity.Behavior.Condition; + +namespace Colosseum.AI.BehaviorActions.Conditions +{ + /// + /// 현재 타겟이 보스의 공격 사거리 안에 있는지 확인하는 조건 노드입니다. + /// + [Serializable, GeneratePropertyBag] + [Condition(name: "Is Target In Attack Range", story: "타겟이 공격 사거리 안에 있는가?", id: "57370b5b23f82a54dabc4f189a23286a")] + [NodeDescription( + name: "Is Target In Attack Range", + story: "Is [Target] in attack range", + category: "Condition/Combat")] + public partial class IsTargetInAttackRangeCondition : Condition + { + [SerializeReference] + public BlackboardVariable Target; + + public override bool IsTrue() + { + if (Target?.Value == null) + return false; + + EnemyBase enemyBase = GameObject.GetComponent(); + float attackRange = enemyBase != null && enemyBase.Data != null ? enemyBase.Data.AttackRange : 2f; + float distance = Vector3.Distance(GameObject.transform.position, Target.Value.transform.position); + return distance <= attackRange + 0.25f; + } + } +} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs.meta new file mode 100644 index 00000000..eec176f4 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/IsTargetInAttackRangeCondition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 57370b5b23f82a54dabc4f189a23286a \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs new file mode 100644 index 00000000..c4c8d7e2 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs @@ -0,0 +1,53 @@ +using UnityEngine; + +using Colosseum.AI; +using Colosseum.Enemy; + +namespace Colosseum.AI.BehaviorActions.Conditions +{ + /// + /// 패턴 준비 여부를 확인하는 공통 헬퍼 메서드를 제공합니다. + /// + public static class PatternReadyHelper + { + /// + /// 지정된 패턴이 현재 실행 가능한지 확인합니다. + /// 패턴의 특성 필드를 사용하여 grace period 등을 판단합니다. + /// + public static bool IsPatternReady(GameObject gameObject, BossPatternData pattern) + { + if (pattern == null) + return false; + + if (pattern.IsSignature) + return IsSignatureReady(gameObject); + + BossCombatBehaviorContext context = gameObject.GetComponent(); + if (context == null) + return false; + + if (context.IsBehaviorSuppressed) + return false; + + if (context.CurrentPatternPhase < pattern.MinPhase) + return false; + + if (!context.IsPatternGracePeriodAllowed(pattern)) + return false; + + return UsePatternAction.IsPatternReady(gameObject, pattern); + } + + /// + /// 시그니처 패턴 전용 준비 여부 확인. + /// + private static bool IsSignatureReady(GameObject gameObject) + { + BossCombatBehaviorContext context = gameObject.GetComponent(); + if (context == null) + return false; + + return context.IsSignaturePatternReady(); + } + } +} diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs.meta b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs.meta new file mode 100644 index 00000000..1c8012f0 --- /dev/null +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Conditions/PatternReadyHelper.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7a0f2fd53cb729c4f97223570292e25c \ No newline at end of file diff --git a/Assets/_Game/Scripts/AI/BossPatternData.cs b/Assets/_Game/Scripts/AI/BossPatternData.cs index fb32833e..b79c2ac1 100644 --- a/Assets/_Game/Scripts/AI/BossPatternData.cs +++ b/Assets/_Game/Scripts/AI/BossPatternData.cs @@ -4,6 +4,34 @@ using Colosseum.Skills; namespace Colosseum.AI { + /// + /// 패턴의 대분류. grace period 판단에 사용됩니다. + /// + public enum PatternCategory + { + /// 기본 패턴 — grace period 제한 없음 + Basic, + /// 대형 패턴 — basicLoopCount 이후 사용 가능 + Big, + /// 징벌 패턴 — 항상 허용, bigPattern 카운터 리셋 + Punish, + } + + /// + /// 패턴의 타겟 해석 방식 + /// + public enum TargetResolveMode + { + /// 타겟 해석 불필요 (시그니처 등 내부 처리) + None, + /// 가장 위협도가 높은 근접 대상 + HighestThreat, + /// 기동 패턴 전용 타겟 + Mobility, + /// 유틸리티 패턴 전용 타겟 + Utility, + } + public enum PatternStepType { Skill, Wait } [System.Serializable] @@ -23,6 +51,16 @@ namespace Colosseum.AI [Header("패턴 정보")] [SerializeField] private string patternName; + [Header("패턴 특성")] + [Tooltip("패턴 분류 — grace period 판단에 사용")] + [SerializeField] private PatternCategory category = PatternCategory.Basic; + [Tooltip("시그니처 패턴 여부 — 전용 실행 경로 사용")] + [SerializeField] private bool isSignature; + [Tooltip("근접 패턴 여부 — meleePatternCounter 갱신")] + [SerializeField] private bool isMelee; + [Tooltip("타겟 해석 방식")] + [SerializeField] private TargetResolveMode targetMode = TargetResolveMode.HighestThreat; + [Header("스텝 순서")] [SerializeField] private List steps = new List(); @@ -36,9 +74,23 @@ namespace Colosseum.AI [Tooltip("이 패턴을 사용하기 시작하는 최소 페이즈 (1=Phase 1부터)")] [SerializeField] private int minPhase = 1; + [Header("조건부 점프")] + [Tooltip("점프 스텝에서 대상을 찾지 못하면 해당 스텝을 스킵하고 패턴을 종료합니다 (조합 패턴용)")] + [SerializeField] private bool skipJumpStepOnNoTarget = false; + public string PatternName => patternName; + public PatternCategory Category => category; + public bool IsSignature => isSignature; + public bool IsMelee => isMelee; + public TargetResolveMode TargetMode => targetMode; public IReadOnlyList Steps => steps; public float Cooldown => cooldown; public int MinPhase => minPhase; + public bool SkipJumpStepOnNoTarget => skipJumpStepOnNoTarget; + + /// + /// Big 패턴인지 반환합니다 (grace period 대상). + /// + public bool IsBigPattern => category == PatternCategory.Big; } } diff --git a/Assets/_Game/Scripts/Editor/RebuildDrogBehaviorAuthoringGraph.cs b/Assets/_Game/Scripts/Editor/RebuildDrogBehaviorAuthoringGraph.cs index e87a276a..951bb7a0 100644 --- a/Assets/_Game/Scripts/Editor/RebuildDrogBehaviorAuthoringGraph.cs +++ b/Assets/_Game/Scripts/Editor/RebuildDrogBehaviorAuthoringGraph.cs @@ -1,8 +1,13 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Linq; using System.Reflection; +using Colosseum.AI; +using Colosseum.AI.BehaviorActions.Conditions; +using Colosseum.Enemy; + using UnityEditor; using UnityEngine; @@ -10,6 +15,7 @@ namespace Colosseum.Editor { /// /// 드로그 Behavior Graph authoring 자산을 현재 BT 우선순위 구조로 재생성합니다. + /// Check 노드는 ConditionalGuardAction + Condition 조합으로 구현됩니다. /// public static class RebuildDrogBehaviorAuthoringGraph { @@ -21,8 +27,32 @@ namespace Colosseum.Editor UnityEngine.Object graphAsset = AssetDatabase.LoadMainAssetAtPath(GraphAssetPath); if (graphAsset == null) { - Debug.LogError($"[DrogBTRebuild] 그래프 자산을 찾을 수 없습니다: {GraphAssetPath}"); - return; + // 에셋이 없으면 기존 에셋 경로의 타입을 리플렉션으로 찾아 생성합니다. + // BehaviorAuthoringGraph는 Unity.Behavior.Editor 어셈블리에 있습니다. + Type authoringGraphType = null; + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + authoringGraphType = assembly.GetType("Unity.Behavior.Authoring.BehaviorAuthoringGraph"); + if (authoringGraphType != null) + break; + } + + if (authoringGraphType == null) + { + Debug.LogError("[DrogBTRebuild] BehaviorAuthoringGraph 타입을 모든 어셈블리에서 찾지 못했습니다."); + return; + } + + graphAsset = ScriptableObject.CreateInstance(authoringGraphType); + if (graphAsset == null) + { + Debug.LogError("[DrogBTRebuild] BehaviorAuthoringGraph 인스턴스를 생성할 수 없습니다."); + return; + } + + AssetDatabase.CreateAsset(graphAsset, GraphAssetPath); + AssetDatabase.SaveAssets(); + Debug.Log("[DrogBTRebuild] 새 그래프 자산을 생성했습니다."); } try @@ -31,8 +61,10 @@ namespace Colosseum.Editor Assembly authoringAssembly = authoringGraphType.Assembly; Assembly runtimeAssembly = typeof(Unity.Behavior.BehaviorGraph).Assembly; + // 기본 리플렉션 메서드 MethodInfo createNodeMethod = authoringGraphType.BaseType?.GetMethod("CreateNode", BindingFlags.Instance | BindingFlags.Public); MethodInfo connectEdgeMethod = authoringGraphType.BaseType?.GetMethod("ConnectEdge", BindingFlags.Instance | BindingFlags.Public); + MethodInfo createNodePortsMethod = authoringGraphType.BaseType?.GetMethod("CreateNodePortsForNode", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); MethodInfo buildRuntimeGraphMethod = authoringGraphType.GetMethod("BuildRuntimeGraph", BindingFlags.Instance | BindingFlags.Public); MethodInfo saveAssetMethod = authoringGraphType.BaseType?.GetMethod("SaveAsset", BindingFlags.Instance | BindingFlags.Public); MethodInfo setAssetDirtyMethod = authoringGraphType.BaseType?.GetMethod("SetAssetDirty", BindingFlags.Instance | BindingFlags.Public); @@ -45,16 +77,100 @@ namespace Colosseum.Editor return; } - SerializedObject serializedObject = new SerializedObject(graphAsset); - SerializedProperty nodesProperty = serializedObject.FindProperty("m_Nodes"); - if (nodesProperty == null) + // ConditionalGuard 리플렉션 타입 (internal) + Type conditionalGuardType = runtimeAssembly.GetType("Unity.Behavior.ConditionalGuardAction"); + Type conditionUtilityType = authoringAssembly.GetType("Unity.Behavior.ConditionUtility"); + Type conditionModelType = authoringAssembly.GetType("Unity.Behavior.ConditionModel"); + Type graphNodeModelType = authoringAssembly.GetType("Unity.Behavior.BehaviorGraphNodeModel"); + Type conditionInfoType = authoringAssembly.GetType("Unity.Behavior.ConditionInfo"); + + if (conditionalGuardType == null) { Debug.LogError("[DrogBTRebuild] ConditionalGuardAction 타입을 찾지 못했습니다."); return; } + if (conditionUtilityType == null) { Debug.LogError("[DrogBTRebuild] ConditionUtility 타입을 찾지 못했습니다."); return; } + if (conditionModelType == null) { Debug.LogError("[DrogBTRebuild] ConditionModel 타입을 찾지 못했습니다."); return; } + if (graphNodeModelType == null) { Debug.LogError("[DrogBTRebuild] BehaviorGraphNodeModel 타입을 찾지 못했습니다."); return; } + if (conditionInfoType == null) { - Debug.LogError("[DrogBTRebuild] m_Nodes 프로퍼티를 찾지 못했습니다."); + Debug.LogError("[DrogBTRebuild] ConditionInfo 타입을 찾지 못했습니다."); return; } - nodesProperty.ClearArray(); - serializedObject.ApplyModifiedPropertiesWithoutUndo(); + Type branchCompositeType = runtimeAssembly.GetType("Unity.Behavior.BranchingConditionComposite"); + if (branchCompositeType == null) + { + Debug.LogError("[DrogBTRebuild] BranchingConditionComposite 타입을 찾지 못했습니다."); + return; + } + + // SetField(string, VariableModel, Type) — 제네릭 버전과 구분하기 위해 파라미터 수로 필터링 + MethodInfo setFieldMethod = conditionModelType.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name == "SetField" && !m.IsGenericMethod && m.GetParameters().Length == 3); + + // SetField(string, T) — BehaviorGraphNodeModel 기반 클래스에서 조회 (ConditionModel과 Action 노드 모두 사용) + MethodInfo setFieldValueMethod = graphNodeModelType.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name == "SetField" && m.IsGenericMethod && m.GetParameters().Length == 2); + + if (setFieldMethod == null) + { + Debug.LogError("[DrogBTRebuild] ConditionModel.SetField 메서드를 찾지 못했습니다."); + return; + } + + if (setFieldValueMethod == null) + { + Debug.LogError("[DrogBTRebuild] SetField 제네릭 메서드를 찾지 못했습니다."); + return; + } + + // 기존 에셋의 서브에셋(BehaviorGraph 등)에서 깨진 managed references 클리어 + Type behaviorGraphType = typeof(Unity.Behavior.BehaviorGraph); + UnityEngine.Object[] subAssets = AssetDatabase.LoadAllAssetsAtPath(GraphAssetPath); + foreach (var subAsset in subAssets) + { + if (subAsset != null && subAsset.GetType() == behaviorGraphType) + { + UnityEditor.SerializationUtility.ClearAllManagedReferencesWithMissingTypes(subAsset); + EditorUtility.SetDirty(subAsset); + } + } + + // AuthoringGraph 자체에서도 깨진 references 클리어 + UnityEditor.SerializationUtility.ClearAllManagedReferencesWithMissingTypes(graphAsset); + + // 노드 클리어 — 전체 타입 계층에서 필드 찾기 + FieldInfo nodesField = FindFieldInHierarchy(authoringGraphType, "m_RootNodes"); + if (nodesField == null) + { + Debug.LogError("[DrogBTRebuild] m_RootNodes 필드를 타입 계층 전체에서 찾지 못했습니다."); + return; + } + + nodesField.SetValue(graphAsset, Activator.CreateInstance(nodesField.FieldType)); + + FieldInfo nodesListField = FindFieldInHierarchy(authoringGraphType, "m_Nodes"); + if (nodesListField != null) + nodesListField.SetValue(graphAsset, Activator.CreateInstance(nodesListField.FieldType)); + + FieldInfo nodeModelsInfoField = FindFieldInHierarchy(authoringGraphType, "m_NodeModelsInfo"); + if (nodeModelsInfoField != null) + nodeModelsInfoField.SetValue(graphAsset, Activator.CreateInstance(nodeModelsInfoField.FieldType)); + + FieldInfo runtimeGraphField = FindFieldInHierarchy(authoringGraphType, "m_RuntimeGraph"); + if (runtimeGraphField != null) + runtimeGraphField.SetValue(graphAsset, null); + + // 클리어 후 에셋을 저장하고 다시 로드하여 잔류 참조가 메모리에 남지 않게 합니다. + EditorUtility.SetDirty(graphAsset); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + // 에셋을 다시 로드 (직렬화된 상태에서 로드하여 클리어 상태 확보) + graphAsset = AssetDatabase.LoadMainAssetAtPath(GraphAssetPath); + if (graphAsset == null) + { + Debug.LogError("[DrogBTRebuild] 에셋 재로드 실패."); + return; + } + authoringGraphType = graphAsset.GetType(); object targetVariable = FindBlackboardVariableModel("Target"); if (targetVariable == null) @@ -63,103 +179,205 @@ namespace Colosseum.Editor return; } - object startNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.Start", true), new Vector2(420f, -620f)); - object repeatNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.RepeaterModifier", true), new Vector2(420f, -470f)); - object selectorNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SelectorComposite", true), new Vector2(420f, -280f)); + // 구조 노드 + object startNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.Start", true), new Vector2(420f, -800f)); + object repeatNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.RepeaterModifier", true), new Vector2(420f, -620f)); - object signatureSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(-1020f, -40f)); - object downSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(-780f, -40f)); - object utilitySequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(-380f, -40f)); - object leapSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(20f, -40f)); - object slamSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(420f, -40f)); - object mainSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(820f, -40f)); - object slamFallbackSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(1220f, -40f)); - object chaseSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(1620f, -40f)); + // ── 프리팹에서 패턴 에셋 로드 ── + const string prefabPath = "Assets/_Game/Prefabs/Bosses/Prefab_Boss_Drog.prefab"; + GameObject prefab = AssetDatabase.LoadMainAssetAtPath(prefabPath) as GameObject; + BossCombatBehaviorContext context = prefab?.GetComponent(); + if (context == null) + { + Debug.LogError("[DrogBTRebuild] 드로그 프리팹에서 BossCombatBehaviorContext를 찾지 못했습니다."); + return; + } - object signatureRefreshNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(RefreshPrimaryTargetAction), new Vector2(-1140f, 240f)); - object signatureHasTargetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(-1020f, 240f)); - object signatureReadyNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckSignaturePatternReadyAction), new Vector2(-900f, 240f)); - object signatureUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UseSignaturePatternAction), new Vector2(-780f, 240f)); + // protected 필드에서 BossPatternData 에셋 읽기 (리플렉션) + BossPatternData punishPattern = ReadProtectedField(context, "punishPattern"); + BossPatternData signaturePattern = ReadProtectedField(context, "signaturePattern"); + BossPatternData mobilityPattern = ReadProtectedField(context, "mobilityPattern"); + BossPatternData comboPattern = ReadProtectedField(context, "comboPattern"); + BossPatternData primaryPattern = ReadProtectedField(context, "primaryPattern"); + BossPatternData utilityPattern = ReadProtectedField(context, "utilityPattern"); + float punishSearchRadius = ReadProtectedFieldValue(context, "punishSearchRadius", 6f); - object downSelectNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SelectNearestDownedTargetAction), new Vector2(-740f, 240f)); - object downReadyNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckPunishPatternReadyAction), new Vector2(-620f, 240f)); - object downUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePunishPatternAction), new Vector2(-500f, 240f)); + // 필수 패턴 검증 (combo는 선택 — 할당되지 않은 경우 해당 Branch만 생략) + if (punishPattern == null || signaturePattern == null || mobilityPattern == null || + primaryPattern == null || utilityPattern == null) + { + Debug.LogError("[DrogBTRebuild] 프리팹에서 필수 패턴 에셋을 읽지 못했습니다."); + return; + } - object utilitySelectNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SelectAlternateTargetByDistanceAction), new Vector2(-500f, 240f)); - object utilityReadyNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckUtilityPatternReadyAction), new Vector2(-380f, 240f)); - object utilityUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UseUtilityPatternAction), new Vector2(-260f, 240f)); + if (comboPattern == null) + Debug.LogWarning("[DrogBTRebuild] comboPattern이 할당되지 않았습니다. 해당 Branch를 생략합니다."); - object leapSelectNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SelectTargetByDistanceAction), new Vector2(-100f, 240f)); - object leapReadyNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckMobilityPatternReadyAction), new Vector2(20f, 240f)); - object leapUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UseMobilityPatternAction), new Vector2(140f, 240f)); + // ── 계단식 우선순위 체인 ── + // 설계안 우선순위: 다운 추가타 > 도약 > 집행 개시 > 기본 루프 > 조합 > 유틸리티 + // 각 Branch: CheckPatternReady → true → UsePatternByRole + // false → 다음 우선순위 Branch 시도 + // 마지막까지 모든 조건이 false이면 Chase (fallback) + // + // 연결 흐름: Branch.True → FloatingPort(True).InputPort → FloatingPort(True).OutputPort → Action.InputPort + // CreateNodePortsForNode를 호출하여 FloatingPortNodeModel을 자동 생성해야 합니다. + // + // 레이아웃 패턴 (사용자 조정 기준): + // Branch: (-800, y) + // True Floating: (-597, y + 110) + // False Floating: (-1011, y + 114) + // Action: (-598, y + 199) - object slamRefreshNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(RefreshPrimaryTargetAction), new Vector2(240f, 240f)); - object slamHasTargetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(360f, 240f)); - object slamRangeNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckTargetInAttackRangeAction), new Vector2(480f, 240f)); - object slamTurnNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckSecondaryPatternTurnAction), new Vector2(600f, 240f)); - object slamReadyNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckSecondaryPatternReadyAction), new Vector2(720f, 240f)); - object slamUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UseSecondaryPatternAction), new Vector2(840f, 240f)); + const float branchX = -800f; + const float truePortOffsetX = 203f; + const float truePortOffsetY = 110f; + const float falsePortOffsetX = -211f; + const float falsePortOffsetY = 114f; + const float actionOffsetX = 202f; + const float actionOffsetY = 199f; + const float startY = -800f; + const float stepY = 220f; - object mainRefreshNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(RefreshPrimaryTargetAction), new Vector2(760f, 240f)); - object mainHasTargetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(880f, 240f)); - object mainRangeNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckTargetInAttackRangeAction), new Vector2(1000f, 240f)); - object mainReadyNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckPrimaryPatternReadyAction), new Vector2(1120f, 240f)); - object mainUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePrimaryPatternAction), new Vector2(1240f, 240f)); + // #1 Punish — 다운 추가타 (전제 조건: 다운된 대상이 반경 이내에 있어야 함) + object downBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY)); + AttachPatternReadyCondition(downBranch, punishPattern, authoringAssembly); + AttachConditionWithValue(downBranch, typeof(IsDownedTargetInRangeCondition), "searchRadius", punishSearchRadius, authoringAssembly); + AttachPhaseConditionIfNeeded(downBranch, punishPattern, authoringAssembly); + SetBranchRequiresAll(downBranch, true); + object downUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + actionOffsetX, startY + actionOffsetY)); + SetNodeFieldValue(downUseNode, "Pattern", punishPattern, setFieldValueMethod); + LinkTarget(downUseNode, targetVariable); - object fallbackRefreshNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(RefreshPrimaryTargetAction), new Vector2(1160f, 240f)); - object fallbackHasTargetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(1280f, 240f)); - object fallbackRangeNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckTargetInAttackRangeAction), new Vector2(1400f, 240f)); - object fallbackReadyNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(CheckSecondaryPatternReadyAction), new Vector2(1520f, 240f)); - object fallbackUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UseSecondaryPatternAction), new Vector2(1640f, 240f)); + // #2 Mobility — 도약 (전제 조건: 지나치게 먼 대상이 존재해야 함) + float mobilityTriggerDistance = ReadProtectedFieldValue(context, "mobilityTriggerDistance", 8f); + object leapBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY)); + AttachPatternReadyCondition(leapBranch, mobilityPattern, authoringAssembly); + AttachConditionWithValue(leapBranch, typeof(IsTargetBeyondDistanceCondition), "minDistance", mobilityTriggerDistance, authoringAssembly); + AttachPhaseConditionIfNeeded(leapBranch, mobilityPattern, authoringAssembly); + SetBranchRequiresAll(leapBranch, true); + object leapUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + actionOffsetX, startY + stepY + actionOffsetY)); + SetNodeFieldValue(leapUseNode, "Pattern", mobilityPattern, setFieldValueMethod); + LinkTarget(leapUseNode, targetVariable); - object chaseRefreshNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(RefreshPrimaryTargetAction), new Vector2(1560f, 240f)); - object chaseHasTargetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(1680f, 240f)); - object chaseUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ChaseTargetAction), new Vector2(1800f, 240f)); + // #3 Signature — 집행 개시 + object signatureBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 2)); + AttachPatternReadyCondition(signatureBranch, signaturePattern, authoringAssembly); + AttachPhaseConditionIfNeeded(signatureBranch, signaturePattern, authoringAssembly); + object signatureUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + actionOffsetX, startY + stepY * 2 + actionOffsetY)); + SetNodeFieldValue(signatureUseNode, "Pattern", signaturePattern, setFieldValueMethod); + LinkTarget(signatureUseNode, targetVariable); + // #4 Combo — 콤보 패턴 (드문 조합, 선택적) + object comboBranch = null; + object comboUseNode = null; + if (comboPattern != null) + { + comboBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 3)); + AttachPatternReadyCondition(comboBranch, comboPattern, authoringAssembly); + AttachPhaseConditionIfNeeded(comboBranch, comboPattern, authoringAssembly); + comboUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + actionOffsetX, startY + stepY * 3 + actionOffsetY)); + SetNodeFieldValue(comboUseNode, "Pattern", comboPattern, setFieldValueMethod); + LinkTarget(comboUseNode, targetVariable); + } + + // #5 Primary — 사거리 + 기본 패턴 준비 (모두 충족) + object primaryBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 4)); + object primaryRangeCondModel = AttachCondition(primaryBranch, typeof(IsTargetInAttackRangeCondition), authoringAssembly); + if (primaryRangeCondModel != null) setFieldMethod.Invoke(primaryRangeCondModel, new object[] { "Target", targetVariable, typeof(GameObject) }); + AttachPatternReadyCondition(primaryBranch, primaryPattern, authoringAssembly); + AttachPhaseConditionIfNeeded(primaryBranch, primaryPattern, authoringAssembly); + SetBranchRequiresAll(primaryBranch, true); + object primaryUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + actionOffsetX, startY + stepY * 4 + actionOffsetY)); + SetNodeFieldValue(primaryUseNode, "Pattern", primaryPattern, setFieldValueMethod); + LinkTarget(primaryUseNode, targetVariable); + + // #6 Utility — 유틸리티 (전제 조건: 원거리 대상이 존재해야 함) + float utilityTriggerDistance = ReadProtectedFieldValue(context, "utilityTriggerDistance", 5f); + object utilityBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 5)); + AttachPatternReadyCondition(utilityBranch, utilityPattern, authoringAssembly); + AttachConditionWithValue(utilityBranch, typeof(IsTargetBeyondDistanceCondition), "minDistance", utilityTriggerDistance, authoringAssembly); + AttachPhaseConditionIfNeeded(utilityBranch, utilityPattern, authoringAssembly); + SetBranchRequiresAll(utilityBranch, true); + object utilityUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + actionOffsetX, startY + stepY * 5 + actionOffsetY)); + SetNodeFieldValue(utilityUseNode, "Pattern", utilityPattern, setFieldValueMethod); + LinkTarget(utilityUseNode, targetVariable); + + // #7 Chase — fallback (Branch 아님, Sequence 사용) + object chaseSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(branchX, startY + stepY * 6)); + object chaseRefreshNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(RefreshPrimaryTargetAction), new Vector2(branchX + 160f, startY + stepY * 6 + 80f)); + object chaseHasTargetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(branchX + 320f, startY + stepY * 6 + 80f)); + object chaseUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ChaseTargetAction), new Vector2(branchX + 480f, startY + stepY * 6 + 80f)); + + // ── FloatingPortNodeModel 생성 + 위치 보정 ── + // Branch 노드의 NamedPort(True/False)에 대해 FloatingPortNodeModel을 생성합니다. + // CreateNodePortsForNode는 기본 위치(Branch + 200px Y)를 사용하므로, 생성 후 사용자 조정 기준 위치로 이동합니다. + var allBranches = new List { downBranch, leapBranch, signatureBranch }; + if (comboBranch != null) allBranches.Add(comboBranch); + allBranches.AddRange(new[] { primaryBranch, utilityBranch }); + foreach (object branch in allBranches) + { + createNodePortsMethod?.Invoke(graphAsset, new object[] { branch }); + } + + // FloatingPortNodeModel 위치를 사용자 조정 기준으로 보정 + foreach (object branch in allBranches) + { + // Branch의 현재 위치 읽기 (Position은 public 필드) + FieldInfo posField = branch.GetType().GetField("Position", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (posField == null) continue; + Vector2 branchPos = (Vector2)posField.GetValue(branch); + + // FloatingPortNodeModel에서 PortName이 "True"/"False"인 것을 찾아 위치 수정 + SetFloatingPortPosition(graphAsset, branch, "True", branchPos.x + truePortOffsetX, branchPos.y + truePortOffsetY); + SetFloatingPortPosition(graphAsset, branch, "False", branchPos.x + falsePortOffsetX, branchPos.y + falsePortOffsetY); + } + + // ── 연결 ── + + // Start → Repeater → 첫 번째 Branch Connect(graphAsset, connectEdgeMethod, GetDefaultOutputPort(startNode), GetDefaultInputPort(repeatNode)); - Connect(graphAsset, connectEdgeMethod, GetDefaultOutputPort(repeatNode), GetDefaultInputPort(selectorNode)); - ConnectChildren(graphAsset, connectEdgeMethod, selectorNode, signatureSequence, downSequence, utilitySequence, leapSequence, slamSequence, mainSequence, slamFallbackSequence, chaseSequence); + Connect(graphAsset, connectEdgeMethod, GetDefaultOutputPort(repeatNode), GetDefaultInputPort(downBranch)); - ConnectChildren(graphAsset, connectEdgeMethod, signatureSequence, signatureRefreshNode, signatureHasTargetNode, signatureReadyNode, signatureUseNode); - ConnectChildren(graphAsset, connectEdgeMethod, downSequence, downSelectNode, downReadyNode, downUseNode); - ConnectChildren(graphAsset, connectEdgeMethod, utilitySequence, utilitySelectNode, utilityReadyNode, utilityUseNode); - ConnectChildren(graphAsset, connectEdgeMethod, leapSequence, leapSelectNode, leapReadyNode, leapUseNode); - ConnectChildren(graphAsset, connectEdgeMethod, slamSequence, slamRefreshNode, slamHasTargetNode, slamRangeNode, slamTurnNode, slamReadyNode, slamUseNode); - ConnectChildren(graphAsset, connectEdgeMethod, mainSequence, mainRefreshNode, mainHasTargetNode, mainRangeNode, mainReadyNode, mainUseNode); - ConnectChildren(graphAsset, connectEdgeMethod, slamFallbackSequence, fallbackRefreshNode, fallbackHasTargetNode, fallbackRangeNode, fallbackReadyNode, fallbackUseNode); + // 각 Branch의 True FloatingPort → Action + ConnectBranch(graphAsset, connectEdgeMethod, downBranch, "True", downUseNode); + ConnectBranch(graphAsset, connectEdgeMethod, leapBranch, "True", leapUseNode); + ConnectBranch(graphAsset, connectEdgeMethod, signatureBranch, "True", signatureUseNode); + if (comboBranch != null) + ConnectBranch(graphAsset, connectEdgeMethod, comboBranch, "True", comboUseNode); + ConnectBranch(graphAsset, connectEdgeMethod, primaryBranch, "True", primaryUseNode); + ConnectBranch(graphAsset, connectEdgeMethod, utilityBranch, "True", utilityUseNode); + + // 각 Branch의 False FloatingPort → 다음 우선순위 (계단식 체인) + // combo 유무에 따라 연결 경로가 달라짐 + object afterSignature = comboBranch ?? primaryBranch; + ConnectBranch(graphAsset, connectEdgeMethod, downBranch, "False", leapBranch); + ConnectBranch(graphAsset, connectEdgeMethod, leapBranch, "False", signatureBranch); + ConnectBranch(graphAsset, connectEdgeMethod, signatureBranch, "False", afterSignature); + if (comboBranch != null) + ConnectBranch(graphAsset, connectEdgeMethod, comboBranch, "False", primaryBranch); + ConnectBranch(graphAsset, connectEdgeMethod, primaryBranch, "False", utilityBranch); + ConnectBranch(graphAsset, connectEdgeMethod, utilityBranch, "False", chaseSequence); + + // Chase Sequence 자식 연결 ConnectChildren(graphAsset, connectEdgeMethod, chaseSequence, chaseRefreshNode, chaseHasTargetNode, chaseUseNode); - LinkTarget(signatureRefreshNode, targetVariable); - LinkTarget(signatureHasTargetNode, targetVariable); - LinkTarget(signatureUseNode, targetVariable); - LinkTarget(downSelectNode, targetVariable); - LinkTarget(downUseNode, targetVariable); - LinkTarget(utilitySelectNode, targetVariable); - LinkTarget(utilityUseNode, targetVariable); - LinkTarget(leapSelectNode, targetVariable); - LinkTarget(leapUseNode, targetVariable); - LinkTarget(slamRefreshNode, targetVariable); - LinkTarget(slamHasTargetNode, targetVariable); - LinkTarget(slamRangeNode, targetVariable); - LinkTarget(slamUseNode, targetVariable); - LinkTarget(mainRefreshNode, targetVariable); - LinkTarget(mainHasTargetNode, targetVariable); - LinkTarget(mainRangeNode, targetVariable); - LinkTarget(mainUseNode, targetVariable); - LinkTarget(fallbackRefreshNode, targetVariable); - LinkTarget(fallbackHasTargetNode, targetVariable); - LinkTarget(fallbackRangeNode, targetVariable); - LinkTarget(fallbackUseNode, targetVariable); + // Chase 노드 블랙보드 변수 연결 LinkTarget(chaseRefreshNode, targetVariable); LinkTarget(chaseHasTargetNode, targetVariable); LinkTarget(chaseUseNode, targetVariable); + // 저장 SetStartRepeatFlags(startNode, repeat: true, allowMultipleRepeatsPerTick: false); setAssetDirtyMethod.Invoke(graphAsset, new object[] { true }); - buildRuntimeGraphMethod.Invoke(graphAsset, new object[] { true }); + AssetDatabase.SaveAssets(); + + // BuildRuntimeGraph는 에셋이 직렬화된 후 AssetDatabase.ImportAsset으로 재임포트하여 + // OnValidate/AssetPostprocessor에서 자동 빌드되게 합니다. + string assetPath = AssetDatabase.GetAssetPath(graphAsset); + AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate); + saveAssetMethod.Invoke(graphAsset, null); AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); Debug.Log("[DrogBTRebuild] 드로그 Behavior Graph authoring 자산 재구성이 완료되었습니다."); } @@ -169,6 +387,209 @@ namespace Colosseum.Editor } } + /// + /// ConditionalGuardAction 노드를 생성하고 지정된 Condition을 부착합니다. + /// + private static object CreateConditionalGuard( + UnityEngine.Object graphAsset, + MethodInfo createNodeMethod, + MethodInfo getNodeInfoMethod, + Type conditionalGuardType, + Type conditionType, + Vector2 position, + Assembly authoringAssembly) + { + object guardNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, conditionalGuardType, position); + AttachCondition(guardNode, conditionType, authoringAssembly); + return guardNode; + } + + /// + /// ConditionalGuardAction 노드를 생성하고, 블랙보드 변수 참조가 있는 Condition을 부착합니다. + /// + private static object CreateConditionalGuardWithField( + UnityEngine.Object graphAsset, + MethodInfo createNodeMethod, + MethodInfo getNodeInfoMethod, + Type conditionalGuardType, + MethodInfo setFieldMethod, + Type conditionType, + object targetVariable, + Vector2 position, + Assembly authoringAssembly) + { + object guardNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, conditionalGuardType, position); + object conditionModel = AttachCondition(guardNode, conditionType, authoringAssembly); + + // Condition의 Target 필드를 블랙보드 변수에 연결 + // SetField는 GetOrCreateField를 호출하여 m_FieldValues에 FieldModel을 생성합니다. + if (conditionModel != null && targetVariable != null) + { + try + { + setFieldMethod.Invoke(conditionModel, new object[] { "Target", targetVariable, typeof(GameObject) }); + } + catch (Exception ex) + { + Debug.LogError($"[DrogBTRebuild] SetField 'Target' 실패 for {conditionType.Name}: {ex.GetType().Name}: {ex.Message}"); + } + } + + return guardNode; + } + + /// + /// 노드에 Condition을 부착합니다. + /// ConditionUtility.GetInfoForConditionType를 사용하여 NodeRegistry와 완벽히 동일한 + /// ConditionInfo를 획득합니다. 이렇게 하면 TypeID가 레지스트리와 일치하여 + /// EnsureFieldValuesAreUpToDate가 정상 동작하고 UpdateConditionModels가 + /// ConditionModel을 삭제하지 않습니다. + /// + private static object AttachCondition(object guardNode, Type conditionType, Assembly authoringAssembly) + { + try + { + // ConditionUtility.GetInfoForConditionType을 사용하여 ConditionInfo 획득 + // 이 메서드는 ConditionAttribute에서 GUID를 읽고, Variables를 리플렉션으로 수집합니다. + Type conditionUtilityType = authoringAssembly.GetType("Unity.Behavior.ConditionUtility"); + MethodInfo getInfoForTypeMethod = conditionUtilityType?.GetMethod("GetInfoForConditionType", BindingFlags.Static | BindingFlags.NonPublic); + + if (getInfoForTypeMethod == null) + { + Debug.LogError("[DrogBTRebuild] ConditionUtility.GetInfoForConditionType 메서드를 찾지 못했습니다."); + return null; + } + + object conditionInfo = getInfoForTypeMethod.Invoke(null, new object[] { conditionType }); + + if (conditionInfo == null) + { + Debug.LogError($"[DrogBTRebuild] GetInfoForConditionType이 null을 반환: {conditionType.Name}"); + return null; + } + + Type conditionModelType = authoringAssembly.GetType("Unity.Behavior.ConditionModel"); + Type graphNodeModelType = authoringAssembly.GetType("Unity.Behavior.BehaviorGraphNodeModel"); + + if (conditionModelType == null || graphNodeModelType == null) + { + Debug.LogError("[DrogBTRebuild] ConditionModel/BehaviorGraphNodeModel 타입을 찾지 못했습니다."); + return null; + } + + // ConditionModel 생성자 가져오기 (internal) + ConstructorInfo conditionModelCtor = conditionModelType.GetConstructor( + BindingFlags.Instance | BindingFlags.NonPublic, + null, + new[] { graphNodeModelType, typeof(Unity.Behavior.Condition), conditionInfo.GetType() }, + null); + + if (conditionModelCtor == null) + { + Debug.LogWarning("[DrogBTRebuild] ConditionModel 생성자를 찾지 못했습니다."); + return null; + } + + object conditionModel = conditionModelCtor.Invoke(new object[] { guardNode, null, conditionInfo }); + + // ConditionModels 리스트에 추가 + PropertyInfo conditionModelsProp = guardNode.GetType().GetProperty("ConditionModels", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (conditionModelsProp != null) + { + IList conditionModels = conditionModelsProp.GetValue(guardNode) as IList; + conditionModels?.Add(conditionModel); + } + else + { + Debug.LogWarning("[DrogBTRebuild] ConditionModels 속성을 찾지 못했습니다."); + } + + return conditionModel; + } + catch (Exception ex) + { + Debug.LogError($"[DrogBTRebuild] AttachCondition 실패 ({conditionType.Name}): {ex.GetType().Name}: {ex.Message}"); + return null; + } + } + + /// + /// ConditionModel의 필드를 블랙보드 변수에 연결합니다. + /// + private static void LinkConditionFieldToVariable(object conditionModel, string fieldName, Type fieldType, object variableModel) + { + MethodInfo setFieldMethod = conditionModel.GetType().GetMethod("SetField", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + setFieldMethod?.Invoke(conditionModel, new object[] { fieldName, variableModel, fieldType }); + } + + /// + /// Condition을 부착하고, 지정된 enum 필드 값을 설정합니다. + /// CheckPatternReadyCondition처럼 필드 값으로 역할을 구분하는 Condition에 사용합니다. + /// + private static void AttachConditionWithValue(object guardNode, Type conditionType, string fieldName, object fieldValue, Assembly authoringAssembly) + { + object conditionModel = AttachCondition(guardNode, conditionType, authoringAssembly); + if (conditionModel == null) + { + Debug.LogWarning($"[DrogBTRebuild] AttachConditionWithValue: Condition 생성 실패 ({conditionType.Name})"); + return; + } + + try + { + // ConditionModel의 실제 타입에서 SetField를 조회 + MethodInfo genericSetField = conditionModel.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name == "SetField" && m.IsGenericMethod && m.GetParameters().Length == 2); + + if (genericSetField != null) + { + MethodInfo closedMethod = genericSetField.MakeGenericMethod(fieldValue.GetType()); + closedMethod.Invoke(conditionModel, new object[] { fieldName, fieldValue }); + } + else + { + Debug.LogWarning($"[DrogBTRebuild] SetField를 찾지 못해 '{fieldName}' 필드를 설정하지 못했습니다."); + } + } + catch (Exception ex) + { + Debug.LogError($"[DrogBTRebuild] AttachConditionWithValue 실패 ({conditionType.Name}.{fieldName}): {ex.GetType().Name}: {ex.Message}"); + } + } + + /// + /// 노드 모델의 지정된 enum 필드 값을 설정합니다. + /// UsePatternByRoleAction처럼 필드 값으로 역할을 구분하는 Action에 사용합니다. + /// + private static void SetNodeFieldValue(object nodeModel, string fieldName, object fieldValue, MethodInfo setFieldValueMethod) + { + if (setFieldValueMethod == null) + { + Debug.LogWarning("[DrogBTRebuild] SetNodeFieldValue: setFieldValueMethod이 null입니다."); + return; + } + + try + { + // 실제 노드 모델 타입에서 SetField를 직접 조회하여 타입 불일치 방지 + MethodInfo genericMethod = nodeModel.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name == "SetField" && m.IsGenericMethod && m.GetParameters().Length == 2); + + if (genericMethod == null) + { + Debug.LogWarning($"[DrogBTRebuild] SetNodeFieldValue: SetField를 {nodeModel.GetType().Name}에서 찾지 못했습니다."); + return; + } + + MethodInfo closedMethod = genericMethod.MakeGenericMethod(fieldValue.GetType()); + closedMethod.Invoke(nodeModel, new object[] { fieldName, fieldValue }); + } + catch (Exception ex) + { + Debug.LogError($"[DrogBTRebuild] SetNodeFieldValue 실패 ({nodeModel.GetType().Name}.{fieldName}): {ex.GetType().Name}: {ex.Message}"); + } + } + private static object CreateNode(UnityEngine.Object graphAsset, MethodInfo createNodeMethod, MethodInfo getNodeInfoMethod, Type runtimeType, Vector2 position) { if (runtimeType == null) @@ -318,5 +739,263 @@ namespace Colosseum.Editor repeatField?.SetValue(startNode, repeat); allowField?.SetValue(startNode, allowMultipleRepeatsPerTick); } + + /// + /// GetField()가 null을 반환하는 문제를 회피하기 위해 전체 타입 계층을 순회하며 필드를 검색합니다. + /// + private static FieldInfo FindFieldInHierarchy(Type type, string fieldName) + { + Type current = type; + while (current != null) + { + foreach (FieldInfo fi in current.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) + { + if (fi.Name == fieldName) + return fi; + } + current = current.BaseType; + } + return null; + } + + /// + /// Branch 노드의 지정된 이름의 출력 포트(PortModel)를 반환합니다. + /// BranchingConditionComposite는 NamedChildren(True, False)을 가지므로 + /// 기본 출력 포트 대신 이름 기반 포트를 사용해야 합니다. + /// + private static object GetNamedOutputPort(object node, string portName) + { + MethodInfo method = node.GetType().GetMethod("FindPortModelByName", BindingFlags.Instance | BindingFlags.Public); + if (method == null) + throw new InvalidOperationException("[DrogBTRebuild] FindPortModelByName 메서드를 찾지 못했습니다."); + object port = method.Invoke(node, new object[] { portName }); + if (port == null) + throw new InvalidOperationException($"[DrogBTRebuild] '{portName}' 포트를 찾지 못했습니다."); + return port; + } + + /// + /// Branch의 NamedPort(True/False)를 FloatingPortNodeModel을 경유하여 대상 노드에 연결합니다. + /// 올바른 연결 흐름: Branch.NamedPort → FloatingPort.InputPort → FloatingPort.OutputPort → Target.InputPort + /// + private static void ConnectBranch(UnityEngine.Object graphAsset, MethodInfo connectEdgeMethod, object branchNode, string portName, object targetNode) + { + // Branch의 NamedPort 찾기 + object branchPort = GetNamedOutputPort(branchNode, portName); + + // FloatingPortNodeModel 찾기 — Branch의 포트에 연결된 FloatingPortNodeModel을 검색 + // FloatingPortNodeModel은 GraphAsset.Nodes에 별도 노드로 저장됩니다. + FieldInfo nodesField = FindFieldInHierarchy(graphAsset.GetType(), "m_Nodes"); + if (nodesField == null) + { + // 폴백: 직접 연결 (FloatingPort가 없는 경우) + Connect(graphAsset, connectEdgeMethod, branchPort, GetDefaultInputPort(targetNode)); + return; + } + + IEnumerable nodes = nodesField.GetValue(graphAsset) as IEnumerable; + if (nodes == null) + { + Connect(graphAsset, connectEdgeMethod, branchPort, GetDefaultInputPort(targetNode)); + return; + } + + object floatingPortOutput = null; + + foreach (object node in nodes) + { + if (node == null) continue; + Type nodeType = node.GetType(); + if (!nodeType.Name.Contains("FloatingPortNodeModel")) continue; + + // PortName 확인 + FieldInfo portNameField = nodeType.GetField("PortName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + string currentPortName = portNameField?.GetValue(node) as string; + if (currentPortName != portName) continue; + + // ParentNodeID 확인 — 이 Branch의 자식인지 + FieldInfo parentNodeIdField = nodeType.GetField("ParentNodeID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (parentNodeIdField == null) continue; + + object parentNodeIdValue = parentNodeIdField.GetValue(node); + // Branch의 ID와 비교 + FieldInfo branchIdField = branchNode.GetType().GetField("ID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (branchIdField == null) continue; + object branchIdValue = branchIdField.GetValue(branchNode); + + if (!parentNodeIdValue.Equals(branchIdValue)) continue; + + // FloatingPort의 OutputPort 찾기 + PropertyInfo portModelsProp = nodeType.GetProperty("PortModels", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + FieldInfo portModelsField = nodeType.GetField("PortModels", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + IEnumerable portModels = portModelsProp?.GetValue(node) as IEnumerable ?? portModelsField?.GetValue(node) as IEnumerable; + if (portModels == null) continue; + + foreach (object port in portModels) + { + if (port == null) continue; + FieldInfo portNameF = port.GetType().GetField("m_Name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + string pName = portNameF?.GetValue(port) as string; + if (pName == "OutputPort") + { + floatingPortOutput = port; + break; + } + } + + if (floatingPortOutput != null) break; + } + + if (floatingPortOutput != null) + { + Connect(graphAsset, connectEdgeMethod, floatingPortOutput, GetDefaultInputPort(targetNode)); + } + else + { + // 폴백: 직접 연결 + Connect(graphAsset, connectEdgeMethod, branchPort, GetDefaultInputPort(targetNode)); + Debug.LogWarning($"[DrogBTRebuild] FloatingPortNodeModel을 찾지 못해 '{portName}' 포트를 직접 연결합니다."); + } + } + + /// + /// Branch 노드의 RequiresAllConditionsTrue 플래그를 설정합니다. + /// DefaultNodeTransformer가 model.RequiresAllConditionsTrue → runtime.RequiresAllConditions로 복사합니다. + /// + private static void SetBranchRequiresAll(object branchNode, bool requiresAll) + { + PropertyInfo prop = branchNode.GetType().GetProperty("RequiresAllConditionsTrue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + prop?.SetValue(branchNode, requiresAll); + } + + /// + /// Branch에 속한 FloatingPortNodeModel의 위치를 설정합니다. + /// Branch의 ID와 PortName으로 FloatingPortNodeModel을 찾아 Position을 변경합니다. + /// + private static void SetFloatingPortPosition(UnityEngine.Object graphAsset, object branchNode, string portName, float x, float y) + { + // m_Nodes 또는 Nodes에서 FloatingPortNodeModel을 검색 + IEnumerable nodes = null; + FieldInfo nodesField = FindFieldInHierarchy(graphAsset.GetType(), "m_Nodes"); + if (nodesField != null) + nodes = nodesField.GetValue(graphAsset) as IEnumerable; + if (nodes == null) + { + PropertyInfo nodesProp = graphAsset.GetType().GetProperty("Nodes", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (nodesProp != null) + nodes = nodesProp.GetValue(graphAsset) as IEnumerable; + } + + if (nodes == null) + { + Debug.LogWarning("[DrogBTRebuild] SetFloatingPortPosition: Nodes 컬렉션을 찾지 못했습니다."); + return; + } + + // Branch의 ID 가져오기 + FieldInfo branchIdField = branchNode.GetType().GetField("ID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (branchIdField == null) + { + Debug.LogWarning("[DrogBTRebuild] SetFloatingPortPosition: ID 필드를 찾지 못했습니다."); + return; + } + object branchIdValue = branchIdField.GetValue(branchNode); + + foreach (object node in nodes) + { + if (node == null) continue; + Type nodeType = node.GetType(); + if (!nodeType.Name.Contains("FloatingPortNodeModel")) continue; + + FieldInfo portNameField = nodeType.GetField("PortName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + string currentPortName = portNameField?.GetValue(node) as string; + if (currentPortName != portName) continue; + + FieldInfo parentNodeIdField = nodeType.GetField("ParentNodeID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (parentNodeIdField == null) continue; + object parentNodeIdValue = parentNodeIdField.GetValue(node); + + bool match = parentNodeIdValue != null && parentNodeIdValue.Equals(branchIdValue); + if (!match) continue; + + // Position 설정 (Position은 public 필드) + FieldInfo posField = nodeType.GetField("Position", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + posField?.SetValue(node, new Vector2(x, y)); + return; + } + } + + /// + /// 컴포넌트의 protected 필드 값을 읽습니다 (참조 타입용). + /// 프리팹에서 BossPatternData 에셋을 로드할 때 사용합니다. + /// + private static T ReadProtectedField(object obj, string fieldName) where T : class + { + Type type = obj.GetType(); + while (type != null) + { + FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + if (field != null) + return field.GetValue(obj) as T; + type = type.BaseType; + } + Debug.LogError($"[DrogBTRebuild] '{fieldName}' 필드를 {obj.GetType().Name}에서 찾지 못했습니다."); + return null; + } + + /// + /// 컴포넌트의 protected 필드 값을 읽습니다 (값 타입용). + /// + private static T ReadProtectedFieldValue(object obj, string fieldName, T defaultValue) where T : struct + { + Type type = obj.GetType(); + while (type != null) + { + FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + if (field != null) + return (T)field.GetValue(obj); + type = type.BaseType; + } + return defaultValue; + } + + /// + /// Branch에 CheckPatternReadyCondition을 부착하고 BossPatternData 에셋을 설정합니다. + /// 노드에 패턴명이 표시됩니다 (story의 [Pattern] 치환). + /// + private static void AttachPatternReadyCondition(object branchNode, BossPatternData pattern, Assembly authoringAssembly) + { + object condModel = AttachCondition(branchNode, typeof(CheckPatternReadyCondition), authoringAssembly); + if (condModel == null) + { + Debug.LogError($"[DrogBTRebuild] CheckPatternReadyCondition 부착 실패: {pattern?.PatternName}"); + return; + } + + // ConditionModel의 실제 타입에서 SetField를 조회하여 BossPatternData 참조 설정 + MethodInfo genericSetField = condModel.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic) + .FirstOrDefault(m => m.Name == "SetField" && m.IsGenericMethod && m.GetParameters().Length == 2); + if (genericSetField != null) + { + MethodInfo closedMethod = genericSetField.MakeGenericMethod(typeof(BossPatternData)); + closedMethod.Invoke(condModel, new object[] { "Pattern", pattern }); + } + else + { + Debug.LogError("[DrogBTRebuild] CheckPatternReadyCondition에서 SetField를 찾지 못했습니다."); + } + } + + /// + /// 패턴의 MinPhase가 1보다 큰 경우, Branch에 IsMinPhaseSatisfiedCondition을 부착합니다. + /// Phase 진입 조건을 BT에서 시각적으로 확인할 수 있습니다. + /// + private static void AttachPhaseConditionIfNeeded(object branchNode, BossPatternData pattern, Assembly authoringAssembly) + { + if (pattern == null || pattern.MinPhase <= 1) + return; + + AttachConditionWithValue(branchNode, typeof(IsMinPhaseSatisfiedCondition), "MinPhase", pattern.MinPhase, authoringAssembly); + } } } diff --git a/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs b/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs index 5d263ce7..8d4e6319 100644 --- a/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs +++ b/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs @@ -36,10 +36,6 @@ namespace Colosseum.Enemy [FormerlySerializedAs("mainPattern")] [SerializeField] protected BossPatternData primaryPattern; - [Tooltip("보조 근접 압박 패턴")] - [FormerlySerializedAs("slamPattern")] - [SerializeField] protected BossPatternData secondaryPattern; - [Tooltip("기동 또는 거리 징벌 패턴")] [FormerlySerializedAs("leapPattern")] [SerializeField] protected BossPatternData mobilityPattern; @@ -47,6 +43,9 @@ namespace Colosseum.Enemy [Tooltip("비주 대상 원거리 견제 패턴")] [SerializeField] protected BossPatternData utilityPattern; + [Tooltip("Phase 3 조합 패턴")] + [SerializeField] protected BossPatternData comboPattern; + [Tooltip("특정 상황에서 우선 발동하는 징벌 패턴")] [FormerlySerializedAs("downPunishPattern")] [SerializeField] protected BossPatternData punishPattern; @@ -77,18 +76,9 @@ namespace Colosseum.Enemy [Tooltip("원거리 견제 패턴을 고려하기 시작하는 최소 거리")] [Min(0f)] [SerializeField] protected float utilityTriggerDistance = 5f; - [Header("Pattern Cadence")] - [Tooltip("1페이즈에서 몇 번의 근접 패턴마다 보조 패턴을 섞을지")] - [FormerlySerializedAs("phase1SlamInterval")] - [Min(1)] [SerializeField] protected int phase1SecondaryInterval = 3; - - [Tooltip("2페이즈에서 몇 번의 근접 패턴마다 보조 패턴을 섞을지")] - [FormerlySerializedAs("phase2SlamInterval")] - [Min(1)] [SerializeField] protected int phase2SecondaryInterval = 2; - - [Tooltip("3페이즈에서 몇 번의 근접 패턴마다 보조 패턴을 섞을지")] - [FormerlySerializedAs("phase3SlamInterval")] - [Min(1)] [SerializeField] protected int phase3SecondaryInterval = 2; + [Header("Pattern Flow")] + [Tooltip("대형 패턴(시그니처/기동/조합) 직후 기본 패턴 최소 순환 횟수")] + [Min(0)] [SerializeField] protected int basicLoopMinCountAfterBigPattern = 2; [Header("Signature Pattern")] [Tooltip("시그니처 패턴 차단에 필요한 누적 피해 비율")] @@ -122,8 +112,8 @@ namespace Colosseum.Enemy [Min(0f)] [SerializeField] protected float signatureFailureDownDuration = 2f; [Header("Behavior")] - [Tooltip("전용 컨텍스트 사용 시 기존 BehaviorGraph를 비활성화할지 여부")] - [SerializeField] protected bool disableBehaviorGraph = true; +[Tooltip("true면 컨텍스트 코드가 AI를 직접 구동합니다. false면 BehaviorGraph가 모든 의사결정을 담당합니다.")] +[SerializeField] protected bool disableBehaviorGraph = false; [Tooltip("디버그 로그 출력 여부")] [SerializeField] protected bool debugMode = false; @@ -140,6 +130,7 @@ namespace Colosseum.Enemy protected float signatureRequiredDamage; protected float signatureElapsedTime; protected float signatureTotalDuration; + protected int basicLoopCountSinceLastBigPattern; /// /// 전용 컨텍스트 사용 시 BehaviorGraph를 비활성화할지 여부 @@ -270,66 +261,50 @@ namespace Colosseum.Enemy if (skillController.IsPlayingAnimation) return; + // 1. 다운 추가타 (최우선 인터럽트, grace period 면제) + if (TryStartPunishPattern()) + return; + + // 2. 집행 개시 (Phase 3 시그니처) + if (TryStartSignaturePatternInLoop()) + return; + + // 3. 조합 패턴 (Phase 3, 드물게) + if (TryStartComboPattern()) + return; + + // 4. 기동 패턴 (거리 기반 조건부) if (TryStartMobilityPattern()) return; + // 5. 원거리 견제 (보조) if (TryStartUtilityPattern()) return; + // 6. 기본 루프 TryStartPrimaryLoopPattern(); } - /// - /// 현재 역할의 패턴 데이터를 반환합니다. - /// - public BossPatternData GetPattern(BossCombatPatternRole role) - { - return role switch - { - BossCombatPatternRole.Primary => primaryPattern, - BossCombatPatternRole.Secondary => secondaryPattern, - BossCombatPatternRole.Mobility => mobilityPattern, - BossCombatPatternRole.Utility => utilityPattern, - BossCombatPatternRole.Punish => punishPattern, - BossCombatPatternRole.Signature => signaturePattern, - _ => null, - }; - } - /// - /// 다음 근접 패턴 차례가 보조 패턴인지 여부 - /// - public bool IsNextSecondaryPattern() - { - int secondaryInterval = GetSecondaryIntervalForPhase(CurrentPatternPhase); - if (secondaryInterval <= 1) - return true; - - return (meleePatternCounter + 1) % secondaryInterval == 0; - } - - /// - /// 현재 페이즈 기준의 보조 근접 패턴 주기를 반환합니다. - /// - public int GetSecondaryIntervalForPhase(int phase) - { - return phase switch - { - 1 => Mathf.Max(1, phase1SecondaryInterval), - 2 => Mathf.Max(1, phase2SecondaryInterval), - _ => Mathf.Max(1, phase3SecondaryInterval), - }; - } /// /// 근접 패턴 사용 카운터를 갱신합니다. /// - public void RegisterPatternUse(BossCombatPatternRole role) + public void RegisterPatternUse(BossPatternData pattern) { - if (!role.IsMeleeRole()) + if (pattern == null) return; - meleePatternCounter++; + if (pattern.IsMelee) + { + meleePatternCounter++; + basicLoopCountSinceLastBigPattern++; + } + + if (pattern.Category == PatternCategory.Punish || pattern.IsBigPattern) + { + basicLoopCountSinceLastBigPattern = 0; + } } /// @@ -500,9 +475,53 @@ namespace Colosseum.Enemy if (bossEnemy.IsDead || bossEnemy.IsTransitioning || skillController.IsPlayingAnimation) return false; + if (!IsPatternGracePeriodAllowed(signaturePattern)) + return false; + return IsPatternReady(signaturePattern); } + /// + /// 지정 패턴이 grace period를 통과했는지 반환합니다. + /// Punish/Melee/Utility는 항상 허용됩니다. + /// + public bool IsPatternGracePeriodAllowed(BossPatternData pattern) + { + if (pattern == null) + return false; + + if (pattern.Category == PatternCategory.Punish) + return true; + + if (pattern.IsMelee || pattern.TargetMode == TargetResolveMode.Utility) + return true; + + return basicLoopCountSinceLastBigPattern >= basicLoopMinCountAfterBigPattern; + } + + /// + /// 조합 패턴 사용 가능 여부를 반환합니다. + /// + public bool IsComboPatternReady() + { + if (!IsServer || bossEnemy == null || skillController == null) + return false; + + if (IsBehaviorSuppressed) + return false; + + if (activePatternCoroutine != null || isSignaturePatternActive) + return false; + + if (bossEnemy.IsDead || bossEnemy.IsTransitioning || skillController.IsPlayingAnimation) + return false; + + if (!IsPatternGracePeriodAllowed(comboPattern)) + return false; + + return IsPatternReady(comboPattern); + } + /// /// 시그니처 패턴을 시작합니다. /// @@ -566,7 +585,7 @@ namespace Colosseum.Enemy protected virtual bool TryStartMobilityPattern() { - BossPatternData pattern = GetPattern(BossCombatPatternRole.Mobility); + BossPatternData pattern = mobilityPattern; if (!IsPatternReady(pattern)) return false; @@ -581,7 +600,7 @@ namespace Colosseum.Enemy protected virtual bool TryStartUtilityPattern() { - BossPatternData pattern = GetPattern(BossCombatPatternRole.Utility); + BossPatternData pattern = utilityPattern; if (!IsPatternReady(pattern)) return false; @@ -594,33 +613,109 @@ namespace Colosseum.Enemy return true; } + /// + /// 다운 대상이 존재하면 징벌 패턴을 발동합니다. + /// + protected virtual bool TryStartPunishPattern() + { + BossPatternData pattern = punishPattern; + if (!IsPatternReady(pattern)) + return false; + + HitReactionController[] hitReactionControllers = FindObjectsByType(FindObjectsSortMode.None); + GameObject nearestDownedTarget = null; + float nearestDistance = float.MaxValue; + + for (int i = 0; i < hitReactionControllers.Length; i++) + { + HitReactionController controller = hitReactionControllers[i]; + if (controller == null || !controller.IsDowned) + continue; + + GameObject candidate = controller.gameObject; + if (candidate == null || !candidate.activeInHierarchy) + continue; + + if (Team.IsSameTeam(gameObject, candidate)) + continue; + + IDamageable damageable = candidate.GetComponent(); + if (damageable != null && damageable.IsDead) + continue; + + float distance = Vector3.Distance(transform.position, candidate.transform.position); + if (distance > punishSearchRadius || distance >= nearestDistance) + continue; + + nearestDistance = distance; + nearestDownedTarget = candidate; + } + + if (nearestDownedTarget == null) + return false; + + currentTarget = nearestDownedTarget; + StartPattern(pattern, nearestDownedTarget); + return true; + } + + /// + /// 시그니처 패턴을 context 루프에서 발동합니다. + /// grace period와 Phase 제한을 적용합니다. + /// + protected virtual bool TryStartSignaturePatternInLoop() + { + if (!IsSignaturePatternReady()) + return false; + + if (!IsPatternGracePeriodAllowed(signaturePattern)) + return false; + + GameObject target = ResolvePrimaryTarget(); + return TryStartSignaturePattern(target); + } + + /// + /// Phase 3 조합 패턴을 발동합니다. + /// + protected virtual bool TryStartComboPattern() + { + if (!IsComboPatternReady()) + return false; + + currentTarget = ResolvePrimaryTarget(); + StartPattern(comboPattern, currentTarget); + return true; + } + protected virtual BossPatternData SelectPrimaryLoopPattern() { - BossPatternData primary = GetPattern(BossCombatPatternRole.Primary); - BossPatternData secondary = GetPattern(BossCombatPatternRole.Secondary); + if (!IsPatternReady(primaryPattern)) + return null; - bool canUsePrimary = IsPatternReady(primary); - bool canUseSecondary = IsPatternReady(secondary); + meleePatternCounter++; + return primaryPattern; + } - if (canUseSecondary && IsNextSecondaryPattern()) - { - meleePatternCounter++; - return secondary; - } + /// + /// 기본 패턴을 선택하고 카운터를 갱신합니다. + /// + public BossPatternData SelectAndRegisterBasicLoopPattern() + { + if (!IsPatternReady(primaryPattern)) + return null; - if (canUsePrimary) - { - meleePatternCounter++; - return primary; - } + RegisterPatternUse(primaryPattern); + return primaryPattern; + } - if (canUseSecondary) - { - meleePatternCounter++; - return secondary; - } - - return null; + /// + /// 기본 패턴이 사용 가능한지 확인합니다. + /// 상태 변경 없이 순수 검사만 수행합니다. + /// + public bool IsBasicLoopReady() + { + return IsPatternReady(primaryPattern); } protected virtual void StartPattern(BossPatternData pattern, GameObject target) @@ -655,9 +750,18 @@ namespace Colosseum.Enemy break; } - if (step.Skill.JumpToTarget && target != null) + if (step.Skill.JumpToTarget) { - enemyBase?.SetJumpTarget(target.transform.position); + GameObject jumpTarget = FindMobilityTarget(); + if (jumpTarget == null) + { + LogDebug(GetType().Name, $"점프 대상 없음, 패턴 조기 종료: {pattern.PatternName}"); + break; + } + + target = jumpTarget; + currentTarget = jumpTarget; + enemyBase?.SetJumpTarget(jumpTarget.transform.position); } if (!skillController.ExecuteSkill(step.Skill)) @@ -686,9 +790,6 @@ namespace Colosseum.Enemy if (pattern == null || pattern.Steps == null || pattern.Steps.Count == 0) return false; - if (CurrentPatternPhase < pattern.MinPhase) - return false; - if (!patternCooldownTracker.TryGetValue(pattern, out float readyTime)) return true; diff --git a/Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs b/Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs deleted file mode 100644 index eb35d42a..00000000 --- a/Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Colosseum.Enemy -{ - /// - /// 보스 전투 BT에서 사용하는 공통 패턴 역할 구분값입니다. - /// - public enum BossCombatPatternRole - { - Primary = 0, - Secondary = 1, - Mobility = 2, - Punish = 3, - Signature = 4, - Utility = 5, - } - - /// - /// 공통 패턴 역할 보조 확장 메서드입니다. - /// - public static class BossCombatPatternRoleExtensions - { - /// - /// 현재 역할이 근접 순환 패턴인지 반환합니다. - /// - public static bool IsMeleeRole(this BossCombatPatternRole role) - { - return role == BossCombatPatternRole.Primary || role == BossCombatPatternRole.Secondary; - } - } -} diff --git a/Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs.meta b/Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs.meta deleted file mode 100644 index 30934732..00000000 --- a/Assets/_Game/Scripts/Enemy/BossCombatPatternRole.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: ee34c0af35cdfbd45baf0a6b9dcc2dd9 \ No newline at end of file diff --git a/Assets/_Game/Scripts/Skills/Effects/ReviveEffect.cs.meta b/Assets/_Game/Scripts/Skills/Effects/ReviveEffect.cs.meta new file mode 100644 index 00000000..afd08d70 --- /dev/null +++ b/Assets/_Game/Scripts/Skills/Effects/ReviveEffect.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 848cbb76281c68842a4d00329110b769 \ No newline at end of file diff --git a/git status b/git status new file mode 100644 index 00000000..e69de29b