Compare commits

...

2 Commits

Author SHA1 Message Date
7ff9332333 feat: 드로그 펀치R 스킬 및 애니메이션 추가
- Anim_Drog_펀치R 애니메이션 클립 및 FBX 에셋 추가
- Data_Skill_Drog_펀치R 스킬 데이터 생성
- Model_Enemy_Drog 프리팹 업데이트
2026-04-01 23:19:33 +09:00
ce883e4fa3 feat: 디버그 패널 스킬 강제 발동 및 UI 모드 토글 시스템 추가
- UIModeController: leftAlt 키로 커서 표시/게임플레이 입력 차단 토글 (공용 싱글톤)
- DebugPanelUI: 보스 스킬 강제 발동 섹션 추가 (드롭다운 + 발동/취소 버튼)
- 에디터에서 Data/Skills의 보스 이름 기반 스킬 검색, 빌드에서 패턴 슬롯 fallback
- BossCombatBehaviorContext.GetAllPatternSkills() 추가 (디버그용 스킬 목록 수집)
- TMP Settings에 한글 폰트(MaruBuri)를 fallback으로 등록
- 젬/패시브/디버그 토글 버튼을 우측 하단에 수직 정렬
- InputSystem에 UIMode 액션(leftAlt) 추가
2026-04-01 23:14:05 +09:00
22 changed files with 63536 additions and 37711 deletions

View File

@@ -15,7 +15,7 @@ MonoBehaviour:
assetVersion: 2
m_TextWrappingMode: 1
m_enableKerning: 1
m_ActiveFontFeatures: 00000000
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
m_enableTintAllSprites: 0
m_enableParseEscapeCharacters: 1
@@ -33,20 +33,18 @@ MonoBehaviour:
m_defaultTextMeshProUITextContainerSize: {x: 200, y: 50}
m_autoSizeTextContainer: 0
m_IsTextObjectScaleStatic: 0
m_fallbackFontAssets: []
m_fallbackFontAssets:
- {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_matchMaterialPreset: 1
m_HideSubTextObjects: 0
m_defaultSpriteAsset: {fileID: 11400000, guid: c41005c129ba4d66911b75229fd70b45,
type: 2}
m_defaultSpriteAsset: {fileID: 11400000, guid: c41005c129ba4d66911b75229fd70b45, type: 2}
m_defaultSpriteAssetPath: Sprite Assets/
m_enableEmojiSupport: 1
m_MissingCharacterSpriteUnicode: 0
m_EmojiFallbackTextAssets: []
m_defaultColorGradientPresetsPath: Color Gradient Presets/
m_defaultStyleSheet: {fileID: 11400000, guid: f952c082cb03451daed3ee968ac6c63e,
type: 2}
m_defaultStyleSheet: {fileID: 11400000, guid: f952c082cb03451daed3ee968ac6c63e, type: 2}
m_StyleSheetsResourcePath:
m_leadingCharacters: {fileID: 4900000, guid: d82c1b31c7e74239bff1220585707d2b, type: 3}
m_followingCharacters: {fileID: 4900000, guid: fade42e8bc714b018fac513c043d323b,
type: 3}
m_followingCharacters: {fileID: 4900000, guid: fade42e8bc714b018fac513c043d323b, type: 3}
m_UseModernHangulLineBreakingRules: 0

View File

@@ -5091,8 +5091,8 @@ MonoBehaviour:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.UI.DebugPanelUI
stunAbnormalityData: {fileID: 0}
silenceAbnormalityData: {fileID: 0}
panelWidth: 280
panelMaxHeight: 500
panelWidth: 420
panelMaxHeight: 800
--- !u!1001 &989227100
PrefabInstance:
m_ObjectHideFlags: 0
@@ -7636,6 +7636,7 @@ GameObject:
- component: {fileID: 1433547825}
- component: {fileID: 1433547823}
- component: {fileID: 1433547824}
- component: {fileID: 1433547826}
m_Layer: 0
m_Name: GameManager
m_TagString: Untagged
@@ -7703,6 +7704,18 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1433547826
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1433547822}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3faf1bf9fabb1c24bbe4c2c2f4b400da, type: 3}
m_Name:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.UI.UIModeController
--- !u!4 &1455748734 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 7132605379903659868, guid: 5b4ac53b97612ae4392b84786de0d50d, type: 3}
@@ -11338,6 +11351,14 @@ PrefabInstance:
propertyPath: m_Name
value: Drog
objectReference: {fileID: 0}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: registeredClips.Array.size
value: 8
objectReference: {fileID: 0}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[7]'
value:
objectReference: {fileID: 7400000, guid: c8fdea7dee0c6f04bbd27fe565071682, type: 2}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: ba7f94b04f2a39d40817c0d902438abb
folderAsset: yes
DefaultImporter:
guid: c8fdea7dee0c6f04bbd27fe565071682
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,751 @@
fileFormatVersion: 2
guid: f4a36d944d67ba1468efa4c0bfd794aa
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 3
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human:
- boneName: Hips
humanName: Hips
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: UpperLeg_L
humanName: LeftUpperLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: UpperLeg_R
humanName: RightUpperLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: LowerLeg_L
humanName: LeftLowerLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: LowerLeg_R
humanName: RightLowerLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ankle_L
humanName: LeftFoot
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ankle_R
humanName: RightFoot
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_01
humanName: Spine
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_02
humanName: Chest
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Neck
humanName: Neck
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Head
humanName: Head
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Clavicle_L
humanName: LeftShoulder
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Clavicle_R
humanName: RightShoulder
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Shoulder_L
humanName: LeftUpperArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Shoulder_R
humanName: RightUpperArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Elbow_L
humanName: LeftLowerArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Elbow_R
humanName: RightLowerArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Hand_L
humanName: LeftHand
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Hand_R
humanName: RightHand
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ball_L
humanName: LeftToes
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ball_R
humanName: RightToes
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Eyes
humanName: RightEye
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Eyebrows
humanName: Jaw
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_01
humanName: Left Thumb Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_02
humanName: Left Thumb Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_03
humanName: Left Thumb Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_01
humanName: Left Index Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_02
humanName: Left Index Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_03
humanName: Left Index Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_01
humanName: Left Little Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_02
humanName: Left Little Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_03
humanName: Left Little Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_011
humanName: Right Thumb Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_021
humanName: Right Thumb Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_031
humanName: Right Thumb Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_011
humanName: Right Index Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_021
humanName: Right Index Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_031
humanName: Right Index Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_011
humanName: Right Little Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_021
humanName: Right Little Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_031
humanName: Right Little Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_03
humanName: UpperChest
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
skeleton:
- name: Mutant Punch (2)(Clone)
parentName:
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_BarbarianGiant_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_ElementalGolem_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_FortGolem_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Troll_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_RedDemon_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Big_Ork_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Pig_Butcher_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Slayer_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_MechanicalGolem_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_MutantGuy_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Dwarf_01
parentName: Mutant Punch (2)(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Root
parentName: Mutant Punch (2)(Clone)
position: {x: -0.000000173226, y: 0.0023214668, z: 0.009713413}
rotation: {x: -0, y: -0, z: 2.8825275e-10, w: 1}
scale: {x: 1, y: 1, z: 0.99999994}
- name: Hips
parentName: Root
position: {x: -0, y: 0.8762761, z: 0}
rotation: {x: 1.9457519e-10, y: -5.915681e-11, z: 0.16770099, w: 0.98583794}
scale: {x: 1, y: 1, z: 1}
- name: Spine_01
parentName: Hips
position: {x: 0.03397978, y: 0.0969857, z: -0.015528781}
rotation: {x: -0.39460623, y: 0.58675885, z: -0.5664237, w: 0.42327797}
scale: {x: 1.0000024, y: 1.0000023, z: 1.0000012}
- name: Spine_02
parentName: Spine_01
position: {x: -0.18151169, y: 4.5519144e-17, z: -1.1814681e-17}
rotation: {x: 0.99518615, y: -0.09800278, z: 0.000000014901159, w: 0.000000059604638}
scale: {x: 1.0000026, y: 1.000003, z: 1.0000026}
- name: Spine_03
parentName: Spine_02
position: {x: -0.17903724, y: 2.5588683e-17, z: -5.236993e-15}
rotation: {x: -0.9781116, y: 0.20808107, z: -0.000000005258666, w: 0.000000031233306}
scale: {x: 1.0000013, y: 1.0000018, z: 1.0000013}
- name: Neck
parentName: Spine_03
position: {x: -0.18112935, y: 0.0169739, z: -0.0000000011960342}
rotation: {x: 0.00000006825501, y: -0.000000046894097, z: 0.30901593, w: 0.95105696}
scale: {x: 0.999999, y: 1.000002, z: 1.0000013}
- name: Head
parentName: Neck
position: {x: -0.08285272, y: 0.036295444, z: -0.0000000011654561}
rotation: {x: -0.000000010939373, y: 0.0000000755821, z: 0.10955097, w: 0.9939812}
scale: {x: 0.9999983, y: 1.0000013, z: 0.99999887}
- name: Eyebrows
parentName: Head
position: {x: -0.19999892, y: 0.02186953, z: 1.6423345e-10}
rotation: {x: 0.8059356, y: -0.5920033, z: -0.000000013565712, w: 0.000000040741558}
scale: {x: 1.0000042, y: 0.99999815, z: 1.0000012}
- name: Eyes
parentName: Head
position: {x: -0.18457133, y: 0.010586951, z: 7.950428e-11}
rotation: {x: 0.15786925, y: -0.6892586, z: 0.15786928, w: 0.6892586}
scale: {x: 0.9999998, y: 1.0000042, z: 0.9999954}
- name: Clavicle_L
parentName: Spine_03
position: {x: -0.07733449, y: -0.0015139526, z: -0.16716343}
rotation: {x: 0.42177835, y: -0.6243929, z: 0.4255878, w: 0.5011103}
scale: {x: 1.0000002, y: 1.0000015, z: 0.99999887}
- name: Shoulder_L
parentName: Clavicle_L
position: {x: -0.16134125, y: -4.7947756e-17, z: -5.7731595e-17}
rotation: {x: 0.0028544364, y: 0.05185222, z: -0.054891802, w: 0.997141}
scale: {x: 1, y: 1, z: 0.99999994}
- name: Elbow_L
parentName: Shoulder_L
position: {x: -0.4568335, y: -1.3457903e-16, z: 2.1094237e-16}
rotation: {x: 0.00000006286427, y: 0.059024416, z: -0.000000013620591, w: 0.9982566}
scale: {x: 0.9999998, y: 1, z: 0.9999998}
- name: Hand_L
parentName: Elbow_L
position: {x: -0.3286817, y: -5.684342e-16, z: 1.4654943e-16}
rotation: {x: 0.05427473, y: 0.395974, z: 0.124479085, w: 0.90816504}
scale: {x: 1, y: 0.9999992, z: 1.0000013}
- name: Thumb_01
parentName: Hand_L
position: {x: -0.08908812, y: -2.753353e-16, z: -4.4408918e-17}
rotation: {x: -0.032716513, y: -0.110338114, z: -0.077353075, w: 0.9903391}
scale: {x: 1.0000017, y: 0.9999998, z: 1.000001}
- name: Thumb_02
parentName: Thumb_01
position: {x: -0.09701814, y: 4.396483e-16, z: 1.8651746e-16}
rotation: {x: -0.052660808, y: -0.01776939, z: 0.027707724, w: 0.9980699}
scale: {x: 0.9999984, y: 1.0000014, z: 1.0000001}
- name: Thumb_03
parentName: Thumb_02
position: {x: -0.092271924, y: 4.2188474e-17, z: -2.220446e-16}
rotation: {x: -0.046633855, y: -0.14921474, z: -0.29463214, w: 0.94273657}
scale: {x: 0.9999985, y: 1.0000001, z: 1.0000032}
- name: IndexFinger_01
parentName: Hand_L
position: {x: -0.120755404, y: 0.042213865, z: -0.0984221}
rotation: {x: -0.0536025, y: -0.37485924, z: -0.12035175, w: 0.91767246}
scale: {x: 1.0000017, y: 0.9999996, z: 1.0000007}
- name: IndexFinger_02
parentName: IndexFinger_01
position: {x: -0.0614739, y: -3.1441861e-19, z: 0}
rotation: {x: -0.0015661672, y: -0.0029745684, z: 0.036817785, w: 0.99931633}
scale: {x: 1.0000006, y: 0.99999994, z: 1}
- name: IndexFinger_03
parentName: IndexFinger_02
position: {x: -0.057940163, y: 1.8041123e-18, z: -2.5535128e-17}
rotation: {x: -0.009162957, y: -0.012817944, z: 0.03761877, w: 0.999168}
scale: {x: 1.0000001, y: 1.0000006, z: 0.9999997}
- name: IndexFinger_04
parentName: IndexFinger_03
position: {x: -0.059118144, y: -1.8624858e-16, z: -5.551115e-19}
rotation: {x: -0.0059754928, y: -0.027766112, z: -0.21030399, w: 0.97722346}
scale: {x: 1, y: 1.0000007, z: 1.0000001}
- name: Finger_01
parentName: Hand_L
position: {x: -0.051985342, y: 0.012058426, z: -0.14852415}
rotation: {x: -0.098628424, y: -0.46502253, z: -0.056653097, w: 0.8779618}
scale: {x: 1.0000013, y: 0.9999998, z: 1.000001}
- name: Finger_02
parentName: Finger_01
position: {x: -0.0641512, y: 1.8214596e-19, z: 2.220446e-18}
rotation: {x: 0.003567404, y: 0.019343372, z: 0.02855653, w: 0.9993987}
scale: {x: 1.000001, y: 1.0000005, z: 0.99999946}
- name: Finger_03
parentName: Finger_02
position: {x: -0.05330061, y: -1.7347668e-16, z: 4.2188474e-17}
rotation: {x: -0.024194408, y: -0.018455962, z: 0.03164594, w: 0.9990358}
scale: {x: 0.99999934, y: 1.0000013, z: 1.0000013}
- name: Finger_04
parentName: Finger_03
position: {x: -0.047222238, y: -3.8635761e-16, z: -5.662137e-17}
rotation: {x: 0.021918356, y: 0.095466316, z: -0.22269532, w: 0.9699549}
scale: {x: 1.0000017, y: 1.0000008, z: 0.9999998}
- name: Clavicle_R
parentName: Spine_03
position: {x: -0.07733742, y: -0.0015131371, z: 0.16716298}
rotation: {x: 0.6243929, y: 0.4217783, z: 0.5011103, w: -0.42558786}
scale: {x: 1, y: 1.0000025, z: 0.99999887}
- name: Shoulder_R
parentName: Clavicle_R
position: {x: 0.16134152, y: 0.00000022487666, z: -0.00000006441897}
rotation: {x: 0.0028544066, y: 0.051852174, z: -0.054891817, w: 0.997141}
scale: {x: 1.0000001, y: 1.0000026, z: 1.0000032}
- name: Elbow_R
parentName: Shoulder_R
position: {x: 0.45683342, y: 8.5265126e-16, z: 0.00000003960579}
rotation: {x: 0.000000039348375, y: 0.059024356, z: -0.00000010314396, w: 0.9982566}
scale: {x: 0.99999994, y: 1.0000092, z: 1.0000076}
- name: Hand_R
parentName: Elbow_R
position: {x: 0.328678, y: -7.958079e-15, z: -0.00000031490552}
rotation: {x: 0.05427484, y: 0.39597392, z: 0.12447924, w: 0.90816504}
scale: {x: 1.0000006, y: 1.0000005, z: 1.0000012}
- name: Thumb_011
parentName: Hand_R
position: {x: 0.08908848, y: -0.0000018401335, z: 0.0000010454004}
rotation: {x: -0.032713458, y: -0.11032645, z: -0.07735393, w: 0.9903405}
scale: {x: 1.000023, y: 1.0000073, z: 0.9999873}
- name: Thumb_021
parentName: Thumb_011
position: {x: 0.09702438, y: -0.0000012559718, z: 0.000003968674}
rotation: {x: -0.052663185, y: -0.017790383, z: 0.027662793, w: 0.9980706}
scale: {x: 1.0000011, y: 1.0000217, z: 0.9999959}
- name: Thumb_031
parentName: Thumb_021
position: {x: 0.09227324, y: 0.0000074613017, z: -0.000000493297}
rotation: {x: -0.0466338, y: -0.14921468, z: -0.29463202, w: 0.94273657}
scale: {x: 1.0000436, y: 0.99997944, z: 0.9999708}
- name: IndexFinger_011
parentName: Hand_R
position: {x: 0.12075663, y: -0.04220975, z: 0.09842222}
rotation: {x: -0.053602505, y: -0.3748591, z: -0.12035184, w: 0.9176725}
scale: {x: 1.0000384, y: 0.999999, z: 0.99997413}
- name: IndexFinger_021
parentName: IndexFinger_011
position: {x: 0.061476283, y: -0.0000047270864, z: 0.00000030396376}
rotation: {x: -0.0015657125, y: -0.0029734955, z: 0.03672477, w: 0.99931985}
scale: {x: 1.0000002, y: 1.0000063, z: 1.0000061}
- name: IndexFinger_031
parentName: IndexFinger_021
position: {x: 0.05794711, y: 0.0000061344235, z: 0.00000056286797}
rotation: {x: -0.009163045, y: -0.01283863, z: 0.037712414, w: 0.9991641}
scale: {x: 1.0000068, y: 0.99999505, z: 1.0000001}
- name: IndexFinger_041
parentName: IndexFinger_031
position: {x: 0.059107542, y: -0.0000048901334, z: -0.00000042587297}
rotation: {x: -0.005975452, y: -0.027766252, z: -0.2103039, w: 0.9772234}
scale: {x: 0.99998504, y: 1.0000246, z: 1.000006}
- name: Finger_011
parentName: Hand_R
position: {x: 0.051991317, y: -0.012054317, z: 0.14853004}
rotation: {x: -0.09862376, y: -0.4650189, z: -0.056662206, w: 0.87796366}
scale: {x: 1.0000317, y: 1.0000064, z: 0.99998385}
- name: Finger_021
parentName: Finger_011
position: {x: 0.064152494, y: 0.000001623162, z: -0.000000044617604}
rotation: {x: 0.0035673294, y: 0.019343399, z: 0.028556446, w: 0.99939865}
scale: {x: 0.99999934, y: 1.0000025, z: 0.99999994}
- name: Finger_031
parentName: Finger_021
position: {x: 0.05329311, y: 0.0000014939407, z: 0.00000036493486}
rotation: {x: -0.024190418, y: -0.01847854, z: 0.03174947, w: 0.99903226}
scale: {x: 0.99999267, y: 1.0000077, z: 1.0000081}
- name: Finger_041
parentName: Finger_031
position: {x: 0.047220778, y: -0.000008236042, z: -0.00000043038915}
rotation: {x: 0.021918464, y: 0.09546615, z: -0.2226953, w: 0.9699549}
scale: {x: 1.0000049, y: 0.9999959, z: 1.0000011}
- name: UpperLeg_L
parentName: Hips
position: {x: -0.13062388, y: -8.881784e-18, z: -1.11022296e-17}
rotation: {x: -0.2668567, y: -0.21296209, z: 0.4994735, w: 0.7962166}
scale: {x: 1.0000015, y: 1.0000005, z: 1.0000014}
- name: LowerLeg_L
parentName: UpperLeg_L
position: {x: -0.37842098, y: 1.02140514e-16, z: 2.2204459e-17}
rotation: {x: -0.000000059604645, y: -0.000000059604645, z: 0.00000008940697, w: 1}
scale: {x: 1.0000012, y: 1.000002, z: 1.0000001}
- name: Ankle_L
parentName: LowerLeg_L
position: {x: -0.37842098, y: -0.00000000799083, z: -0.00000017884236}
rotation: {x: 0.7458739, y: 0.51436746, z: -0.19933213, w: 0.37331626}
scale: {x: 1.0000036, y: 1.0000004, z: 1.0000046}
- name: Ball_L
parentName: Ankle_L
position: {x: -0.12877615, y: 3.5527136e-17, z: 3.3500888e-17}
rotation: {x: 0.000000029802319, y: -0.00000004470348, z: -0.23606834, w: 0.97173643}
scale: {x: 1.0000024, y: 0.9999996, z: 1.0000001}
- name: Toes_L
parentName: Ball_L
position: {x: -0.0729575, y: 8.228515e-18, z: -1.3369588e-15}
rotation: {x: -0.000000005576654, y: -0.70710677, z: 0.0000000651813, w: 0.7071069}
scale: {x: 0.9999986, y: 0.9999992, z: 0.9999996}
- name: UpperLeg_R
parentName: Hips
position: {x: 0.102061786, y: -0.08152349, z: -1.1102199e-17}
rotation: {x: 0.58627963, y: -0.7346502, z: -0.2892203, w: 0.1814304}
scale: {x: 1.0000013, y: 1.0000021, z: 1.0000037}
- name: LowerLeg_R
parentName: UpperLeg_R
position: {x: 0.37842068, y: 0.00000027396194, z: 0.0000002682214}
rotation: {x: -0, y: 0.000000029802319, z: -0.00000008940696, w: 1}
scale: {x: 1.0000027, y: 1.0000032, z: 1.0000063}
- name: Ankle_R
parentName: LowerLeg_R
position: {x: 0.37842116, y: 0.0000002667152, z: 0.00000034490833}
rotation: {x: 0.74587387, y: 0.5143675, z: -0.19933215, w: 0.37331635}
scale: {x: 1.0000045, y: 1.0000076, z: 1.0000027}
- name: Ball_R
parentName: Ankle_R
position: {x: 0.12877613, y: -0.000000010258867, z: -1.0658141e-16}
rotation: {x: 0.000000014901159, y: 0.000000059604638, z: -0.23606828, w: 0.97173655}
scale: {x: 0.9999952, y: 1.0000138, z: 1.0000036}
- name: Toes_R
parentName: Ball_R
position: {x: 0.0729575, y: -4.0909496e-14, z: 3.5527136e-17}
rotation: {x: -0.000000010238907, y: -0.70710677, z: -0.000000064266885, w: 0.70710677}
scale: {x: 1.0000001, y: 1.0000001, z: 1.0000002}
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 1
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 3
humanoidOversampling: 1
avatarSetup: 1
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,37 @@
%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: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: "Data_Skill_Drog_\uD380\uCE58R"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uD380\uCE58R"
description:
icon: {fileID: 0}
skillRole: 1
activationType: 1
baseTypes: 0
skillClip: {fileID: 7400000, guid: c8fdea7dee0c6f04bbd27fe565071682, type: 2}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
allowedWeaponTraits: 0
cooldown: 0
manaCost: 0
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: 86bf7e282c1639c4889910475aaccdef, type: 2}
- {fileID: 0}

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -2083,7 +2083,7 @@ MonoBehaviour:
intelligence:
baseValue: 10
vitality:
baseValue: 10
baseValue: 100
wisdom:
baseValue: 10
spirit:
@@ -2153,6 +2153,7 @@ MonoBehaviour:
- {fileID: 712281148059590495, guid: b590c58b50c3b554687b172862fa5d9d, type: 3}
- {fileID: 6888780564265376159, guid: 827dfeae95fdf6b41b78698f2e846b5f, type: 3}
- {fileID: -8752051743343580635, guid: 5eaeca917bbeb494eb14ad0e0552c42f, type: 3}
- {fileID: 7400000, guid: c8fdea7dee0c6f04bbd27fe565071682, type: 2}
debugMode: 1
showAreaDebug: 1
debugDrawDuration: 1
@@ -2191,7 +2192,6 @@ MonoBehaviour:
navMeshAgent: {fileID: 5153439431748782209}
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}
comboPattern: {fileID: 11400000, guid: d4e7f2a6b8c31095e1a3c5d7f9b2d4e8, type: 2}
@@ -2203,9 +2203,6 @@ MonoBehaviour:
mobilityTriggerDistance: 8
punishSearchRadius: 6
utilityTriggerDistance: 5
phase1SecondaryInterval: 3
phase2SecondaryInterval: 2
phase3SecondaryInterval: 2
basicLoopMinCountAfterBigPattern: 2
signatureRequiredDamageRatio: 0.1
signatureTelegraphAbnormality: {fileID: 11400000, guid: fb1a782e44ff4dc19fd8b3c633360752, type: 2}

View File

@@ -475,6 +475,28 @@ namespace Colosseum.Enemy
Debug.Log($"[{source}] {message}");
}
/// <summary>
/// 모든 패턴 슬롯에 포함된 고유 스킬 목록을 반환합니다. 디버그 용도로 사용됩니다.
/// </summary>
public List<SkillData> GetAllPatternSkills()
{
HashSet<SkillData> skillSet = new HashSet<SkillData>();
BossPatternData[] allPatterns = { primaryPattern, mobilityPattern, utilityPattern, comboPattern, punishPattern, signaturePattern };
for (int i = 0; i < allPatterns.Length; i++)
{
BossPatternData pattern = allPatterns[i];
if (pattern?.Steps == null)
continue;
for (int j = 0; j < pattern.Steps.Count; j++)
{
PatternStep step = pattern.Steps[j];
if (step.Skill != null)
skillSet.Add(step.Skill);
}
}
return new List<SkillData>(skillSet);
}
/// <summary>
/// 지정 패턴이 grace period를 통과했는지 반환합니다.

View File

@@ -226,6 +226,15 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
""processors"": """",
""interactions"": """",
""initialStateCheck"": false
},
{
""name"": ""UIMode"",
""type"": ""Button"",
""id"": ""2bb668a6-fd21-4c59-b81a-9b8a4faf6e62"",
""expectedControlType"": """",
""processors"": """",
""interactions"": """",
""initialStateCheck"": false
}
],
""bindings"": [
@@ -613,6 +622,17 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
""action"": ""DebugHUD"",
""isComposite"": false,
""isPartOfComposite"": false
},
{
""name"": """",
""id"": ""600580e8-6722-42b9-b740-2b734603e4e1"",
""path"": ""<Keyboard>/leftAlt"",
""interactions"": """",
""processors"": """",
""groups"": "";Keyboard&Mouse"",
""action"": ""UIMode"",
""isComposite"": false,
""isPartOfComposite"": false
}
]
},
@@ -1213,6 +1233,7 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
m_Player_Skill6 = m_Player.FindAction("Skill 6", throwIfNotFound: true);
m_Player_Evade = m_Player.FindAction("Evade", throwIfNotFound: true);
m_Player_DebugHUD = m_Player.FindAction("DebugHUD", throwIfNotFound: true);
m_Player_UIMode = m_Player.FindAction("UIMode", throwIfNotFound: true);
// UI
m_UI = asset.FindActionMap("UI", throwIfNotFound: true);
m_UI_Navigate = m_UI.FindAction("Navigate", throwIfNotFound: true);
@@ -1321,6 +1342,7 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
private readonly InputAction m_Player_Skill6;
private readonly InputAction m_Player_Evade;
private readonly InputAction m_Player_DebugHUD;
private readonly InputAction m_Player_UIMode;
/// <summary>
/// Provides access to input actions defined in input action map "Player".
/// </summary>
@@ -1393,6 +1415,10 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
/// </summary>
public InputAction @DebugHUD => m_Wrapper.m_Player_DebugHUD;
/// <summary>
/// Provides access to the underlying input action "Player/UIMode".
/// </summary>
public InputAction @UIMode => m_Wrapper.m_Player_UIMode;
/// <summary>
/// Provides access to the underlying input action map instance.
/// </summary>
public InputActionMap Get() { return m_Wrapper.m_Player; }
@@ -1463,6 +1489,9 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
@DebugHUD.started += instance.OnDebugHUD;
@DebugHUD.performed += instance.OnDebugHUD;
@DebugHUD.canceled += instance.OnDebugHUD;
@UIMode.started += instance.OnUIMode;
@UIMode.performed += instance.OnUIMode;
@UIMode.canceled += instance.OnUIMode;
}
/// <summary>
@@ -1519,6 +1548,9 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
@DebugHUD.started -= instance.OnDebugHUD;
@DebugHUD.performed -= instance.OnDebugHUD;
@DebugHUD.canceled -= instance.OnDebugHUD;
@UIMode.started -= instance.OnUIMode;
@UIMode.performed -= instance.OnUIMode;
@UIMode.canceled -= instance.OnUIMode;
}
/// <summary>
@@ -1924,6 +1956,13 @@ public partial class @InputSystem_Actions: IInputActionCollection2, IDisposable
/// <seealso cref="UnityEngine.InputSystem.InputAction.performed" />
/// <seealso cref="UnityEngine.InputSystem.InputAction.canceled" />
void OnDebugHUD(InputAction.CallbackContext context);
/// <summary>
/// Method invoked when associated input action "UIMode" is either <see cref="UnityEngine.InputSystem.InputAction.started" />, <see cref="UnityEngine.InputSystem.InputAction.performed" /> or <see cref="UnityEngine.InputSystem.InputAction.canceled" />.
/// </summary>
/// <seealso cref="UnityEngine.InputSystem.InputAction.started" />
/// <seealso cref="UnityEngine.InputSystem.InputAction.performed" />
/// <seealso cref="UnityEngine.InputSystem.InputAction.canceled" />
void OnUIMode(InputAction.CallbackContext context);
}
/// <summary>
/// Interface to implement callback methods for all input action callbacks associated with input actions defined by "UI" which allows adding and removing callbacks.

View File

@@ -140,6 +140,15 @@
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "UIMode",
"type": "Button",
"id": "2bb668a6-fd21-4c59-b81a-9b8a4faf6e62",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
@@ -527,6 +536,17 @@
"action": "DebugHUD",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "600580e8-6722-42b9-b740-2b734603e4e1",
"path": "<Keyboard>/leftAlt",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "UIMode",
"isComposite": false,
"isPartOfComposite": false
}
]
},

View File

@@ -1,6 +1,8 @@
#if UNITY_EDITOR || DEVELOPMENT_BUILD
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
@@ -10,6 +12,12 @@ using Unity.Netcode;
using Colosseum.Enemy;
using Colosseum.Abnormalities;
using Colosseum.AI;
using Colosseum.Skills;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Colosseum.UI
{
@@ -35,6 +43,12 @@ namespace Colosseum.UI
private BossEnemy cachedBoss;
private bool suppressSliderCallback;
// 스킬 강제 발동
private TMP_Dropdown skillDropdown;
private List<SkillData> debugSkillList;
private SkillController debugSkillController;
private BossEnemy cachedBossForSkillDropdown;
// UI 참조
private GameObject toggleButtonObject;
private GameObject panelRoot;
@@ -61,6 +75,15 @@ namespace Colosseum.UI
{
if (panelRoot != null)
panelRoot.SetActive(false);
if (UIModeController.Instance != null)
UIModeController.Instance.OnUIModeChanged += OnUIModeChanged;
}
private void OnDestroy()
{
if (UIModeController.Instance != null)
UIModeController.Instance.OnUIModeChanged -= OnUIModeChanged;
}
private void Update()
@@ -70,6 +93,7 @@ namespace Colosseum.UI
return;
UpdateHPDisplay();
RefreshSkillDropdownIfNeeded();
}
/// <summary>
@@ -198,6 +222,7 @@ namespace Colosseum.UI
BuildBossControlSection(content.transform);
BuildShieldSection(content.transform);
BuildAbnormalitySection(content.transform);
BuildSkillForceSection(content.transform);
}
/// <summary>
@@ -267,6 +292,20 @@ namespace Colosseum.UI
MakeButton("위협 초기화", parent, OnClearThreat);
}
/// <summary>
/// 스킬 강제 발동 섹션
/// </summary>
private void BuildSkillForceSection(Transform parent)
{
MakeSectionHeader("스킬 강제 발동", parent);
skillDropdown = MakeDropdown("SkillDropdown", parent);
GameObject row = MakeRow(parent);
MakeButton("발동", row.transform, OnForceSkill, 80f);
MakeButton("취소", row.transform, OnCancelSkill, 80f);
}
// ──────────────────────────────────────────────────
// UI 업데이트
// ──────────────────────────────────────────────────
@@ -395,15 +434,154 @@ namespace Colosseum.UI
cachedBoss.ClearAllThreat();
}
// ──────────────────────────────────────────────────
// 스킬 강제 발동
// ──────────────────────────────────────────────────
/// <summary>
/// 보스가 변경되었으면 스킬 드롭다운을 갱신합니다.
/// </summary>
private void RefreshSkillDropdownIfNeeded()
{
if (skillDropdown == null)
return;
if (cachedBoss != cachedBossForSkillDropdown)
{
cachedBossForSkillDropdown = cachedBoss;
RebuildSkillDropdown();
}
}
/// <summary>
/// 드롭다운을 갱신합니다.
/// 에디터에서는 Data/Skills에서 보스 이름이 포함된 스킬을 모두 검색하고,
/// 빌드에서는 패턴 슬롯의 스킬만 표시합니다.
/// </summary>
private void RebuildSkillDropdown()
{
debugSkillController = cachedBoss != null
? cachedBoss.GetComponent<SkillController>()
: null;
if (cachedBoss == null || debugSkillController == null)
{
skillDropdown.ClearOptions();
skillDropdown.options.Add(new TMP_Dropdown.OptionData("보스 없음"));
skillDropdown.value = 0;
debugSkillList = null;
return;
}
#if UNITY_EDITOR
debugSkillList = LoadSkillsFromAssetFolder();
#else
debugSkillList = LoadSkillsFromPatternSlots();
#endif
if (debugSkillList == null || debugSkillList.Count == 0)
{
skillDropdown.ClearOptions();
skillDropdown.options.Add(new TMP_Dropdown.OptionData("스킬 없음"));
skillDropdown.value = 0;
return;
}
List<TMP_Dropdown.OptionData> options = new List<TMP_Dropdown.OptionData>();
for (int i = 0; i < debugSkillList.Count; i++)
{
string name = debugSkillList[i].SkillName;
options.Add(new TMP_Dropdown.OptionData(string.IsNullOrEmpty(name) ? $"Skill {i}" : name));
}
skillDropdown.ClearOptions();
skillDropdown.AddOptions(options);
}
#if UNITY_EDITOR
/// <summary>
/// 에디터 전용: Data/Skills에서 보스 이름이 포함된 SkillData를 모두 검색합니다.
/// </summary>
private List<SkillData> LoadSkillsFromAssetFolder()
{
string bossName = cachedBoss.gameObject.name;
string[] guids = AssetDatabase.FindAssets($"t:SkillData", new[] { "Assets/_Game/Data/Skills" });
List<SkillData> result = new List<SkillData>();
for (int i = 0; i < guids.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(guids[i]);
// 파일명에 보스 이름이 포함된 스킬만 필터링
if (path.Contains(bossName))
{
SkillData skill = AssetDatabase.LoadAssetAtPath<SkillData>(path);
if (skill != null)
result.Add(skill);
}
}
return result;
}
#endif
/// <summary>
/// 패턴 슬롯에서 고유 스킬을 수집합니다 (빌드용 fallback).
/// </summary>
private List<SkillData> LoadSkillsFromPatternSlots()
{
BossCombatBehaviorContext context = cachedBoss.GetComponent<BossCombatBehaviorContext>();
if (context == null)
return null;
return context.GetAllPatternSkills();
}
/// <summary>
/// 드롭다운에서 선택한 스킬을 강제 발동합니다.
/// </summary>
private void OnForceSkill()
{
if (!IsHost || NoBoss || debugSkillController == null || debugSkillList == null)
return;
int index = skillDropdown.value;
if (index < 0 || index >= debugSkillList.Count)
return;
if (debugSkillController.IsExecutingSkill)
debugSkillController.CancelSkill();
debugSkillController.ResetAllCooldowns();
debugSkillController.ExecuteSkill(debugSkillList[index]);
}
/// <summary>
/// 현재 실행 중인 스킬을 취소합니다.
/// </summary>
private void OnCancelSkill()
{
if (!IsHost || NoBoss || debugSkillController == null)
return;
if (debugSkillController.IsExecutingSkill)
debugSkillController.CancelSkill();
}
// ──────────────────────────────────────────────────
// 토글
// ──────────────────────────────────────────────────
private void TogglePanel()
{
isPanelOpen = !isPanelOpen;
if (UIModeController.Instance != null)
UIModeController.Instance.SetUIModeActive(!UIModeController.Instance.IsUIModeActive);
}
private void OnUIModeChanged(bool uiModeActive)
{
if (panelRoot != null)
panelRoot.SetActive(isPanelOpen);
panelRoot.SetActive(uiModeActive);
isPanelOpen = uiModeActive;
}
// ──────────────────────────────────────────────────
@@ -611,6 +789,148 @@ namespace Colosseum.UI
if (DefaultFont != null) t.font = DefaultFont;
return t;
}
private static TMP_Dropdown MakeDropdown(string name, Transform parent)
{
// 메인 드롭다운 오브젝트
GameObject dropdownGo = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(TMP_Dropdown));
dropdownGo.transform.SetParent(parent, false);
dropdownGo.AddComponent<LayoutElement>().preferredHeight = 30f;
// 캡션 라벨
GameObject captionGo = new GameObject("Caption", typeof(RectTransform), typeof(TextMeshProUGUI));
captionGo.transform.SetParent(dropdownGo.transform, false);
RectTransform captionRt = captionGo.GetComponent<RectTransform>();
captionRt.anchorMin = Vector2.zero;
captionRt.anchorMax = Vector2.one;
captionRt.offsetMin = new Vector2(10f, 1f);
captionRt.offsetMax = new Vector2(-25f, -2f);
TMP_Text captionText = captionGo.GetComponent<TextMeshProUGUI>();
captionText.text = "스킬 선택";
captionText.fontSize = 14f;
captionText.alignment = TextAlignmentOptions.MidlineLeft;
captionText.color = Color.white;
captionText.textWrappingMode = TextWrappingModes.NoWrap;
if (DefaultFont != null) captionText.font = DefaultFont;
// 화살표
GameObject arrowGo = new GameObject("Arrow", typeof(RectTransform), typeof(Image));
arrowGo.transform.SetParent(dropdownGo.transform, false);
RectTransform arrowRt = arrowGo.GetComponent<RectTransform>();
arrowRt.anchorMin = new Vector2(1f, 0.5f);
arrowRt.anchorMax = new Vector2(1f, 0.5f);
arrowRt.sizeDelta = new Vector2(20f, 20f);
arrowRt.pivot = new Vector2(0.5f, 0.5f);
arrowRt.anchoredPosition = new Vector2(-15f, 0f);
arrowGo.GetComponent<Image>().color = new Color(0.6f, 0.6f, 0.6f);
// 템플릿 (팝업 목록)
GameObject templateGo = new GameObject("Template", typeof(RectTransform), typeof(Image), typeof(ScrollRect));
templateGo.transform.SetParent(dropdownGo.transform, false);
templateGo.SetActive(false);
RectTransform templateRt = templateGo.GetComponent<RectTransform>();
templateRt.anchorMin = new Vector2(0f, -1f);
templateRt.anchorMax = new Vector2(1f, 0f);
templateRt.sizeDelta = new Vector2(0f, 150f);
templateRt.pivot = new Vector2(0.5f, 1f);
templateGo.GetComponent<Image>().color = new Color(0.15f, 0.15f, 0.15f, 0.95f);
ScrollRect scroll = templateGo.GetComponent<ScrollRect>();
scroll.horizontal = false;
scroll.movementType = ScrollRect.MovementType.Clamped;
scroll.scrollSensitivity = 20f;
// 뷰포트
GameObject viewportGo = new GameObject("Viewport", typeof(RectTransform), typeof(Image));
viewportGo.transform.SetParent(templateGo.transform, false);
RectTransform viewportRt = viewportGo.GetComponent<RectTransform>();
viewportRt.anchorMin = Vector2.zero;
viewportRt.anchorMax = Vector2.one;
viewportRt.sizeDelta = Vector2.zero;
viewportRt.pivot = new Vector2(0f, 1f);
viewportGo.GetComponent<Image>().color = Color.clear;
scroll.viewport = viewportRt;
// 콘텐츠
GameObject contentGo = new GameObject("Content", typeof(RectTransform), typeof(VerticalLayoutGroup), typeof(ContentSizeFitter));
contentGo.transform.SetParent(viewportGo.transform, false);
RectTransform contentRt = contentGo.GetComponent<RectTransform>();
contentRt.anchorMin = new Vector2(0f, 1f);
contentRt.anchorMax = new Vector2(1f, 1f);
contentRt.pivot = new Vector2(0.5f, 1f);
contentRt.sizeDelta = Vector2.zero;
contentRt.anchoredPosition = Vector2.zero;
VerticalLayoutGroup vlg = contentGo.GetComponent<VerticalLayoutGroup>();
vlg.childAlignment = TextAnchor.MiddleLeft;
vlg.childControlWidth = true;
vlg.childControlHeight = true;
vlg.childForceExpandWidth = true;
vlg.childForceExpandHeight = false;
contentGo.GetComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
scroll.content = contentRt;
// 아이템 템플릿
GameObject itemGo = new GameObject("Item", typeof(RectTransform), typeof(Toggle));
itemGo.transform.SetParent(contentGo.transform, false);
RectTransform itemRt = itemGo.GetComponent<RectTransform>();
itemRt.anchorMin = new Vector2(0f, 0.5f);
itemRt.anchorMax = new Vector2(1f, 0.5f);
itemRt.sizeDelta = new Vector2(0f, 20f);
LayoutElement itemLe = itemGo.AddComponent<LayoutElement>();
itemLe.preferredHeight = 20f;
itemLe.minHeight = 20f;
// 아이템 배경
GameObject itemBgGo = new GameObject("Item Background", typeof(RectTransform), typeof(Image));
itemBgGo.transform.SetParent(itemGo.transform, false);
RectTransform itemBgRt = itemBgGo.GetComponent<RectTransform>();
itemBgRt.anchorMin = Vector2.zero;
itemBgRt.anchorMax = Vector2.one;
itemBgRt.sizeDelta = Vector2.zero;
itemBgGo.GetComponent<Image>().color = new Color(0.25f, 0.25f, 0.25f, 1f);
// 아이템 체크마크
GameObject checkGo = new GameObject("Item Checkmark", typeof(RectTransform), typeof(Image));
checkGo.transform.SetParent(itemGo.transform, false);
RectTransform checkRt = checkGo.GetComponent<RectTransform>();
checkRt.anchorMin = new Vector2(0f, 0.5f);
checkRt.anchorMax = new Vector2(0f, 0.5f);
checkRt.sizeDelta = new Vector2(20f, 20f);
checkRt.pivot = new Vector2(0.5f, 0.5f);
checkRt.anchoredPosition = new Vector2(10f, 0f);
// 아이템 라벨
GameObject itemLabelGo = new GameObject("Item Label", typeof(RectTransform), typeof(TextMeshProUGUI));
itemLabelGo.transform.SetParent(itemGo.transform, false);
RectTransform itemLabelRt = itemLabelGo.GetComponent<RectTransform>();
itemLabelRt.anchorMin = Vector2.zero;
itemLabelRt.anchorMax = Vector2.one;
itemLabelRt.offsetMin = new Vector2(20f, 1f);
itemLabelRt.offsetMax = new Vector2(-5f, -2f);
TMP_Text itemLabelText = itemLabelGo.GetComponent<TextMeshProUGUI>();
itemLabelText.fontSize = 14f;
itemLabelText.alignment = TextAlignmentOptions.MidlineLeft;
itemLabelText.color = Color.white;
itemLabelText.textWrappingMode = TextWrappingModes.NoWrap;
if (DefaultFont != null) itemLabelText.font = DefaultFont;
// 토글 연결
Toggle toggle = itemGo.GetComponent<Toggle>();
toggle.targetGraphic = itemBgGo.GetComponent<Image>();
toggle.graphic = checkGo.GetComponent<Image>();
toggle.isOn = false;
// 드롭다운 연결
TMP_Dropdown dropdown = dropdownGo.GetComponent<TMP_Dropdown>();
dropdown.targetGraphic = dropdownGo.GetComponent<Image>();
dropdown.captionText = captionText;
dropdown.itemText = itemLabelText;
dropdown.template = templateRt;
return dropdown;
}
}
}

View File

@@ -34,7 +34,7 @@ namespace Colosseum.UI
[Tooltip("토글 버튼에 표시할 텍스트")]
[SerializeField] private string toggleButtonLabel = "패시브";
[Tooltip("토글 버튼의 캔버스 기준 위치")]
[SerializeField] private Vector2 toggleButtonAnchoredPosition = new Vector2(-132f, 48f);
[SerializeField] private Vector2 toggleButtonAnchoredPosition = new Vector2(-10f, 46f);
[Header("Debug")]
[Tooltip("플레이 모드 시작 시 패널을 자동으로 엽니다.")]
@@ -380,7 +380,7 @@ namespace Colosseum.UI
RectTransform toggleRect = viewInstance.ToggleButton.GetComponent<RectTransform>();
if (toggleRect != null)
{
toggleRect.anchoredPosition = toggleButtonAnchoredPosition;
toggleRect.anchoredPosition = new Vector2(-10f, 50f);
}
}
}
@@ -412,7 +412,7 @@ namespace Colosseum.UI
buttonRect.anchorMin = new Vector2(1f, 0f);
buttonRect.anchorMax = new Vector2(1f, 0f);
buttonRect.pivot = new Vector2(1f, 0f);
buttonRect.anchoredPosition = toggleButtonAnchoredPosition;
buttonRect.anchoredPosition = new Vector2(-10f, 50f);
buttonRect.sizeDelta = new Vector2(110f, 40f);
Image buttonImage = buttonObject.AddComponent<Image>();

View File

@@ -49,7 +49,7 @@ namespace Colosseum.UI
[Tooltip("토글 버튼에 표시할 텍스트")]
[SerializeField] private string toggleButtonLabel = "젬";
[Tooltip("토글 버튼의 캔버스 기준 위치")]
[SerializeField] private Vector2 toggleButtonAnchoredPosition = new Vector2(-48f, 164f);
[SerializeField] private Vector2 toggleButtonAnchoredPosition = new Vector2(-10f, 82f);
[Header("Storage")]
[Tooltip("젬 보관 수량")]
@@ -327,7 +327,7 @@ namespace Colosseum.UI
buttonRect.anchorMin = new Vector2(1f, 0f);
buttonRect.anchorMax = new Vector2(1f, 0f);
buttonRect.pivot = new Vector2(1f, 0f);
buttonRect.anchoredPosition = toggleButtonAnchoredPosition;
buttonRect.anchoredPosition = new Vector2(-10f, 90f);
buttonRect.sizeDelta = new Vector2(72f, 34f);
Image buttonImage = buttonObject.AddComponent<Image>();

View File

@@ -0,0 +1,151 @@
#if UNITY_EDITOR || DEVELOPMENT_BUILD
using System;
using UnityEngine;
using Colosseum.Player;
namespace Colosseum.UI
{
/// <summary>
/// 공용 UI 모드 컨트롤러.
/// UIMode 입력(leftAlt)으로 커서 표시/숨김과 게임플레이 입력 차단을 토글합니다.
/// </summary>
[DisallowMultipleComponent]
public class UIModeController : MonoBehaviour
{
private static UIModeController instance;
/// <summary>
/// 현재 활성화된 UIModeController 인스턴스
/// </summary>
public static UIModeController Instance => instance;
/// <summary>
/// UI 모드 활성화 여부
/// </summary>
public bool IsUIModeActive { get; private set; }
/// <summary>
/// UI 모드 상태 변경 이벤트
/// </summary>
public event Action<bool> OnUIModeChanged;
private InputSystem_Actions inputActions;
private PlayerMovement playerMovement;
private PlayerSkillInput playerSkillInput;
private bool previousCursorVisible;
private CursorLockMode previousCursorLockState;
private void Awake()
{
if (instance != null && instance != this)
{
Destroy(gameObject);
return;
}
instance = this;
}
private void OnDestroy()
{
if (instance == this)
instance = null;
CleanupInput();
}
private void Start()
{
InitializeInput();
}
private void Update()
{
if (playerSkillInput == null)
FindLocalPlayerReferences();
}
private void InitializeInput()
{
if (inputActions != null)
return;
inputActions = new InputSystem_Actions();
inputActions.Player.UIMode.performed += OnUIModePerformed;
inputActions.Player.UIMode.Enable();
}
private void CleanupInput()
{
if (inputActions != null)
{
inputActions.Player.UIMode.performed -= OnUIModePerformed;
inputActions.Player.UIMode.Disable();
inputActions.Dispose();
inputActions = null;
}
}
private void FindLocalPlayerReferences()
{
PlayerSkillInput[] skillInputs = FindObjectsByType<PlayerSkillInput>(FindObjectsSortMode.None);
for (int i = 0; i < skillInputs.Length; i++)
{
if (skillInputs[i] != null && skillInputs[i].IsOwner)
{
playerSkillInput = skillInputs[i];
playerMovement = skillInputs[i].GetComponent<PlayerMovement>();
break;
}
}
}
/// <summary>
/// UI 모드를 수동으로 설정합니다.
/// </summary>
public void SetUIModeActive(bool active)
{
if (IsUIModeActive == active)
return;
IsUIModeActive = active;
if (active)
{
previousCursorVisible = Cursor.visible;
previousCursorLockState = Cursor.lockState;
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
SetGameplayInputBlocked(true);
}
else
{
SetGameplayInputBlocked(false);
Cursor.visible = previousCursorVisible;
Cursor.lockState = previousCursorLockState;
}
OnUIModeChanged?.Invoke(IsUIModeActive);
}
private void OnUIModePerformed(UnityEngine.InputSystem.InputAction.CallbackContext context)
{
SetUIModeActive(!IsUIModeActive);
}
private void SetGameplayInputBlocked(bool blocked)
{
if (playerMovement != null)
playerMovement.SetGameplayInputEnabled(!blocked);
if (playerSkillInput != null)
playerSkillInput.SetGameplayInputEnabled(!blocked);
}
}
}
#endif

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 3faf1bf9fabb1c24bbe4c2c2f4b400da

View File

@@ -12,7 +12,7 @@ EditorBuildSettings:
path: Assets/Scenes/SampleScene.unity
guid: 99c9720ab356a0642a771bea13969a05
- enabled: 1
path: Assets/Scenes/Test.unity
path: Assets/Scenes/Drog.unity
guid: f727fa008df302a4f839260c2d345287
- enabled: 1
path: Assets/Scenes/BalanceDummy.unity