feat: 드로그 Phase 3 연타2강타-도약 조합 패턴 추가

- Phase 3 대표 조합 패턴 에셋 생성 (Data_Pattern_Drog_연타2강타-도약)
  - 연타2-강타(오른손치기+스윙) → 대기 0.5초 → 조건부 도약(점프+점프착지)
  - minPhase=3, category=Big, cooldown=22초
  - 거리 초과 대상 없으면 도약 스킵
- BT에 조합 패턴 브랜치 추가 (comboBranch → Sequence 구조)
  - Sequence: 연타2강타 실행 → Branch(거리 초과 대상 존재?) → 도약 실행
  - IsTargetBeyondDistanceCondition으로 조건부 도약이 BT에 시각화됨
- Drog 프리팹 comboPattern 슬롯에 에셋 할당
- 도약 패턴에 targetMode: Mobility 추가
- BT 리빌드 스크립트에 combo Sequence 구조 반영
- 전체 노드 간격 확대 (stepY 220→320)으로 가독성 개선
This commit is contained in:
2026-03-30 17:41:42 +09:00
parent c6fc56e9c6
commit 2c6a65d406
6 changed files with 1433 additions and 707 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0ce956e0878565343974c31b8111c0c6, type: 3}
m_Name: Data_Pattern_Drog_연타2강타-도약
m_EditorClassIdentifier: Colosseum.Game::Colosseum.AI.BossPatternData
patternName: 연타2강타-도약
category: 1
isSignature: 0
isMelee: 1
targetMode: 0
steps:
- Type: 0
Skill: {fileID: 11400000, guid: 4f40629d4d334434285e8fdec3714536, type: 2}
Duration: 0
- Type: 0
Skill: {fileID: 11400000, guid: 3acbf1c5ec71bef4bb13f8534605d554, type: 2}
Duration: 0
- Type: 1
Skill: {fileID: 0}
Duration: 0.5
cooldown: 22
minPhase: 3

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d4e7f2a6b8c31095e1a3c5d7f9b2d4e8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -23,5 +23,6 @@ MonoBehaviour:
- Type: 0
Skill: {fileID: 11400000, guid: 16321efbd1f2498458683bac7605b054, type: 2}
Duration: 0
targetMode: 2
cooldown: 1
minPhase: 2

View File

@@ -2194,7 +2194,7 @@ MonoBehaviour:
secondaryPattern: {fileID: 11400000, guid: 4a52d59d590b4eaa9ef92b7984eb08c7, type: 2}
mobilityPattern: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2}
utilityPattern: {fileID: 11400000, guid: 9f7ab8078af64fd9a6ff4c9ce6aa9d3a, type: 2}
comboPattern: {fileID: 0}
comboPattern: {fileID: 11400000, guid: d4e7f2a6b8c31095e1a3c5d7f9b2d4e8, type: 2}
punishPattern: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2}
signaturePattern: {fileID: 11400000, guid: 5e732b41722c45288bb6234f3e3fa638, type: 2}
phase2HealthThreshold: 0.75

View File

@@ -230,13 +230,13 @@ namespace Colosseum.Editor
const float branchX = -800f;
const float truePortOffsetX = 203f;
const float truePortOffsetY = 110f;
const float truePortOffsetY = 120f;
const float falsePortOffsetX = -211f;
const float falsePortOffsetY = 114f;
const float falsePortOffsetY = 124f;
const float actionOffsetX = 202f;
const float actionOffsetY = 199f;
const float actionOffsetY = 219f;
const float startY = -800f;
const float stepY = 220f;
const float stepY = 320f;
// #1 Punish — 다운 추가타 (전제 조건: 다운된 대상이 반경 이내에 있어야 함)
object downBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY));
@@ -267,17 +267,43 @@ namespace Colosseum.Editor
SetNodeFieldValue(signatureUseNode, "Pattern", signaturePattern, setFieldValueMethod);
LinkTarget(signatureUseNode, targetVariable);
// #4 Combo — 콤보 패턴 (드문 조합, 선택적)
// #4 Combo — 콤보 패턴 + 조건부 도약 (Sequence)
// comboBranch.True → Sequence:
// Child 1: 연타2-강타 실행
// Child 2: Branch(거리 초과 대상 존재) → 도약 실행
// 거리 초과 대상이 없으면 Branch Failure → Sequence Failure → comboBranch Failure → primaryBranch로 연결
object comboBranch = null;
object comboUseNode = null;
if (comboPattern != null)
{
// 메인 체인용 Branch (콤보 준비 + 페이즈 조건)
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));
// Sequence: 콤보 실행 → 조건부 도약
object comboSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod,
runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true),
new Vector2(branchX + 220f, startY + stepY * 3));
// Child 1: 콤보 패턴 실행 (연타2-강타 + 대기)
comboUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + 400f, startY + stepY * 3));
SetNodeFieldValue(comboUseNode, "Pattern", comboPattern, setFieldValueMethod);
LinkTarget(comboUseNode, targetVariable);
// Child 2: 조건부 도약 (거리 초과 대상 있을 때만)
object comboLeapBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX + 220f, startY + stepY * 3 + 180f));
AttachConditionWithValue(comboLeapBranch, typeof(IsTargetBeyondDistanceCondition), "minDistance", mobilityTriggerDistance, authoringAssembly);
object comboLeapUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(branchX + 400f, startY + stepY * 3 + 180f));
SetNodeFieldValue(comboLeapUseNode, "Pattern", mobilityPattern, setFieldValueMethod);
LinkTarget(comboLeapUseNode, targetVariable);
ConnectBranch(graphAsset, connectEdgeMethod, comboLeapBranch, "True", comboLeapUseNode);
// Sequence에 자식 연결
ConnectChildren(graphAsset, connectEdgeMethod, comboSequence, comboUseNode, comboLeapBranch);
// 메인 체인: comboBranch.True → Sequence
ConnectBranch(graphAsset, connectEdgeMethod, comboBranch, "True", comboSequence);
}
// #5 Primary — 사거리 + 기본 패턴 준비 (모두 충족)
@@ -338,12 +364,10 @@ namespace Colosseum.Editor
Connect(graphAsset, connectEdgeMethod, GetDefaultOutputPort(startNode), GetDefaultInputPort(repeatNode));
Connect(graphAsset, connectEdgeMethod, GetDefaultOutputPort(repeatNode), GetDefaultInputPort(downBranch));
// 각 Branch의 True FloatingPort → Action
// 각 Branch의 True FloatingPort → Action (combo는 내부에서 Sequence로 연결됨)
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);