Compare commits

...

4 Commits

Author SHA1 Message Date
829ff77e4b feat: UI 폰트 시스템 적용 및 HUD 타이포 보정
- 수성바탕체와 마루 부리 기반 UI 폰트 규칙, TMP 에셋 생성, 일괄 적용용 에디터 도구를 추가하고 로비 빌더도 같은 규칙을 따르도록 정리
- 기존 UI 프리팹과 Lobby/Test 씬의 TMP 폰트를 역할별로 교체하고 강조 텍스트와 HUD 계층에 맞는 자간을 반영
- 넥슨 Lv.2 고딕 검토 후 제외하고 액션바, HP/MP, 보스 체력바 숫자와 라벨을 마루 부리 기준으로 재조정
- Assets/_Game/Fonts 경로에 원본 폰트와 TMP 에셋을 정리하고 공유 Obsidian Vault 경로를 AGENTS에 기록
- Unity 리프레시와 HUD 보정 적용 후 콘솔 경고/에러 없는 상태를 확인
2026-03-24 16:50:15 +09:00
fe53d90929 fix: 긴급회피 액션 슬롯 키 라벨을 L-CTRL로 정리 2026-03-24 12:30:09 +09:00
543b83e707 feat: 플레이어 자원/액션바 HUD 분리 및 긴급회피 슬롯 추가 2026-03-24 12:30:09 +09:00
0889bb0f25 feat: 드로그 집행 개시 패턴 및 낙인 디버프 추가
- 드로그 시그니처 패턴 역할과 집행 개시 패턴 데이터를 추가하고 BT 브랜치에 연결
- 시그니처 차단 성공과 실패 흐름을 BossCombatBehaviorContext에 구현하고 authoring 그래프를 재구성
- 집행자의 낙인 이상상태를 추가하고 받는 피해 배율 증가가 플레이어 대미지 계산에 반영되도록 정리
- 집행 실패 시 광역 피해, 넉백, 다운, 낙인 부여 설정을 드로그 프리팹에 연결
- 성공 경로 검증 중 확인된 보스 Hit 트리거 오류를 방어 로직으로 수정
- Unity 플레이 검증으로 집행 개시 실패와 성공 분기를 모두 확인하고 설계값은 원복
2026-03-23 18:14:18 +09:00
52 changed files with 59595 additions and 2152 deletions

View File

@@ -11,7 +11,10 @@ Multiplayer arena game built with **Unity 6000.3.10f1** and **Unity Netcode for
## Game Design Documentation
Design docs are maintained in Obsidian Vault: `C:\Users\dal4s\OneDrive\문서\Obsidian Vault\Colosseum`
Design docs are maintained in Obsidian Vault: `\\Truenas\smb\Obsidian Vault\Colosseum`
- Always use the shared Obsidian Vault at `\\Truenas\smb\Obsidian Vault\Colosseum` for project documentation updates.
- Do not write Colosseum design notes to `C:\Users\dal4s\OneDrive\문서\Obsidian Vault\Colosseum`; that path is not the active vault for this project.
### Game Concept
- **Genre**: Online multiplayer co-op action RPG (3rd person)
@@ -327,6 +330,7 @@ public class NetworkedComponent : NetworkBehaviour
- After Unity-related edits, refresh or compile as needed and check the Unity console before proceeding.
- For networked play tests, prefer a temporary non-conflicting test port when needed and restore the default port after validation.
- The user has a strong project preference that play mode must be stopped before edits because network ports can remain occupied otherwise.
- Commit messages should follow the recent project history style: use a type prefix such as `feat:` or `fix:` and describe the actual gameplay/UI/system change in Korean with enough detail to understand the scope from the log alone.
- All code comments and documentation should be in Korean
- Use `[Min()]` attribute for numeric minimums in Inspector
- Use `[TextArea]` for multi-line string fields

View File

@@ -178,11 +178,13 @@ MonoBehaviour:
m_Calls: []
m_text: Host IP (127.0.0.1)
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 782602759}
m_fontSharedMaterials:
- {fileID: 782602759}
m_fontMaterial: {fileID: 782602759}
m_fontMaterials:
- {fileID: 782602759}
m_fontColor32:
serializedVersion: 2
rgba: 4286611584
@@ -298,7 +300,7 @@ MonoBehaviour:
ConnectionData:
Address: 127.0.0.1
Port: 7777
ServerListenAddress:
ServerListenAddress: 127.0.0.1
ClientBindPort: 0
DebugSimulator:
PacketDelayMS: 0
@@ -609,8 +611,8 @@ MonoBehaviour:
m_Calls: []
m_text: Host
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -1148,8 +1150,8 @@ MonoBehaviour:
m_Calls: []
m_text: Waiting Room
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 328598426}
m_fontAsset: {fileID: 11400000, guid: 7e0884bf8d117154792024b547287f9d, type: 2}
m_sharedMaterial: {fileID: -8395004629330540845, guid: 7e0884bf8d117154792024b547287f9d, type: 2}
m_fontSharedMaterials:
- {fileID: 328598426}
m_fontMaterial: {fileID: 328598426}
@@ -1185,7 +1187,7 @@ MonoBehaviour:
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterSpacing: 4
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
@@ -1287,11 +1289,13 @@ MonoBehaviour:
m_Calls: []
m_text: Port (7777)
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 797016364}
m_fontSharedMaterials:
- {fileID: 797016364}
m_fontMaterial: {fileID: 797016364}
m_fontMaterials:
- {fileID: 797016364}
m_fontColor32:
serializedVersion: 2
rgba: 4286611584
@@ -1486,6 +1490,207 @@ MonoBehaviour:
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!21 &782602759
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: MaruBuri - Regular Material (Instance)
m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: -6190233401105062148, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _ColorMask: 15
- _CullMode: 0
- _FaceDilate: 0
- _GradientScale: 10
- _MaskSoftnessX: 0
- _MaskSoftnessY: 0
- _OutlineSoftness: 0
- _OutlineWidth: 0
- _PerspectiveFilter: 0.875
- _ScaleRatioA: 0.9
- _ScaleRatioB: 1
- _ScaleRatioC: 0.73125
- _ScaleX: 1
- _ScaleY: 1
- _ShaderFlags: 0
- _Sharpness: 0
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _TextureHeight: 1024
- _TextureWidth: 1024
- _UnderlayDilate: 0
- _UnderlayOffsetX: 0
- _UnderlayOffsetY: 0
- _UnderlaySoftness: 0
- _VertexOffsetX: 0
- _VertexOffsetY: 0
- _WeightBold: 0.75
- _WeightNormal: 0
m_Colors:
- _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
- _OutlineColor: {r: 0, g: 0, b: 0, a: 1}
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!21 &797016364
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: MaruBuri - Regular Material (Instance)
m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: -6190233401105062148, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _ColorMask: 15
- _CullMode: 0
- _FaceDilate: 0
- _GradientScale: 10
- _MaskSoftnessX: 0
- _MaskSoftnessY: 0
- _OutlineSoftness: 0
- _OutlineWidth: 0
- _PerspectiveFilter: 0.875
- _ScaleRatioA: 0.9
- _ScaleRatioB: 1
- _ScaleRatioC: 0.73125
- _ScaleX: 1
- _ScaleY: 1
- _ShaderFlags: 0
- _Sharpness: 0
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _TextureHeight: 1024
- _TextureWidth: 1024
- _UnderlayDilate: 0
- _UnderlayOffsetX: 0
- _UnderlayOffsetY: 0
- _UnderlaySoftness: 0
- _VertexOffsetX: 0
- _VertexOffsetY: 0
- _WeightBold: 0.75
- _WeightNormal: 0
m_Colors:
- _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
- _OutlineColor: {r: 0, g: 0, b: 0, a: 1}
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!21 &904460488
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: MaruBuri - Regular Material (Instance)
m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: -6190233401105062148, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _ColorMask: 15
- _CullMode: 0
- _FaceDilate: 0
- _GradientScale: 10
- _MaskSoftnessX: 0
- _MaskSoftnessY: 0
- _OutlineSoftness: 0
- _OutlineWidth: 0
- _PerspectiveFilter: 0.875
- _ScaleRatioA: 0.9
- _ScaleRatioB: 1
- _ScaleRatioC: 0.73125
- _ScaleX: 1
- _ScaleY: 1
- _ShaderFlags: 0
- _Sharpness: 0
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _TextureHeight: 1024
- _TextureWidth: 1024
- _UnderlayDilate: 0
- _UnderlayOffsetX: 0
- _UnderlayOffsetY: 0
- _UnderlaySoftness: 0
- _VertexOffsetX: 0
- _VertexOffsetY: 0
- _WeightBold: 0.75
- _WeightNormal: 0
m_Colors:
- _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
- _OutlineColor: {r: 0, g: 0, b: 0, a: 1}
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!1 &1106669273
GameObject:
m_ObjectHideFlags: 0
@@ -2028,11 +2233,13 @@ MonoBehaviour:
m_Calls: []
m_text: Colosseum Lobby
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontAsset: {fileID: 11400000, guid: 7e0884bf8d117154792024b547287f9d, type: 2}
m_sharedMaterial: {fileID: 1977247534}
m_fontSharedMaterials:
- {fileID: 1977247534}
m_fontMaterial: {fileID: 1977247534}
m_fontMaterials:
- {fileID: 1977247534}
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
@@ -2063,7 +2270,7 @@ MonoBehaviour:
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterSpacing: 4
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
@@ -2173,8 +2380,8 @@ MonoBehaviour:
m_Calls: []
m_text:
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -2302,8 +2509,8 @@ MonoBehaviour:
m_Calls: []
m_text: "\u200B"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -2439,11 +2646,13 @@ MonoBehaviour:
m_Calls: []
m_text: "\u200B"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 904460488}
m_fontSharedMaterials:
- {fileID: 904460488}
m_fontMaterial: {fileID: 904460488}
m_fontMaterials:
- {fileID: 904460488}
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
@@ -2576,8 +2785,8 @@ MonoBehaviour:
m_Calls: []
m_text: Ready
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -2713,8 +2922,8 @@ MonoBehaviour:
m_Calls: []
m_text: Join
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -3028,8 +3237,8 @@ MonoBehaviour:
m_Calls: []
m_text: Leave
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -3213,6 +3422,73 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1890856429}
m_CullTransparentMesh: 1
--- !u!21 &1977247534
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Suseong Batang - Regular Material (Instance)
m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: -4826028298590070284, guid: 7e0884bf8d117154792024b547287f9d, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _ColorMask: 15
- _CullMode: 0
- _FaceDilate: 0
- _GradientScale: 10
- _MaskSoftnessX: 0
- _MaskSoftnessY: 0
- _OutlineSoftness: 0
- _OutlineWidth: 0
- _PerspectiveFilter: 0.875
- _ScaleRatioA: 0.9
- _ScaleRatioB: 1
- _ScaleRatioC: 0.73125
- _ScaleX: 1
- _ScaleY: 1
- _ShaderFlags: 0
- _Sharpness: 0
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _TextureHeight: 1024
- _TextureWidth: 1024
- _UnderlayDilate: 0
- _UnderlayOffsetX: 0
- _UnderlayOffsetY: 0
- _UnderlaySoftness: 0
- _VertexOffsetX: 0
- _VertexOffsetY: 0
- _WeightBold: 0.75
- _WeightNormal: 0
m_Colors:
- _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
- _OutlineColor: {r: 0, g: 0, b: 0, a: 1}
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!1 &2038582761
GameObject:
m_ObjectHideFlags: 0
@@ -3344,8 +3620,8 @@ MonoBehaviour:
m_Calls: []
m_text: Start Game
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
%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: b08cc671f858a3b409170a5356e960a0, type: 3}
m_Name: "Data_Abnormality_Player_\uC9D1\uD589\uC790\uC758\uB099\uC778"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
abnormalityName: "\uC9D1\uD589\uC790\uC758 \uB099\uC778"
icon: {fileID: 0}
duration: 0
level: 1
isDebuff: 1
statModifiers: []
periodicInterval: 0
periodicValue: 0
controlType: 0
slowMultiplier: 0.5
incomingDamageMultiplier: 1.1

View File

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

View File

@@ -0,0 +1,23 @@
%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_\uC9D1\uD589\uAC1C\uC2DC"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.AI.BossPatternData
patternName: "\uC9D1\uD589\uAC1C\uC2DC"
steps:
- Type: 0
Skill: {fileID: 11400000, guid: 99de24df2cb0464d9d4f633efde8dbdb, type: 2}
Duration: 0
- Type: 1
Skill: {fileID: 0}
Duration: 6.5
cooldown: 45

View File

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

View File

@@ -0,0 +1,29 @@
%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_\uC9D1\uD589\uAC1C\uC2DC"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uC9D1\uD589\uAC1C\uC2DC"
description: "\uB4DC\uB85C\uADF8\uAC00 \uD798\uC744 \uB04C\uC5B4\uBAA8\uC73C\uBA70 \uC9D1\uD589\uC744 \uC900\uBE44\uD569\uB2C8\uB2E4."
icon: {fileID: 0}
skillClip: {fileID: -5764696784021583549, guid: 5eaeca917bbeb494eb14ad0e0552c42f, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 0
ignoreRootMotionY: 0
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 0
manaCost: 0
effects: []

View File

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

8
Assets/_Game/Fonts.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: abd35c080e8e3164897384131636d30f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
fileFormatVersion: 2
guid: c8ef714edc9c1ca49b7c466860417030
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontNames:
- MaruBuri
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
shouldRoundAdvanceValue: 1
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
fileFormatVersion: 2
guid: 92b87ffcb3e77ee4e960086335ac337a
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontNames:
- NEXON Lv2 Gothic
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
shouldRoundAdvanceValue: 1
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
fileFormatVersion: 2
guid: b2ea135d82c7dc842bb41c7434349179
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontNames:
- Suseong Batang
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
shouldRoundAdvanceValue: 1
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cc5c1382ed1ed0b42b5c601f747a40af
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

View File

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

View File

@@ -2190,6 +2190,7 @@ MonoBehaviour:
slamPattern: {fileID: 11400000, guid: 4a52d59d590b4eaa9ef92b7984eb08c7, type: 2}
leapPattern: {fileID: 11400000, guid: 88e6cc7cab28baf4c8f8a742247000ec, type: 2}
downPunishPattern: {fileID: 11400000, guid: fe5100f855d14c0faac44b6d4f2c771e, type: 2}
signaturePattern: {fileID: 11400000, guid: 5e732b41722c45288bb6234f3e3fa638, type: 2}
phase2HealthThreshold: 0.75
phase3HealthThreshold: 0.4
targetRefreshInterval: 0.2
@@ -2198,6 +2199,16 @@ MonoBehaviour:
phase1SlamInterval: 3
phase2SlamInterval: 2
phase3SlamInterval: 2
signatureMinPhase: 2
signatureRequiredDamageRatio: 0.1
signatureSuccessStaggerDuration: 2
signatureFailureAbnormality: {fileID: 11400000, guid: bc74f1485ad140c28cc14b821e22c127, type: 2}
signatureFailureDamage: 40
signatureFailureKnockbackRadius: 8
signatureFailureDownRadius: 3
signatureFailureKnockbackSpeed: 12
signatureFailureKnockbackDuration: 0.35
signatureFailureDownDuration: 2
disableBehaviorGraph: 0
debugMode: 1
--- !u!114 &7544406269366897481

View File

@@ -474,10 +474,22 @@ PrefabInstance:
propertyPath: m_margin.z
value: -4.115387
objectReference: {fileID: 0}
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
propertyPath: m_fontSizeBase
value: 16
objectReference: {fileID: 0}
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
propertyPath: m_characterSpacing
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
propertyPath: m_VerticalAlignment
value: 256

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 49cc51b51d25b2e4f85ceec039fb545c
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 57e5d30f9d5f9724eba1a18f03be3889
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -88,81 +88,6 @@ MonoBehaviour:
rawImage: {fileID: 8524252734736764718}
speed: {x: -0.1, y: 0}
size: {x: 256, y: 64}
--- !u!1 &887616750182392209
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 9180799155483852847}
- component: {fileID: 2815095170849506622}
- component: {fileID: 3077997186489176163}
m_Layer: 5
m_Name: SPR_Greeble_Demon
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &9180799155483852847
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 887616750182392209}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7303605616070184167}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 39.1}
m_SizeDelta: {x: 180, y: 90}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2815095170849506622
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 887616750182392209}
m_CullTransparentMesh: 1
--- !u!114 &3077997186489176163
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 887616750182392209}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 238e31403ddb5f04c92a6a6edcda17f5, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &1833205063244138202
GameObject:
m_ObjectHideFlags: 0
@@ -172,7 +97,7 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 1384280946776679044}
- component: {fileID: 7123456789012345678}
- component: {fileID: 2655491180900726042}
m_Layer: 5
m_Name: UI_BossHealthBar
m_TagString: Untagged
@@ -187,9 +112,9 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1833205063244138202}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
m_LocalScale: {x: 0.72, y: 0.72, z: 0.72}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7303605616070184167}
@@ -198,8 +123,26 @@ RectTransform:
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: 0, y: -200}
m_SizeDelta: {x: 1000, y: 40}
m_SizeDelta: {x: 920, y: 36}
m_Pivot: {x: 0.5, y: 1}
--- !u!114 &2655491180900726042
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1833205063244138202}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 892f9842e85256b47b24e0aab016820b, type: 3}
m_Name:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.UI.BossHealthBarUI
healthSlider: {fileID: 1229044099469274636}
healthText: {fileID: 6434164023740824016}
bossNameText: {fileID: 7053117599274393893}
targetBoss: {fileID: 0}
hideOnDeath: 1
lerpSpeed: 15
--- !u!1 &5163086717113548400
GameObject:
m_ObjectHideFlags: 0
@@ -378,7 +321,6 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 9180799155483852847}
- {fileID: 5303515918785520477}
- {fileID: 7061785310460012807}
- {fileID: 822400900121516796}
@@ -409,19 +351,35 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontSize
value: 43.9
value: 30
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontStyle
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontSizeMax
value: 56
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontSizeBase
value: 30
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2100000, guid: a3063f2d22ae4ba44828c3885272eaf2, type: 2}
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_characterSpacing
value: -1
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_enableAutoSizing
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_VerticalAlignment
@@ -568,6 +526,17 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
--- !u!114 &6434164023740824016 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
m_PrefabInstance: {fileID: 4821873919640174508}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!224 &8872377597972643978 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 4164625289371221798, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
@@ -581,6 +550,102 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 7303605616070184167}
m_Modifications:
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_RootOrder
value: 5
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMax.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_SizeDelta.x
value: -50
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchoredPosition.x
value: -20
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchoredPosition.y
value: 43
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_text
value: John the Impaler
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_fontSize
value: 34
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: 7e0884bf8d117154792024b547287f9d, type: 2}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_fontSizeMax
value: 56
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_fontSizeBase
value: 34
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: -8395004629330540845, guid: 7e0884bf8d117154792024b547287f9d, type: 2}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_characterSpacing
value: 3
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_enableAutoSizing
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_HorizontalAlignment
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: 'm_ActiveFontFeatures.Array.data[0]'
value: 1801810542
objectReference: {fileID: 0}
- target: {fileID: 4546473359128379108, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_Name
value: Label_BossName
objectReference: {fileID: 0}
- target: {fileID: 378538600947842191, guid: 289e34102b96a4515a667a4f636007c0, type: 3}
propertyPath: m_Name
value: Label_BossName
@@ -669,99 +734,22 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_RootOrder
value: 5
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMax.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_SizeDelta.x
value: -50
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchoredPosition.x
value: -20
objectReference: {fileID: 0}
- target: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_AnchoredPosition.y
value: 43
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_text
value: John the Impaler
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_fontSize
value: 56
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_fontSizeMax
value: 56
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_fontSizeBase
value: 56
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2100000, guid: a3063f2d22ae4ba44828c3885272eaf2, type: 2}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_enableAutoSizing
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_HorizontalAlignment
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: 'm_ActiveFontFeatures.Array.data[0]'
value: 1801810542
objectReference: {fileID: 0}
- target: {fileID: 4546473359128379108, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
propertyPath: m_Name
value: Label_BossName
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
--- !u!114 &7053117599274393893 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 3420556218193743673, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
m_PrefabInstance: {fileID: 5663827212940307996}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!224 &7543839057773374457 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 2749708641982727653, guid: 0ed0a70e5a4682c4c9e105178800133f, type: 3}
@@ -963,6 +951,17 @@ PrefabInstance:
insertIndex: -1
addedObject: {fileID: 1310706873006053288}
m_SourcePrefab: {fileID: 100100000, guid: f7b3a50e852da2c40b98f9d4cf10e289, type: 3}
--- !u!114 &1229044099469274636 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 7156924125190553902, guid: f7b3a50e852da2c40b98f9d4cf10e289, type: 3}
m_PrefabInstance: {fileID: 8240726994871906082}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3264878362326918023}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1416821347091459177 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 7058686565070685003, guid: f7b3a50e852da2c40b98f9d4cf10e289, type: 3}

View File

@@ -142,8 +142,8 @@ MonoBehaviour:
m_Calls: []
m_text: 10
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 0}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -335,8 +335,8 @@ MonoBehaviour:
m_Calls: []
m_text: Game Over
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: 7e0884bf8d117154792024b547287f9d, type: 2}
m_sharedMaterial: {fileID: 0}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -370,7 +370,7 @@ MonoBehaviour:
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterSpacing: 5
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0

View File

@@ -350,8 +350,8 @@ MonoBehaviour:
m_Calls: []
m_text: Health Point
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
m_sharedMaterial: {fileID: -6627135030329028012, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -375,17 +375,17 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 32
m_fontSizeBase: 32
m_fontSize: 30
m_fontSizeBase: 30
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_fontStyle: 1
m_HorizontalAlignment: 2
m_VerticalAlignment: 1024
m_textAlignment: 65535
m_characterSpacing: 0
m_characterSpacing: -1
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0

View File

@@ -420,8 +420,8 @@ MonoBehaviour:
m_Calls: []
m_text: Mana Point
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
m_sharedMaterial: {fileID: -6627135030329028012, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -445,17 +445,17 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 32
m_fontSizeBase: 32
m_fontSize: 30
m_fontSizeBase: 30
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_fontStyle: 1
m_HorizontalAlignment: 2
m_VerticalAlignment: 1024
m_textAlignment: 65535
m_characterSpacing: 0
m_characterSpacing: -1
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6a6d1b384d7c82f49802f1650bb34b40
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -67,8 +67,8 @@ MonoBehaviour:
m_Calls: []
m_text: Player
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
m_sharedMaterial: {fileID: 0}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -149,7 +149,7 @@ GameObject:
- component: {fileID: 2619735212364195173}
- component: {fileID: 5129437633899893877}
m_Layer: 0
m_Name: PlayerSlot
m_Name: UI_PlayerSlot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0

View File

@@ -17,7 +17,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &7251707132790510
RectTransform:
m_ObjectHideFlags: 0
@@ -279,7 +279,7 @@ RectTransform:
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 1000, y: 160}
m_SizeDelta: {x: 700, y: 140}
m_Pivot: {x: 0.5, y: 0}
--- !u!114 &5745543168284002773
MonoBehaviour:
@@ -313,7 +313,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &638920959796156018
RectTransform:
m_ObjectHideFlags: 0
@@ -407,8 +407,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 60}
m_SizeDelta: {x: 0, y: 40}
m_AnchoredPosition: {x: 0, y: 82}
m_SizeDelta: {x: -80, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4521187534841194808
MonoBehaviour:
@@ -424,7 +424,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.UI.StatBar
slider: {fileID: 6171176470312880999}
fillImage: {fileID: 4865039855673322941}
valueText: {fileID: 7606115145092636445}
valueText: {fileID: 4278009329655597422}
fullColor: {r: 1, g: 0, b: 0, a: 1}
lowColor: {r: 1, g: 0, b: 0, a: 1}
lowThreshold: 0.3
@@ -448,7 +448,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &4250423574011084299
RectTransform:
m_ObjectHideFlags: 0
@@ -547,7 +547,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchoredPosition: {x: 1325, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0.5}
--- !u!114 &7673766168690170142
@@ -609,6 +609,8 @@ MonoBehaviour:
- {fileID: 1423210892419994845}
- {fileID: 7830658735294947559}
- {fileID: 6568354020171798426}
debugMode: 1
slotMappings: 000000000100000002000000030000000400000005000000
keyLabels:
- L
- R
@@ -816,8 +818,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 20}
m_SizeDelta: {x: 0, y: 40}
m_AnchoredPosition: {x: 0, y: 30}
m_SizeDelta: {x: -80, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4622408951537218836
MonoBehaviour:
@@ -972,6 +974,22 @@ PrefabInstance:
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_characterSpacing
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: 'm_ActiveFontFeatures.Array.data[0]'
value: 1801810542
objectReference: {fileID: 0}
- target: {fileID: 7997306272064920525, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_AnchorMax.x
value: 0
@@ -1108,17 +1126,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &7606115145092636445 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
m_PrefabInstance: {fileID: 518225783641420074}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &1397865734090967693
PrefabInstance:
m_ObjectHideFlags: 0
@@ -1131,10 +1138,18 @@ PrefabInstance:
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 764508204657515611, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1078964336793701480, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Name
value: ActionBar_Item (4)
objectReference: {fileID: 0}
- target: {fileID: 4888074778808592692, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5866635796840437353, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@@ -1159,6 +1174,10 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6477301859233746099, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7007681242674040492, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@@ -1546,6 +1565,18 @@ PrefabInstance:
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7980170689800973879, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_characterSpacing
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7997306272064920525, guid: 10b369200a4505640bea81594ae56cb8, type: 3}
propertyPath: m_AnchorMax.x
value: 0
@@ -1705,7 +1736,7 @@ PrefabInstance:
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
objectReference: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontSizeBase
value: 42
@@ -1713,10 +1744,10 @@ PrefabInstance:
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: -6627135030329028012, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_characterSpacing
value: 2
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_VerticalAlignment
@@ -1872,6 +1903,17 @@ RectTransform:
m_CorrespondingSourceObject: {fileID: 4164625289371221798, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
m_PrefabInstance: {fileID: 2377487249451896594}
m_PrefabAsset: {fileID: 0}
--- !u!114 &4278009329655597422 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
m_PrefabInstance: {fileID: 2377487249451896594}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &2660882964466318832
PrefabInstance:
m_ObjectHideFlags: 0
@@ -1884,10 +1926,18 @@ PrefabInstance:
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 764508204657515611, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1078964336793701480, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Name
value: ActionBar_Item (5)
objectReference: {fileID: 0}
- target: {fileID: 4888074778808592692, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5866635796840437353, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@@ -1912,6 +1962,10 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6477301859233746099, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7007681242674040492, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@@ -2025,10 +2079,18 @@ PrefabInstance:
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 764508204657515611, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1078964336793701480, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Name
value: ActionBar_Item (2)
objectReference: {fileID: 0}
- target: {fileID: 4888074778808592692, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5866635796840437353, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@@ -2053,6 +2115,10 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6477301859233746099, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7007681242674040492, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@@ -2177,7 +2243,7 @@ PrefabInstance:
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontAsset
value:
objectReference: {fileID: 11400000, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
objectReference: {fileID: 11400000, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_fontSizeBase
value: 42
@@ -2185,10 +2251,10 @@ PrefabInstance:
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: -6627135030329028012, guid: fcfcd7da3c44c554db6791d28dd79a59, type: 2}
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_characterSpacing
value: 2
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1990594193549166204, guid: 9aea4cf6dad33b1419c4597a344a2e92, type: 3}
propertyPath: m_VerticalAlignment
@@ -2367,10 +2433,18 @@ PrefabInstance:
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 764508204657515611, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1078964336793701480, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Name
value: ActionBar_Item (1)
objectReference: {fileID: 0}
- target: {fileID: 4888074778808592692, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5866635796840437353, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@@ -2395,6 +2469,10 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6477301859233746099, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7007681242674040492, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@@ -2508,10 +2586,18 @@ PrefabInstance:
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 764508204657515611, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1078964336793701480, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Name
value: ActionBar_Item
objectReference: {fileID: 0}
- target: {fileID: 4888074778808592692, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5866635796840437353, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@@ -2536,6 +2622,10 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6477301859233746099, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7007681242674040492, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@@ -2649,10 +2739,18 @@ PrefabInstance:
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 764508204657515611, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 1078964336793701480, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Name
value: ActionBar_Item (3)
objectReference: {fileID: 0}
- target: {fileID: 4888074778808592692, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5866635796840437353, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_AnchorMax.y
value: 0
@@ -2677,6 +2775,10 @@ PrefabInstance:
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6477301859233746099, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_sharedMaterial
value:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 7007681242674040492, guid: 553b74bdb60f6af47b5d2c8928a2af07, type: 3}
propertyPath: m_Pivot.x
value: 0.5

View File

@@ -0,0 +1,28 @@
using System;
using Colosseum.Enemy;
using Unity.Behavior;
using Unity.Properties;
using Action = Unity.Behavior.Action;
/// <summary>
/// 시그니처 패턴 사용 가능 여부를 확인하는 체크 액션입니다.
/// </summary>
[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<BossCombatBehaviorContext>();
return context != null && context.IsSignaturePatternReady()
? Status.Success
: Status.Failure;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b27f3137292d5704d802b5cfb58037e4

View File

@@ -0,0 +1,54 @@
using System;
using Colosseum.Enemy;
using Unity.Behavior;
using Unity.Properties;
using UnityEngine;
using Action = Unity.Behavior.Action;
/// <summary>
/// 보스 공통 시그니처 패턴을 실행하는 액션입니다.
/// </summary>
[Serializable, GeneratePropertyBag]
[NodeDescription(
name: "Use Signature Pattern",
story: "시그니처 패턴 실행",
category: "Action",
id: "178f8888d56042c6a75b4d6ee8a7a7d4")]
public partial class UseSignaturePatternAction : Action
{
[SerializeReference]
public BlackboardVariable<GameObject> Target;
private BossCombatBehaviorContext combatBehaviorContext;
private bool started;
protected override Status OnStart()
{
combatBehaviorContext = GameObject.GetComponent<BossCombatBehaviorContext>();
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;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0680aed4d244d7844918883e06e718d5

View File

@@ -84,6 +84,11 @@ namespace Colosseum.Abnormalities
[Range(0f, 1f)]
public float slowMultiplier = 0.5f;
[Header("피해 배율")]
[Tooltip("이상 상태가 적용된 동안 받는 피해 배율 (1 = 기본, 1.1 = 10% 증가)")]
[Min(0f)]
public float incomingDamageMultiplier = 1f;
/// <summary>
/// 영구 효과인지 확인
/// </summary>
@@ -98,5 +103,10 @@ namespace Colosseum.Abnormalities
/// 제어 효과가 있는지 확인
/// </summary>
public bool HasControlEffect => controlType != ControlType.None;
/// <summary>
/// 받는 피해 배율 변경 여부
/// </summary>
public bool HasIncomingDamageModifier => !Mathf.Approximately(incomingDamageMultiplier, 1f);
}
}

View File

@@ -32,6 +32,7 @@ namespace Colosseum.Abnormalities
private int silenceCount;
private int invincibleCount;
private float slowMultiplier = 1f;
private float incomingDamageMultiplier = 1f;
// 클라이언트 판정용 제어 효과 동기화 변수
private NetworkVariable<int> syncedStunCount = new NetworkVariable<int>(0);
@@ -62,6 +63,11 @@ namespace Colosseum.Abnormalities
/// </summary>
public float MoveSpeedMultiplier => GetCurrentSlowMultiplier();
/// <summary>
/// 받는 피해 배율 (1.0 = 기본, 1.1 = 10% 증가)
/// </summary>
public float IncomingDamageMultiplier => incomingDamageMultiplier;
/// <summary>
/// 행동 가능 여부 (기절이 아닐 때)
/// </summary>
@@ -238,6 +244,7 @@ namespace Colosseum.Abnormalities
ApplyStatModifiers(newAbnormality);
ApplyControlEffect(data);
RecalculateIncomingDamageMultiplier();
SyncAbnormalityAdd(newAbnormality, source);
OnAbnormalityAdded?.Invoke(newAbnormality);
@@ -282,6 +289,7 @@ namespace Colosseum.Abnormalities
{
RemoveStatModifiers(abnormality);
RemoveControlEffect(abnormality.Data);
RecalculateIncomingDamageMultiplier();
SyncAbnormalityRemove(abnormality);
activeAbnormalities.Remove(abnormality);
@@ -488,6 +496,20 @@ namespace Colosseum.Abnormalities
}
}
private void RecalculateIncomingDamageMultiplier()
{
incomingDamageMultiplier = 1f;
for (int i = 0; i < activeAbnormalities.Count; i++)
{
AbnormalityData data = activeAbnormalities[i].Data;
if (data == null || !data.HasIncomingDamageModifier)
continue;
incomingDamageMultiplier *= Mathf.Max(0f, data.incomingDamageMultiplier);
}
}
private int GetCurrentStunCount() => IsServer ? stunCount : syncedStunCount.Value;
private int GetCurrentSilenceCount() => IsServer ? silenceCount : syncedSilenceCount.Value;

View File

@@ -64,12 +64,12 @@ namespace Colosseum.Editor
vLayout.childForceExpandHeight = false;
connectPanel.AddComponent<ContentSizeFitter>();
CreateLabel(connectPanel.transform, "TitleLabel", "Colosseum Lobby", 36);
CreateLabel(connectPanel.transform, "TitleLabel", "Colosseum Lobby", 36, UIFontRole.Emphasis);
var ipInput = CreateInputField(connectPanel.transform, "IpInput", "Host IP (127.0.0.1)", 300, 50);
var portInput = CreateInputField(connectPanel.transform, "PortInput", "Port (7777)", 300, 50);
var hostBtn = CreateButton(connectPanel.transform, "HostButton", "Host", 200, 50);
var joinBtn = CreateButton(connectPanel.transform, "JoinButton", "Join", 200, 50);
var statusText = CreateLabel(connectPanel.transform, "StatusText", "", 18);
var statusText = CreateLabel(connectPanel.transform, "StatusText", "", 18, UIFontRole.Body);
statusText.color = Color.yellow;
// ── LobbyPanel ────────────────────────────────────────
@@ -87,7 +87,7 @@ namespace Colosseum.Editor
vLayout2.childForceExpandWidth = false;
vLayout2.childForceExpandHeight = false;
CreateLabel(lobbyPanel.transform, "LobbyTitle", "Waiting Room", 32);
CreateLabel(lobbyPanel.transform, "LobbyTitle", "Waiting Room", 32, UIFontRole.Emphasis);
// PlayerList: ScrollView 역할을 하는 VerticalLayout 컨테이너
var playerListGO = new GameObject("PlayerList");
@@ -123,9 +123,10 @@ namespace Colosseum.Editor
slotTmp.text = "Player";
slotTmp.fontSize = 20;
slotTmp.alignment = TextAlignmentOptions.MidlineLeft;
UIFontSetupTool.ApplyRole(slotTmp, UIFontRole.Body);
System.IO.Directory.CreateDirectory(Application.dataPath + "/_Game/Prefabs/UI");
var slotPrefab = PrefabUtility.SaveAsPrefabAsset(slotGO, "Assets/_Game/Prefabs/UI/PlayerSlot.prefab");
var slotPrefab = PrefabUtility.SaveAsPrefabAsset(slotGO, "Assets/_Game/Prefabs/UI/UI_PlayerSlot.prefab");
Object.DestroyImmediate(slotGO);
// ── LobbyUI 연결 ──────────────────────────────────────
@@ -297,6 +298,7 @@ namespace Colosseum.Editor
phTmp.text = placeholder;
phTmp.fontSize = 18;
phTmp.color = new Color(0.5f, 0.5f, 0.5f);
UIFontSetupTool.ApplyRole(phTmp, UIFontRole.Combat);
var txtGO = new GameObject("Text");
txtGO.transform.SetParent(textArea.transform, false);
@@ -307,6 +309,7 @@ namespace Colosseum.Editor
var txt = txtGO.AddComponent<TextMeshProUGUI>();
txt.fontSize = 18;
txt.color = Color.white;
UIFontSetupTool.ApplyRole(txt, UIFontRole.Combat);
input.textViewport = taRect;
input.placeholder = phTmp;
@@ -335,11 +338,12 @@ namespace Colosseum.Editor
tmp.fontSize = 20;
tmp.alignment = TextAlignmentOptions.Center;
tmp.color = Color.white;
UIFontSetupTool.ApplyRole(tmp, UIFontRole.Combat);
return go;
}
private static TextMeshProUGUI CreateLabel(Transform parent, string name, string text, int size)
private static TextMeshProUGUI CreateLabel(Transform parent, string name, string text, int size, UIFontRole role = UIFontRole.Body)
{
var go = new GameObject(name);
go.transform.SetParent(parent, false);
@@ -350,6 +354,7 @@ namespace Colosseum.Editor
tmp.fontSize = size;
tmp.alignment = TextAlignmentOptions.Center;
tmp.color = Color.white;
UIFontSetupTool.ApplyRole(tmp, role);
return tmp;
}

View File

@@ -67,6 +67,7 @@ namespace Colosseum.Editor
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 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(-620f, -40f));
object leapSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(-220f, -40f));
object slamSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(180f, -40f));
@@ -74,6 +75,11 @@ namespace Colosseum.Editor
object slamFallbackSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(980f, -40f));
object chaseSequence = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, runtimeAssembly.GetType("Unity.Behavior.SequenceComposite", true), new Vector2(1380f, -40f));
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));
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));
@@ -107,8 +113,9 @@ namespace Colosseum.Editor
Connect(graphAsset, connectEdgeMethod, GetDefaultOutputPort(startNode), GetDefaultInputPort(repeatNode));
Connect(graphAsset, connectEdgeMethod, GetDefaultOutputPort(repeatNode), GetDefaultInputPort(selectorNode));
ConnectChildren(graphAsset, connectEdgeMethod, selectorNode, downSequence, leapSequence, slamSequence, mainSequence, slamFallbackSequence, chaseSequence);
ConnectChildren(graphAsset, connectEdgeMethod, selectorNode, signatureSequence, downSequence, leapSequence, slamSequence, mainSequence, slamFallbackSequence, chaseSequence);
ConnectChildren(graphAsset, connectEdgeMethod, signatureSequence, signatureRefreshNode, signatureHasTargetNode, signatureReadyNode, signatureUseNode);
ConnectChildren(graphAsset, connectEdgeMethod, downSequence, downSelectNode, downReadyNode, downUseNode);
ConnectChildren(graphAsset, connectEdgeMethod, leapSequence, leapSelectNode, leapReadyNode, leapUseNode);
ConnectChildren(graphAsset, connectEdgeMethod, slamSequence, slamRefreshNode, slamHasTargetNode, slamRangeNode, slamTurnNode, slamReadyNode, slamUseNode);
@@ -116,6 +123,9 @@ namespace Colosseum.Editor
ConnectChildren(graphAsset, connectEdgeMethod, slamFallbackSequence, fallbackRefreshNode, fallbackHasTargetNode, fallbackRangeNode, fallbackReadyNode, fallbackUseNode);
ConnectChildren(graphAsset, connectEdgeMethod, chaseSequence, chaseRefreshNode, chaseHasTargetNode, chaseUseNode);
LinkTarget(signatureRefreshNode, targetVariable);
LinkTarget(signatureHasTargetNode, targetVariable);
LinkTarget(signatureUseNode, targetVariable);
LinkTarget(downSelectNode, targetVariable);
LinkTarget(downUseNode, targetVariable);
LinkTarget(leapSelectNode, targetVariable);

View File

@@ -0,0 +1,579 @@
using System;
using System.IO;
using TMPro;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TextCore.LowLevel;
using UnityEngine.UI;
namespace Colosseum.Editor
{
/// <summary>
/// UI 폰트 역할
/// </summary>
public enum UIFontRole
{
Emphasis,
Body,
Combat,
}
/// <summary>
/// 프로젝트 UI 폰트 에셋 생성 및 적용 도구
/// </summary>
public static class UIFontSetupTool
{
private const string InitialCharacterSet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 " +
".,:;!?+-=*/%()[]{}<>#&_'\"|~" +
"검투사콜로세움보스체력마나준비게임시작나가기대기실승리패배연결호스트참가플레이어";
public const string FontRootPath = "Assets/_Game/Fonts";
public const string FontAssetRootPath = "Assets/_Game/Fonts/TMP";
public const string MaruSourceFontPath = FontRootPath + "/MaruBuri-Regular.ttf";
public const string SuseongSourceFontPath = FontRootPath + "/SuseongBatang.ttf";
public const string MaruFontAssetPath = FontAssetRootPath + "/TMP_MaruBuri.asset";
public const string SuseongFontAssetPath = FontAssetRootPath + "/TMP_SuseongBatang.asset";
[MenuItem("Colosseum/UI/TMP 폰트 에셋 생성")]
public static void GenerateFontAssetsMenu()
{
EnsureFontAssets(true);
}
[MenuItem("Colosseum/UI/UI 폰트 규칙 적용")]
public static void ApplyFontRulesMenu()
{
if (!EnsureFontAssets(true))
{
return;
}
int changedPrefabCount = ApplyPrefabFontRules();
int changedSceneCount = ApplySceneFontRules();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log($"[UIFontSetupTool] UI 폰트 규칙 적용 완료. Prefab {changedPrefabCount}개, Scene {changedSceneCount}개를 갱신했습니다.");
}
[MenuItem("Colosseum/UI/HUD 타이포 보정 적용")]
public static void ApplyHudTypographyTuningMenu()
{
if (!EnsureFontAssets(true))
{
return;
}
int changedPrefabCount = ApplyHudPrefabTuning();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log($"[UIFontSetupTool] HUD 타이포 보정 완료. Prefab {changedPrefabCount}개를 갱신했습니다.");
}
/// <summary>
/// 역할에 맞는 TMP 폰트를 텍스트에 적용합니다.
/// </summary>
public static bool ApplyRole(TMP_Text text, UIFontRole role)
{
if (text == null || !TryGetFontAsset(role, out TMP_FontAsset fontAsset))
{
return false;
}
bool changed = false;
if (text.font != fontAsset)
{
text.font = fontAsset;
changed = true;
}
if (text.fontSharedMaterial != fontAsset.material)
{
text.fontSharedMaterial = fontAsset.material;
changed = true;
}
float targetCharacterSpacing = role == UIFontRole.Emphasis ? GetEmphasisCharacterSpacing(text) : 0f;
if (!Mathf.Approximately(text.characterSpacing, targetCharacterSpacing))
{
text.characterSpacing = targetCharacterSpacing;
changed = true;
}
if (changed)
{
EditorUtility.SetDirty(text);
}
return changed;
}
/// <summary>
/// 역할에 맞는 TMP 폰트 에셋을 반환합니다.
/// </summary>
public static bool TryGetFontAsset(UIFontRole role, out TMP_FontAsset fontAsset)
{
fontAsset = role switch
{
UIFontRole.Emphasis => AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(SuseongFontAssetPath),
UIFontRole.Body => AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(MaruFontAssetPath),
UIFontRole.Combat => AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(MaruFontAssetPath),
_ => null,
};
return fontAsset != null;
}
private static bool EnsureFontAssets(bool logResult)
{
EnsureFolder(FontRootPath);
EnsureFolder(FontAssetRootPath);
bool success = true;
success &= CreateFontAssetIfNeeded(MaruSourceFontPath, MaruFontAssetPath, "TMP_MaruBuri", logResult);
success &= CreateFontAssetIfNeeded(SuseongSourceFontPath, SuseongFontAssetPath, "TMP_SuseongBatang", logResult);
if (success)
{
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
return success;
}
private static bool CreateFontAssetIfNeeded(string sourceFontPath, string fontAssetPath, string assetName, bool logResult)
{
TMP_FontAsset existingFontAsset = AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(fontAssetPath);
if (existingFontAsset != null && IsFontAssetUsable(existingFontAsset))
{
WarmUpFontAsset(existingFontAsset);
return true;
}
if (existingFontAsset != null)
{
AssetDatabase.DeleteAsset(fontAssetPath);
}
Font sourceFont = AssetDatabase.LoadAssetAtPath<Font>(sourceFontPath);
if (sourceFont == null)
{
if (logResult)
{
Debug.LogError($"[UIFontSetupTool] 원본 폰트를 찾을 수 없습니다: {sourceFontPath}");
}
return false;
}
TMP_FontAsset fontAsset = TMP_FontAsset.CreateFontAsset(
sourceFont,
90,
9,
GlyphRenderMode.SDFAA,
1024,
1024,
AtlasPopulationMode.Dynamic,
true);
fontAsset.name = assetName;
AssetDatabase.CreateAsset(fontAsset, fontAssetPath);
AttachSubAssets(fontAsset, fontAssetPath);
WarmUpFontAsset(fontAsset);
if (logResult)
{
Debug.Log($"[UIFontSetupTool] TMP 폰트 에셋 생성: {fontAssetPath}");
}
return true;
}
private static void WarmUpFontAsset(TMP_FontAsset fontAsset)
{
if (fontAsset == null)
{
return;
}
fontAsset.ReadFontAssetDefinition();
fontAsset.TryAddCharacters(InitialCharacterSet, out _);
EditorUtility.SetDirty(fontAsset);
}
private static void AttachSubAssets(TMP_FontAsset fontAsset, string fontAssetPath)
{
if (fontAsset == null)
{
return;
}
if (fontAsset.material != null && AssetDatabase.GetAssetPath(fontAsset.material) != fontAssetPath)
{
AssetDatabase.AddObjectToAsset(fontAsset.material, fontAsset);
}
Texture2D[] atlasTextures = fontAsset.atlasTextures;
if (atlasTextures == null)
{
return;
}
foreach (Texture2D atlasTexture in atlasTextures)
{
if (atlasTexture == null || AssetDatabase.GetAssetPath(atlasTexture) == fontAssetPath)
{
continue;
}
AssetDatabase.AddObjectToAsset(atlasTexture, fontAsset);
}
}
private static bool IsFontAssetUsable(TMP_FontAsset fontAsset)
{
if (fontAsset == null || fontAsset.material == null)
{
return false;
}
Texture2D[] atlasTextures = fontAsset.atlasTextures;
return atlasTextures != null && atlasTextures.Length > 0 && atlasTextures[0] != null;
}
private static int ApplyPrefabFontRules()
{
string[] prefabGuids = AssetDatabase.FindAssets("t:Prefab", new[] { "Assets/_Game/Prefabs/UI" });
int changedCount = 0;
foreach (string guid in prefabGuids)
{
string prefabPath = AssetDatabase.GUIDToAssetPath(guid);
GameObject root = PrefabUtility.LoadPrefabContents(prefabPath);
try
{
if (ApplyFontRules(root))
{
PrefabUtility.SaveAsPrefabAsset(root, prefabPath);
changedCount++;
}
}
finally
{
PrefabUtility.UnloadPrefabContents(root);
}
}
return changedCount;
}
private static int ApplyHudPrefabTuning()
{
string[] prefabGuids = AssetDatabase.FindAssets("t:Prefab", new[] { "Assets/_Game/Prefabs/UI" });
int changedCount = 0;
foreach (string guid in prefabGuids)
{
string prefabPath = AssetDatabase.GUIDToAssetPath(guid);
GameObject root = PrefabUtility.LoadPrefabContents(prefabPath);
try
{
if (TuneHudTypography(root))
{
PrefabUtility.SaveAsPrefabAsset(root, prefabPath);
changedCount++;
}
}
finally
{
PrefabUtility.UnloadPrefabContents(root);
}
}
return changedCount;
}
private static int ApplySceneFontRules()
{
string originalScenePath = SceneManager.GetActiveScene().path;
string[] sceneGuids = AssetDatabase.FindAssets("t:Scene", new[] { "Assets/Scenes" });
int changedCount = 0;
foreach (string guid in sceneGuids)
{
string scenePath = AssetDatabase.GUIDToAssetPath(guid);
Scene scene = EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single);
bool changed = false;
foreach (GameObject rootObject in scene.GetRootGameObjects())
{
changed |= ApplyFontRules(rootObject);
}
if (changed)
{
EditorSceneManager.SaveScene(scene);
changedCount++;
}
}
if (!string.IsNullOrEmpty(originalScenePath) && File.Exists(originalScenePath))
{
EditorSceneManager.OpenScene(originalScenePath, OpenSceneMode.Single);
}
return changedCount;
}
private static bool ApplyFontRules(GameObject root)
{
bool changed = false;
TMP_Text[] texts = root.GetComponentsInChildren<TMP_Text>(true);
foreach (TMP_Text text in texts)
{
UIFontRole role = DetermineRole(text);
changed |= ApplyRole(text, role);
}
return changed;
}
private static bool TuneHudTypography(GameObject root)
{
if (root == null || ContainsIgnoreCase(root.name, "Lobby"))
{
return false;
}
bool changed = false;
TMP_Text[] texts = root.GetComponentsInChildren<TMP_Text>(true);
foreach (TMP_Text text in texts)
{
string hierarchyPath = GetHierarchyPath(text.transform);
if (root.name == "UI_ActionBar_Item" || root.name == "UI_ActionBar_EvadeItem")
{
changed |= TuneActionBarTypography(text, hierarchyPath);
continue;
}
if (root.name == "UI_PlayerResources")
{
changed |= TunePlayerResourcesTypography(text, hierarchyPath);
continue;
}
if (root.name == "UI_HealthBar" || root.name == "UI_ManaBar")
{
changed |= SetTextStyle(text, 30f, FontStyles.Bold, -1f);
continue;
}
if (root.name == "UI_BossHealthBar")
{
changed |= TuneBossBarTypography(text, hierarchyPath);
}
}
return changed;
}
private static UIFontRole DetermineRole(TMP_Text text)
{
string objectName = text.gameObject.name;
string hierarchyPath = GetHierarchyPath(text.transform);
if (IsEmphasisText(objectName, hierarchyPath))
{
return UIFontRole.Emphasis;
}
if (IsCombatText(text, objectName, hierarchyPath))
{
return UIFontRole.Combat;
}
return UIFontRole.Body;
}
private static bool IsEmphasisText(string objectName, string hierarchyPath)
{
return ContainsIgnoreCase(objectName, "Title")
|| ContainsIgnoreCase(objectName, "BossName")
|| ContainsIgnoreCase(objectName, "Victory")
|| ContainsIgnoreCase(objectName, "GameOver")
|| ContainsIgnoreCase(hierarchyPath, "/Title")
|| ContainsIgnoreCase(hierarchyPath, "/BossName");
}
private static bool IsCombatText(TMP_Text text, string objectName, string hierarchyPath)
{
return text.GetComponentInParent<Button>(true) != null
|| text.GetComponentInParent<TMP_InputField>(true) != null
|| ContainsIgnoreCase(objectName, "HP")
|| ContainsIgnoreCase(objectName, "MP")
|| ContainsIgnoreCase(objectName, "XP")
|| ContainsIgnoreCase(objectName, "Cooldown")
|| ContainsIgnoreCase(objectName, "Key")
|| ContainsIgnoreCase(objectName, "Duration")
|| ContainsIgnoreCase(objectName, "Status")
|| ContainsIgnoreCase(hierarchyPath, "ActionBar")
|| ContainsIgnoreCase(hierarchyPath, "HealthBar")
|| ContainsIgnoreCase(hierarchyPath, "ManaBar")
|| ContainsIgnoreCase(hierarchyPath, "PlayerResources")
|| ContainsIgnoreCase(hierarchyPath, "Abnormality")
|| ContainsIgnoreCase(hierarchyPath, "BossHealthBar");
}
private static float GetEmphasisCharacterSpacing(TMP_Text text)
{
string objectName = text.gameObject.name;
if (ContainsIgnoreCase(objectName, "GameOver") || ContainsIgnoreCase(objectName, "Victory"))
{
return 5f;
}
if (ContainsIgnoreCase(objectName, "BossName"))
{
return 3f;
}
return 4f;
}
private static bool TuneActionBarTypography(TMP_Text text, string hierarchyPath)
{
if (text == null)
{
return false;
}
if (ContainsIgnoreCase(hierarchyPath, "Label_CooldownTime"))
{
return SetTextStyle(text, 24f, FontStyles.Bold, -1f);
}
if (ContainsIgnoreCase(hierarchyPath, "/Input/Input"))
{
return SetTextStyle(text, 20f, FontStyles.Bold, 0f);
}
return false;
}
private static bool TunePlayerResourcesTypography(TMP_Text text, string hierarchyPath)
{
if (text == null || !ContainsIgnoreCase(hierarchyPath, "Label_XP"))
{
return false;
}
float fontSize = ContainsIgnoreCase(hierarchyPath, "/HUD_XPBar/") ? 24f : 28f;
return SetTextStyle(text, fontSize, FontStyles.Bold, -1f);
}
private static bool TuneBossBarTypography(TMP_Text text, string hierarchyPath)
{
if (text == null)
{
return false;
}
if (ContainsIgnoreCase(hierarchyPath, "Label_HP"))
{
return SetTextStyle(text, 30f, FontStyles.Bold, -1f);
}
if (ContainsIgnoreCase(hierarchyPath, "Label_BossName"))
{
return SetTextStyle(text, 34f, FontStyles.Normal, 3f);
}
return false;
}
private static bool SetTextStyle(TMP_Text text, float fontSize, FontStyles fontStyle, float characterSpacing)
{
bool changed = false;
if (!Mathf.Approximately(text.fontSize, fontSize))
{
text.fontSize = fontSize;
changed = true;
}
if (text.fontStyle != fontStyle)
{
text.fontStyle = fontStyle;
changed = true;
}
if (!Mathf.Approximately(text.characterSpacing, characterSpacing))
{
text.characterSpacing = characterSpacing;
changed = true;
}
if (changed)
{
EditorUtility.SetDirty(text);
}
return changed;
}
private static string GetHierarchyPath(Transform transform)
{
string path = transform.name;
while (transform.parent != null)
{
transform = transform.parent;
path = $"{transform.name}/{path}";
}
return path;
}
private static bool ContainsIgnoreCase(string source, string value)
{
return source?.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;
}
private static void EnsureFolder(string path)
{
if (AssetDatabase.IsValidFolder(path))
{
return;
}
string[] parts = path.Split('/');
string currentPath = parts[0];
for (int i = 1; i < parts.Length; i++)
{
string nextPath = $"{currentPath}/{parts[i]}";
if (!AssetDatabase.IsValidFolder(nextPath))
{
AssetDatabase.CreateFolder(currentPath, parts[i]);
}
currentPath = nextPath;
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5c686d635a98a6b4baaad969bc633ca3

View File

@@ -2,6 +2,7 @@ using System.Collections;
using System.Collections.Generic;
using Colosseum.AI;
using Colosseum.Abnormalities;
using Colosseum.Combat;
using Colosseum.Player;
using Colosseum.Skills;
@@ -46,6 +47,9 @@ namespace Colosseum.Enemy
[FormerlySerializedAs("downPunishPattern")]
[SerializeField] protected BossPatternData punishPattern;
[Tooltip("파티 누킹을 시험하는 시그니처 패턴")]
[SerializeField] protected BossPatternData signaturePattern;
[Header("Phase Thresholds")]
[Tooltip("2페이즈 진입 체력 비율")]
[Range(0f, 1f)] [SerializeField] protected float phase2HealthThreshold = 0.75f;
@@ -79,6 +83,37 @@ namespace Colosseum.Enemy
[FormerlySerializedAs("phase3SlamInterval")]
[Min(1)] [SerializeField] protected int phase3SecondaryInterval = 2;
[Header("Signature Pattern")]
[Tooltip("시그니처 패턴을 사용하기 시작하는 최소 페이즈")]
[Min(1)] [SerializeField] protected int signatureMinPhase = 2;
[Tooltip("시그니처 패턴 차단에 필요한 누적 피해 비율")]
[Range(0f, 1f)] [SerializeField] protected float signatureRequiredDamageRatio = 0.1f;
[Tooltip("시그니처 차단 성공 시 보스가 멈추는 시간")]
[Min(0f)] [SerializeField] protected float signatureSuccessStaggerDuration = 2f;
[Tooltip("시그니처 실패 시 모든 플레이어에게 적용할 디버프")]
[SerializeField] protected AbnormalityData signatureFailureAbnormality;
[Tooltip("시그니처 실패 시 모든 플레이어에게 주는 기본 피해")]
[Min(0f)] [SerializeField] protected float signatureFailureDamage = 40f;
[Tooltip("시그니처 실패 시 넉백이 적용되는 반경")]
[Min(0f)] [SerializeField] protected float signatureFailureKnockbackRadius = 8f;
[Tooltip("시그니처 실패 시 다운이 적용되는 반경")]
[Min(0f)] [SerializeField] protected float signatureFailureDownRadius = 3f;
[Tooltip("시그니처 실패 시 넉백 속도")]
[Min(0f)] [SerializeField] protected float signatureFailureKnockbackSpeed = 12f;
[Tooltip("시그니처 실패 시 넉백 지속 시간")]
[Min(0f)] [SerializeField] protected float signatureFailureKnockbackDuration = 0.35f;
[Tooltip("시그니처 실패 시 다운 지속 시간")]
[Min(0f)] [SerializeField] protected float signatureFailureDownDuration = 2f;
[Header("Behavior")]
[Tooltip("전용 컨텍스트 사용 시 기존 BehaviorGraph를 비활성화할지 여부")]
[SerializeField] protected bool disableBehaviorGraph = true;
@@ -92,6 +127,9 @@ namespace Colosseum.Enemy
protected GameObject currentTarget;
protected float nextTargetRefreshTime;
protected int meleePatternCounter;
protected bool isSignaturePatternActive;
protected float signatureAccumulatedDamage;
protected float signatureRequiredDamage;
/// <summary>
/// 전용 컨텍스트 사용 시 BehaviorGraph를 비활성화할지 여부
@@ -108,6 +146,11 @@ namespace Colosseum.Enemy
/// </summary>
public float PunishSearchRadius => punishSearchRadius;
/// <summary>
/// 시그니처 패턴 진행 여부
/// </summary>
public bool IsSignaturePatternActive => isSignaturePatternActive;
/// <summary>
/// 디버그 로그 출력 여부
/// </summary>
@@ -185,6 +228,7 @@ namespace Colosseum.Enemy
BossCombatPatternRole.Secondary => secondaryPattern,
BossCombatPatternRole.Mobility => mobilityPattern,
BossCombatPatternRole.Punish => punishPattern,
BossCombatPatternRole.Signature => signaturePattern,
_ => null,
};
}
@@ -321,6 +365,40 @@ namespace Colosseum.Enemy
Debug.Log($"[{source}] {message}");
}
/// <summary>
/// 시그니처 패턴 사용 가능 여부를 반환합니다.
/// </summary>
public bool IsSignaturePatternReady()
{
if (!IsServer || bossEnemy == null || skillController == null)
return false;
if (CurrentPatternPhase < signatureMinPhase)
return false;
if (activePatternCoroutine != null || isSignaturePatternActive)
return false;
if (bossEnemy.IsDead || bossEnemy.IsTransitioning || skillController.IsPlayingAnimation)
return false;
return UsePatternAction.IsPatternReady(gameObject, signaturePattern);
}
/// <summary>
/// 시그니처 패턴을 시작합니다.
/// </summary>
public bool TryStartSignaturePattern(GameObject target)
{
if (!IsSignaturePatternReady())
return false;
GameObject resolvedTarget = IsValidHostileTarget(target) ? target : FindNearestLivingTarget();
currentTarget = resolvedTarget;
activePatternCoroutine = StartCoroutine(RunSignaturePatternCoroutine(signaturePattern, resolvedTarget));
return true;
}
protected virtual bool TryStartPrimaryLoopPattern()
{
if (currentTarget == null)
@@ -515,6 +593,220 @@ namespace Colosseum.Enemy
if (behaviorGraphAgent == null)
behaviorGraphAgent = GetComponent<BehaviorGraphAgent>();
if (enemyBase != null)
{
enemyBase.OnDamageTaken -= HandleBossDamageTaken;
enemyBase.OnDamageTaken += HandleBossDamageTaken;
}
}
public override void OnNetworkDespawn()
{
if (enemyBase != null)
{
enemyBase.OnDamageTaken -= HandleBossDamageTaken;
}
base.OnNetworkDespawn();
}
private IEnumerator RunSignaturePatternCoroutine(BossPatternData pattern, GameObject target)
{
StopMovement();
isSignaturePatternActive = true;
signatureAccumulatedDamage = 0f;
signatureRequiredDamage = bossEnemy.MaxHealth * signatureRequiredDamageRatio;
bool interrupted = false;
bool completed = true;
for (int i = 0; i < pattern.Steps.Count; i++)
{
if (HasMetSignatureBreakThreshold())
{
interrupted = true;
break;
}
PatternStep step = pattern.Steps[i];
if (step.Type == PatternStepType.Wait)
{
float remaining = step.Duration;
while (remaining > 0f)
{
if (HasMetSignatureBreakThreshold())
{
interrupted = true;
break;
}
if (bossEnemy == null || bossEnemy.IsDead)
{
completed = false;
break;
}
remaining -= Time.deltaTime;
yield return null;
}
if (interrupted || !completed)
break;
continue;
}
if (step.Skill == null)
{
completed = false;
Debug.LogWarning($"[{GetType().Name}] 시그니처 패턴 스텝 스킬이 비어 있습니다. Pattern={pattern.PatternName}, Index={i}");
break;
}
if (!skillController.ExecuteSkill(step.Skill))
{
completed = false;
LogDebug(GetType().Name, $"시그니처 스킬 실행 실패: {step.Skill.SkillName}");
break;
}
while (skillController != null && skillController.IsPlayingAnimation)
{
if (HasMetSignatureBreakThreshold())
{
interrupted = true;
break;
}
if (bossEnemy == null || bossEnemy.IsDead)
{
completed = false;
break;
}
yield return null;
}
if (interrupted || !completed)
break;
}
if (interrupted)
{
skillController?.CancelSkill(SkillCancelReason.Interrupt);
UsePatternAction.MarkPatternUsed(gameObject, pattern);
LogDebug(GetType().Name, $"시그니처 차단 성공: 누적 피해 {signatureAccumulatedDamage:F1} / 필요 {signatureRequiredDamage:F1}");
if (signatureSuccessStaggerDuration > 0f)
{
if (enemyBase != null && enemyBase.Animator != null &&
HasAnimatorParameter(enemyBase.Animator, "Hit", AnimatorControllerParameterType.Trigger))
{
enemyBase.Animator.SetTrigger("Hit");
}
float endTime = Time.time + signatureSuccessStaggerDuration;
while (Time.time < endTime && bossEnemy != null && !bossEnemy.IsDead)
{
StopMovement();
yield return null;
}
}
}
else if (completed)
{
UsePatternAction.MarkPatternUsed(gameObject, pattern);
LogDebug(GetType().Name, $"시그니처 실패: 누적 피해 {signatureAccumulatedDamage:F1} / 필요 {signatureRequiredDamage:F1}");
ExecuteSignatureFailure();
}
isSignaturePatternActive = false;
signatureAccumulatedDamage = 0f;
signatureRequiredDamage = 0f;
activePatternCoroutine = null;
}
private void ExecuteSignatureFailure()
{
PlayerNetworkController[] players = FindObjectsByType<PlayerNetworkController>(FindObjectsSortMode.None);
for (int i = 0; i < players.Length; i++)
{
PlayerNetworkController player = players[i];
if (player == null || player.IsDead || !player.gameObject.activeInHierarchy)
continue;
GameObject target = player.gameObject;
if (!IsValidHostileTarget(target))
continue;
player.TakeDamage(signatureFailureDamage, gameObject);
AbnormalityManager abnormalityManager = target.GetComponent<AbnormalityManager>();
if (abnormalityManager != null && signatureFailureAbnormality != null)
{
abnormalityManager.ApplyAbnormality(signatureFailureAbnormality, gameObject);
}
HitReactionController hitReactionController = target.GetComponent<HitReactionController>();
if (hitReactionController == null)
continue;
float distance = Vector3.Distance(transform.position, target.transform.position);
if (distance <= signatureFailureDownRadius)
{
hitReactionController.ApplyDown(signatureFailureDownDuration);
continue;
}
if (distance > signatureFailureKnockbackRadius)
continue;
Vector3 knockbackDirection = target.transform.position - transform.position;
knockbackDirection.y = 0f;
if (knockbackDirection.sqrMagnitude < 0.0001f)
{
knockbackDirection = transform.forward;
}
hitReactionController.ApplyKnockback(knockbackDirection.normalized * signatureFailureKnockbackSpeed, signatureFailureKnockbackDuration);
}
}
private bool HasMetSignatureBreakThreshold()
{
if (!isSignaturePatternActive)
return false;
if (signatureRequiredDamage <= 0f)
return true;
return signatureAccumulatedDamage >= signatureRequiredDamage;
}
private static bool HasAnimatorParameter(Animator animator, string parameterName, AnimatorControllerParameterType parameterType)
{
if (animator == null || string.IsNullOrEmpty(parameterName))
return false;
AnimatorControllerParameter[] parameters = animator.parameters;
for (int i = 0; i < parameters.Length; i++)
{
AnimatorControllerParameter parameter = parameters[i];
if (parameter.type == parameterType && parameter.name == parameterName)
return true;
}
return false;
}
private void HandleBossDamageTaken(float damage)
{
if (!IsServer || !isSignaturePatternActive || damage <= 0f)
return;
signatureAccumulatedDamage += damage;
}
}
}

View File

@@ -9,6 +9,7 @@ namespace Colosseum.Enemy
Secondary = 1,
Mobility = 2,
Punish = 3,
Signature = 4,
}
/// <summary>

View File

@@ -103,7 +103,9 @@ namespace Colosseum.Player
{
if (isDead.Value || IsDamageImmune()) return;
currentHealth.Value = Mathf.Max(0f, currentHealth.Value - damage);
float finalDamage = damage * GetIncomingDamageMultiplier();
float actualDamage = Mathf.Min(finalDamage, currentHealth.Value);
currentHealth.Value = Mathf.Max(0f, currentHealth.Value - actualDamage);
if (currentHealth.Value <= 0f)
{
@@ -272,8 +274,9 @@ namespace Colosseum.Player
{
if (!IsServer || isDead.Value || IsDamageImmune()) return 0f;
float actualDamage = Mathf.Min(damage, currentHealth.Value);
currentHealth.Value = Mathf.Max(0f, currentHealth.Value - damage);
float finalDamage = damage * GetIncomingDamageMultiplier();
float actualDamage = Mathf.Min(finalDamage, currentHealth.Value);
currentHealth.Value = Mathf.Max(0f, currentHealth.Value - actualDamage);
if (currentHealth.Value <= 0f)
{
@@ -300,6 +303,14 @@ namespace Colosseum.Player
{
return abnormalityManager != null && abnormalityManager.IsInvincible;
}
private float GetIncomingDamageMultiplier()
{
if (abnormalityManager == null)
return 1f;
return Mathf.Max(0f, abnormalityManager.IncomingDamageMultiplier);
}
#endregion
}
}

View File

@@ -11,6 +11,7 @@ namespace Colosseum.Skills
{
None,
Manual,
Interrupt,
Death,
Stun,
HitReaction,

View File

@@ -11,25 +11,193 @@ namespace Colosseum.UI
public class SkillQuickSlotUI : MonoBehaviour
{
[Header("Skill Slots")]
[Tooltip("6개의 스킬 슬롯 UI (인덱스 순서대로)")]
[SerializeField] private SkillSlotUI[] skillSlots = new SkillSlotUI[6];
[Tooltip("표시 순서대로 배치된 스킬 슬롯 UI")]
[SerializeField] private SkillSlotUI[] skillSlots = new SkillSlotUI[7];
[Header("Debug")]
[SerializeField] private bool debugMode = false;
[Header("Display Order")]
[Tooltip("UI 슬롯 순서가 참조할 실제 스킬 슬롯 인덱스")]
[SerializeField] private int[] slotMappings = { 6, 0, 1, 2, 3, 4, 5 };
[Header("Keybind Labels")]
[Tooltip("키바인딩 표시 텍스트 (기본: Q, W, E, R, A, S)")]
[SerializeField] private string[] keyLabels = { "Q", "W", "E", "R", "A", "S" };
[Tooltip("키바인딩 표시 텍스트")]
[SerializeField] private string[] keyLabels = { "Ctrl", "L", "R", "1", "2", "3", "4" };
private PlayerSkillInput playerSkillInput;
private PlayerNetworkController networkController;
private void Awake()
{
AutoCollectSkillSlots();
}
private void OnValidate()
{
AutoCollectSkillSlots();
}
private void Start()
{
// 로컬 플레이어 찾기
FindLocalPlayer();
}
/// <summary>
/// 자식 슬롯을 자동 수집해 프리팹 중첩 구조 변경에도 참조가 유지되도록 합니다.
/// </summary>
private void AutoCollectSkillSlots()
{
SkillSlotUI[] foundSlots = GetComponentsInChildren<SkillSlotUI>(true);
if (foundSlots == null || foundSlots.Length == 0)
{
return;
}
if (skillSlots == null || skillSlots.Length != foundSlots.Length)
{
skillSlots = foundSlots;
return;
}
for (int i = 0; i < foundSlots.Length; i++)
{
if (skillSlots[i] != foundSlots[i])
{
skillSlots = foundSlots;
return;
}
}
EnsureDisplayConfig();
}
/// <summary>
/// 슬롯 수 변경이나 프리팹 구조 변경 시 기본 표시 구성을 복구합니다.
/// </summary>
private void EnsureDisplayConfig()
{
int slotCount = skillSlots != null ? skillSlots.Length : 0;
if (slotCount <= 0)
{
return;
}
if (!IsValidSlotMappings(slotMappings, slotCount))
{
slotMappings = BuildDefaultSlotMappings(slotCount);
}
if (keyLabels == null || keyLabels.Length != slotCount)
{
keyLabels = BuildDefaultKeyLabels(slotCount);
}
}
/// <summary>
/// 7칸 액션바는 긴급회피를 맨 왼쪽에 두고, 나머지는 기본 스킬 순서를 유지합니다.
/// </summary>
private static int[] BuildDefaultSlotMappings(int slotCount)
{
int[] defaultMappings = new int[slotCount];
if (slotCount == 7)
{
defaultMappings[0] = 6;
for (int i = 1; i < slotCount; i++)
{
defaultMappings[i] = i - 1;
}
return defaultMappings;
}
for (int i = 0; i < slotCount; i++)
{
defaultMappings[i] = i;
}
return defaultMappings;
}
/// <summary>
/// 기본 키 라벨을 슬롯 수에 맞춰 생성합니다.
/// </summary>
private static string[] BuildDefaultKeyLabels(int slotCount)
{
if (slotCount == 7)
{
return new[] { "Ctrl", "L", "R", "1", "2", "3", "4" };
}
string[] defaultLabels = new string[slotCount];
for (int i = 0; i < slotCount; i++)
{
defaultLabels[i] = (i + 1).ToString();
}
return defaultLabels;
}
/// <summary>
/// 표시 매핑이 현재 슬롯 수에 대해 유효한지 검사합니다.
/// </summary>
private static bool IsValidSlotMappings(int[] mappings, int slotCount)
{
if (mappings == null || mappings.Length != slotCount)
{
return false;
}
bool[] usedIndices = new bool[slotCount];
for (int i = 0; i < mappings.Length; i++)
{
int mappedIndex = mappings[i];
if (mappedIndex < 0 || mappedIndex >= slotCount || usedIndices[mappedIndex])
{
return false;
}
usedIndices[mappedIndex] = true;
}
return true;
}
/// <summary>
/// UI 인덱스를 실제 플레이어 스킬 슬롯 인덱스로 변환합니다.
/// </summary>
private int GetMappedSlotIndex(int displayIndex)
{
EnsureDisplayConfig();
if (displayIndex < 0 || displayIndex >= slotMappings.Length)
{
return displayIndex;
}
return slotMappings[displayIndex];
}
/// <summary>
/// 실제 슬롯 인덱스를 표시 슬롯 인덱스로 역변환합니다.
/// </summary>
private int GetDisplayIndex(int slotIndex)
{
EnsureDisplayConfig();
for (int i = 0; i < slotMappings.Length; i++)
{
if (slotMappings[i] == slotIndex)
{
return i;
}
}
return -1;
}
private void FindLocalPlayer()
{
var players = FindObjectsByType<PlayerSkillInput>(FindObjectsSortMode.None);
@@ -57,17 +225,19 @@ namespace Colosseum.UI
private void InitializeSlots()
{
AutoCollectSkillSlots();
if (playerSkillInput == null) return;
int initializedCount = 0;
for (int i = 0; i < skillSlots.Length && i < keyLabels.Length; i++)
for (int i = 0; i < skillSlots.Length; i++)
{
SkillData skill = playerSkillInput.GetSkill(i);
int mappedSlotIndex = GetMappedSlotIndex(i);
SkillData skill = playerSkillInput.GetSkill(mappedSlotIndex);
string keyLabel = i < keyLabels.Length ? keyLabels[i] : (i + 1).ToString();
if (skillSlots[i] != null)
{
skillSlots[i].Initialize(i, skill, keyLabel);
skillSlots[i].Initialize(mappedSlotIndex, skill, keyLabel);
if (skill != null) initializedCount++;
}
else
@@ -102,16 +272,17 @@ namespace Colosseum.UI
{
if (skillSlots[i] == null) continue;
SkillData skill = playerSkillInput.GetSkill(i);
int mappedSlotIndex = GetMappedSlotIndex(i);
SkillData skill = playerSkillInput.GetSkill(mappedSlotIndex);
if (skill == null) continue;
float remainingCooldown = playerSkillInput.GetRemainingCooldown(i);
float remainingCooldown = playerSkillInput.GetRemainingCooldown(mappedSlotIndex);
float totalCooldown = skill.Cooldown;
bool hasEnoughMana = networkController == null || networkController.Mana >= skill.ManaCost;
if (shouldLog && remainingCooldown > 0f)
{
Debug.Log($"[SkillQuickSlotUI] Slot {i}: {skill.SkillName}, CD: {remainingCooldown:F1}/{totalCooldown:F1}");
Debug.Log($"[SkillQuickSlotUI] Slot {mappedSlotIndex}: {skill.SkillName}, CD: {remainingCooldown:F1}/{totalCooldown:F1}");
}
skillSlots[i].UpdateState(remainingCooldown, totalCooldown, hasEnoughMana);
@@ -133,10 +304,13 @@ namespace Colosseum.UI
/// </summary>
public void UpdateSkillSlot(int slotIndex, SkillData skill)
{
if (slotIndex < 0 || slotIndex >= skillSlots.Length) return;
AutoCollectSkillSlots();
string keyLabel = slotIndex < keyLabels.Length ? keyLabels[slotIndex] : (slotIndex + 1).ToString();
skillSlots[slotIndex].Initialize(slotIndex, skill, keyLabel);
int displayIndex = GetDisplayIndex(slotIndex);
if (displayIndex < 0 || displayIndex >= skillSlots.Length) return;
string keyLabel = displayIndex < keyLabels.Length ? keyLabels[displayIndex] : (displayIndex + 1).ToString();
skillSlots[displayIndex].Initialize(slotIndex, skill, keyLabel);
}
}
}