Compare commits

...

9 Commits

Author SHA1 Message Date
1261d4dc3c feat: 젬 장착 제약 시스템 추가
- 기반 스킬 분류를 도입하고 젬별 장착 가능 스킬 타입 조건을 추가함
- 동일 젬 중복 장착, 카테고리 상호 배타, 특정 젬 상호 배타를 로드아웃 검증에 반영함
- 테스트용 젬/스킬 자산과 디버그 생성 메뉴를 새 제약 구조에 맞게 갱신함
- Unity 재컴파일과 콘솔 확인으로 신규 컴파일 에러가 없음을 검증함
2026-03-26 14:49:59 +09:00
e4710f9a29 chore: 세션 공통 작업 규칙 정리
- 사용자 작성 옵시디언 문서에 Codex 메모를 별도 구역으로만 추가하는 규칙을 명시
- 고위력 기술, 보호막 구조, 보스 시그니처 전조 표현 등 최근 세션 합의를 공통 작업 규칙에 반영
- 공유 옵시디언 볼트의 세션 공통 합의 문서를 참조하도록 연결
2026-03-26 13:47:53 +09:00
8a1f11d134 feat: 젬 이상상태 및 수치형 보정 확장
- SkillGemData와 SkillLoadoutEntry를 확장해 자기 강화/적중 이상상태와 피해·회복·보호막·위협 배율을 해석하도록 정리
- SkillController와 SkillEffect 경로를 보강해 cast start 이상상태, on-hit 이상상태, 반복 시전, 출력 보정이 실제 효과에 반영되도록 연결
- 강인함/약화 테스트 젬과 자기강화/적중이상/상태복합 프리셋, 디버그 메뉴를 추가해 젬 조합 검증 경로를 보강
- 런타임에서 약화 디버프 적용, 강인함+약화 동시 적용, 파쇄/수호/도전자 보정값 해석을 확인
2026-03-26 13:40:06 +09:00
78dbbbf88d fix: 젬 테스트 공격 클립과 반복 재생 가시성 정리
- 젬 테스트 공격이 커스텀 분리 클립 대신 원본 찌르기 클립을 사용하도록 수정함
- 테스트 스킬의 루트 모션을 끄고 반복 재생 시 위치가 무너지는 문제를 줄임
- 실제 4번 키 반복 재생이 정상적으로 두 번 보이는 것을 확인함
- 관련 TMP 폰트 아틀라스 갱신을 함께 반영함
2026-03-26 12:53:25 +09:00
b4475ea77f feat: 젬 반복 시전 로직 및 테스트 프리셋 추가
- SkillGemData에 카테고리, 시전 속도 배율, 추가 반복 횟수 필드를 추가함
- SkillLoadoutEntry가 젬 합산 기준 최종 속도와 반복 횟수를 계산하도록 확장함
- SkillController가 반복 횟수만큼 스킬을 재시전하고 시작 효과와 OnEffect를 매 반복에 다시 적용하도록 수정함
- 연속 젬과 반복 젬 테스트 프리셋을 추가하고 디버그 메뉴에 적용 및 계산 로그 경로를 보강함
- 공격형 테스트 젬 자산과 추가 대미지 이펙트를 정리하고 무젬 35, 반복 젬 70 피해를 검증함
2026-03-26 12:36:03 +09:00
dedfb60a4c chore: Codex 문서 보완 메모 규칙 추가
- 사용자 작성 옵시디언 문서는 원문 구조를 유지하도록 작업 규칙을 추가함
- Codex가 보완한 내용은 별도 구역으로 분리해 표시하도록 명시함
- 이후 세션에서도 동일한 문서 수정 규칙을 따르도록 AGENTS 지침을 보강함
2026-03-26 12:35:41 +09:00
aaa7d2d6a7 feat: 보호막 타입 분리 및 드로그 시그니처 전조 정리
- 보호막을 단일 수치에서 타입별 독립 인스턴스 구조로 리팩터링하고 같은 타입만 갱신되도록 정리
- 플레이어/보스 보호막 상태를 이상상태와 연동해 HUD 및 보스 UI에서 타입별로 식별 가능하게 보강
- 드로그 집행 개시 전조를 집행 준비 이상상태 기반으로 재구성하고 관련 데이터와 보스 컨텍스트를 정리
- 전투 밸런스 계측기와 디버그 메뉴를 추가해 피해, 치유, 보호막, 위협, 패턴 사용량 측정 경로를 마련
- 테스트용 보호막 A/B와 시그니처 전조 자산을 추가하고 기본 포트 7777 원복 후 빌드 및 런타임 검증을 완료
2026-03-26 11:19:19 +09:00
3db8acfaaa feat: 다중 젬 공격 검증용 프리셋 및 디버그 보강
- 젬 테스트 공격용 공격형 젬 3종과 추가 피해 이펙트 자산을 추가
- 단일/복합/삼중 젬 프리셋과 공격 삼중 젬 테스트 프리셋을 생성 경로에 반영
- 플레이어 스킬 디버그 메뉴에 젬 프리셋 적용, 보스 체력 확인, 공격 검증 경로를 추가
- 추가 피해 이펙트의 타겟 레이어 설정을 수정해 보스 타격이 실제 대미지로 이어지도록 보강
- 무젬 35, 공격 삼중 젬 56으로 서로 다른 추가 피해 젬 3종의 합산 대미지 21을 검증
2026-03-25 19:59:16 +09:00
24b284ad7e feat: 젬 테스트 경로 및 보스 기절 디버그 추가
- 다중 젬 슬롯용 타입을 별도 스크립트로 분리하고 테스트 젬/로드아웃 자산 생성 경로를 정리

- 젬 테스트 전용 공격 스킬과 분리된 애니메이션 자산을 추가해 베이스 스킬 검증 경로를 마련

- PlayerSkillDebugMenu와 MPP 디버그 메뉴를 보강해 젬 프리셋 적용, 원격 테스트, 보스 기절 디버그 메뉴를 추가

- BossCombatBehaviorContext와 공통 BT 액션이 기절 상태를 존중하도록 수정해 보스 추적과 패턴 실행을 중단

- Unity 리프레시와 외부 빌드 통과를 확인하고 드로그전 및 MPP 기준 젬 프리셋 적용 흐름을 검증
2026-03-25 18:38:12 +09:00
123 changed files with 8812 additions and 353 deletions

View File

@@ -15,6 +15,10 @@ Design docs are maintained in Obsidian Vault: `\\Truenas\smb\Obsidian Vault\Colo
- 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.
- When editing user-authored Obsidian notes, preserve the user's original text structure as much as possible.
- If Codex adds interpretation, clarification, proposals, or implementation notes to a user-authored note, put them in a clearly labeled separate section such as `Codex 보완 메모` or `Codex 제안` so the added content is visibly distinguishable from the user's original writing.
- Avoid silently rewriting or blending Codex-authored guidance into the user's original bullet lists unless the user explicitly asks for a rewrite.
- Cross-session design agreements that should be checked before related work are summarized in `\\Truenas\smb\Obsidian Vault\Colosseum\개발\세션 공통 합의.md`.
### Game Concept
- **Genre**: Online multiplayer co-op action RPG (3rd person)
@@ -338,3 +342,6 @@ public class NetworkedComponent : NetworkBehaviour
- Use `[TextArea]` for multi-line string fields
- Private fields should use `camelCase` (no `m_` or `_` prefix)
- Prefer `IReadOnlyList<T>` for exposing collections
- 프로젝트 용어로는 `필살기`보다 `고위력 기술`을 우선 사용한다.
- 보호막은 단일 값이 아니라 `타입별 독립 인스턴스`로 취급한다. 같은 타입은 자기 자신만 갱신되고, 서로 다른 타입은 공존하며, 흡수 순서는 적용 순서를 따른다.
- 보스 시그니처 전조는 가능한 한 정확한 진행 수치 UI보다 명확한 모션/VFX로 읽히게 한다. 차단 진행도나 정확한 누적 수치 노출은 명시 요청이 없으면 피한다.

View File

@@ -6051,6 +6051,8 @@ MonoBehaviour:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.UI.PlayerHUD
healthBar: {fileID: 281797463}
manaBar: {fileID: 1237841695}
abnormalitySummaryText: {fileID: 0}
autoCreateAbnormalitySummary: 1
autoFindPlayer: 1
--- !u!4 &1171449866 stripped
Transform:
@@ -6814,15 +6816,15 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 7035590099291789281, guid: 2122b1e1b36684a40978673f272f200e, type: 3}
propertyPath: m_AnchorMax.x
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7035590099291789281, guid: 2122b1e1b36684a40978673f272f200e, type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7035590099291789281, guid: 2122b1e1b36684a40978673f272f200e, type: 3}
propertyPath: m_AnchorMin.x
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7053117599274393893, guid: 2122b1e1b36684a40978673f272f200e, type: 3}
propertyPath: m_text
@@ -10866,15 +10868,15 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4724035329832922458, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_AnchorMax.x
value: 0
value: 0.2
objectReference: {fileID: 0}
- target: {fileID: 4724035329832922458, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4724035329832922458, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_AnchorMin.x
value: 0
value: 0.2
objectReference: {fileID: 0}
- target: {fileID: 5468776293638745500, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_sharedMaterial
@@ -10882,15 +10884,15 @@ PrefabInstance:
objectReference: {fileID: 2399985188671511309, guid: ef44cbe516f6f9f418375e5b2b73ad8d, type: 2}
- target: {fileID: 5704451173235104889, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_AnchorMax.x
value: 0
value: 0.2
objectReference: {fileID: 0}
- target: {fileID: 5704451173235104889, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5704451173235104889, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_AnchorMin.x
value: 0
value: 0.2
objectReference: {fileID: 0}
- target: {fileID: 6042451605894433948, guid: 6a6d1b384d7c82f49802f1650bb34b40, type: 3}
propertyPath: m_SizeDelta.y

View File

@@ -0,0 +1,333 @@
fileFormatVersion: 2
guid: 1a2314cec0db9814f90aaa68fc5ce4bd
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName: root
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 0
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations:
- serializedVersion: 16
name: A_MOD_SWD_Attack_GemTest_RM_Neut
takeName: A_MOD_SWD_Attack_HeavyStab01_RM_Neut
internalID: -8689311932429934276
firstFrame: 1
lastFrame: 33
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.6
functionName: OnEffect
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 1.0
functionName: OnSkillEnd
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask:
- path:
weight: 1
- path: root
weight: 1
- path: root/ik_foot_root
weight: 1
- path: root/ik_foot_root/ik_foot_l
weight: 1
- path: root/ik_foot_root/ik_foot_r
weight: 1
- path: root/ik_hand_root
weight: 1
- path: root/ik_hand_root/ik_hand_gun
weight: 1
- path: root/ik_hand_root/ik_hand_gun/ik_hand_l
weight: 1
- path: root/ik_hand_root/ik_hand_gun/ik_hand_r
weight: 1
- path: root/pelvis
weight: 1
- path: root/pelvis/hipAttach_l
weight: 1
- path: root/pelvis/hipAttach_r
weight: 1
- path: root/pelvis/hipAttachBack
weight: 1
- path: root/pelvis/hipAttachFront
weight: 1
- path: root/pelvis/spine_01
weight: 1
- path: root/pelvis/spine_01/spine_02
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/backAttach
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/shoulderAttach_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/elbowAttach_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/index_01_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/index_01_l/index_02_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/index_01_l/index_02_l/index_03_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/middle_01_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/middle_01_l/middle_02_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/middle_01_l/middle_02_l/middle_03_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/pinky_01_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/pinky_01_l/pinky_02_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/pinky_01_l/pinky_02_l/pinky_03_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/prop_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/ring_01_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/ring_01_l/ring_02_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/ring_01_l/ring_02_l/ring_03_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/thumb_01_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/thumb_01_l/thumb_02_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/hand_l/thumb_01_l/thumb_02_l/thumb_03_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/lowerarm_l/lowerarm_twist_01_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_l/upperarm_l/upperarm_twist_01_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/shoulderAttach_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/elbowAttach_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/index_01_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/index_01_r/index_02_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/index_01_r/index_02_r/index_03_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/middle_01_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/middle_01_r/middle_02_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/middle_01_r/middle_02_r/middle_03_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/pinky_01_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/pinky_01_r/pinky_02_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/pinky_01_r/pinky_02_r/pinky_03_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/prop_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/ring_01_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/ring_01_r/ring_02_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/ring_01_r/ring_02_r/ring_03_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/thumb_01_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/thumb_01_r/thumb_02_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/hand_r/thumb_01_r/thumb_02_r/thumb_03_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/lowerarm_r/lowerarm_twist_01_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/clavicle_r/upperarm_r/upperarm_twist_01_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head/eye_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head/eye_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head/eyeLight_l
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head/eyeLight_r
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head/faceAttach
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head/headAttach
weight: 1
- path: root/pelvis/spine_01/spine_02/spine_03/neck_01/head/jaw
weight: 1
- path: root/pelvis/thigh_l
weight: 1
- path: root/pelvis/thigh_l/calf_l
weight: 1
- path: root/pelvis/thigh_l/calf_l/calf_twist_01_l
weight: 1
- path: root/pelvis/thigh_l/calf_l/foot_l
weight: 1
- path: root/pelvis/thigh_l/calf_l/foot_l/ball_l
weight: 1
- path: root/pelvis/thigh_l/calf_l/kneeAttach_l
weight: 1
- path: root/pelvis/thigh_l/thigh_twist_01_l
weight: 1
- path: root/pelvis/thigh_r
weight: 1
- path: root/pelvis/thigh_r/calf_r
weight: 1
- path: root/pelvis/thigh_r/calf_r/calf_twist_01_r
weight: 1
- path: root/pelvis/thigh_r/calf_r/foot_r
weight: 1
- path: root/pelvis/thigh_r/calf_r/foot_r/ball_r
weight: 1
- path: root/pelvis/thigh_r/calf_r/kneeAttach_r
weight: 1
- path: root/pelvis/thigh_r/thigh_twist_01_r
weight: 1
- path: SK_DMMY_BASE_01_00BODY
weight: 1
maskType: 1
maskSource: {fileID: 31900000, guid: 3daacf102d24acb4aae029057b824d13, type: 2}
additiveReferencePoseFrame: 0
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,32 @@
%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_Common_보호막
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
abnormalityName: 보호막
icon: {fileID: 0}
duration: 0
level: 1
isDebuff: 0
showInUI: 1
isShieldState: 1
ignoreHitReaction: 0
loopingVfxPrefab: {fileID: 0}
loopingVfxOffset: {x: 0, y: 0, z: 0}
loopingVfxScaleMultiplier: 1
parentLoopingVfxToTarget: 1
statModifiers: []
periodicInterval: 0
periodicValue: 0
controlType: 0
slowMultiplier: 0.5
incomingDamageMultiplier: 1

View File

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

View File

@@ -0,0 +1,31 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b08cc671f858a3b409170a5356e960a0, type: 3}
m_Name: Data_Abnormality_Drog_집행준비
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
abnormalityName: 집행 준비
icon: {fileID: 0}
duration: 0
level: 1
isDebuff: 0
showInUI: 0
ignoreHitReaction: 0
loopingVfxPrefab: {fileID: 1800972780968652, guid: 205d983549fba2a47a7808abf228f4be, type: 3}
loopingVfxOffset: {x: 0, y: 3.2, z: 0}
loopingVfxScaleMultiplier: 6
parentLoopingVfxToTarget: 0
statModifiers: []
periodicInterval: 0
periodicValue: 0
controlType: 0
slowMultiplier: 0.5
incomingDamageMultiplier: 1

View File

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

View File

@@ -0,0 +1,32 @@
%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_Test_보호막A
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
abnormalityName: 보호막 A
icon: {fileID: 0}
duration: 0
level: 1
isDebuff: 0
showInUI: 1
isShieldState: 1
ignoreHitReaction: 0
loopingVfxPrefab: {fileID: 0}
loopingVfxOffset: {x: 0, y: 0, z: 0}
loopingVfxScaleMultiplier: 1
parentLoopingVfxToTarget: 1
statModifiers: []
periodicInterval: 0
periodicValue: 0
controlType: 0
slowMultiplier: 0.5
incomingDamageMultiplier: 1

View File

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

View File

@@ -0,0 +1,32 @@
%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_Test_보호막B
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
abnormalityName: 보호막 B
icon: {fileID: 0}
duration: 0
level: 1
isDebuff: 0
showInUI: 1
isShieldState: 1
ignoreHitReaction: 0
loopingVfxPrefab: {fileID: 0}
loopingVfxOffset: {x: 0, y: 0, z: 0}
loopingVfxScaleMultiplier: 1
parentLoopingVfxToTarget: 1
statModifiers: []
periodicInterval: 0
periodicValue: 0
controlType: 0
slowMultiplier: 0.5
incomingDamageMultiplier: 1

View File

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

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uACF5\uACA9\uC0BC\uC911\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uACF5\uACA9 \uC0BC\uC911 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uC11C\uB85C \uB2E4\uB978 \uCD94\uAC00 \uD53C\uD574 \uC82C 3\uC885\uC744
\uB3D9\uC2DC\uC5D0 \uC0AC\uC6A9\uD558\uB294 \uACF5\uACA9 \uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 1020083ab98b8214f918fa2ab7c1a3a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: a822c7e8c7cee5546ad594b582208e53, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 29e1ce0656471b54f84b18a773032a99, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: 66ccf80cf9c50614dbe13ea7f24a6f19, type: 2}
- {fileID: 11400000, guid: cf3e3e1f9f1f42f499196fa819263dc1, type: 2}
- {fileID: 11400000, guid: 47a98aa9a30748a4da49455ac0fbd142, type: 2}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uB51C\uB7EC_\uBCF5\uD569\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uB51C\uB7EC \uBCF5\uD569 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uD30C\uC1C4 + \uC218\uD638 \uC82C\uC744 \uB3D9\uC2DC\uC5D0 \uC0AC\uC6A9\uD558\uB294
\uB51C\uB7EC \uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b8c86399865e91144a3d6fcfddc04fd9, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: 2c42bf0e90f5dd9488d534c337a44eed, type: 2}
- {fileID: 11400000, guid: de5e48980eba8794c93ea7168d592f8f, type: 2}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uB51C\uB7EC_\uC0BC\uC911\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uB51C\uB7EC \uC0BC\uC911 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uD30C\uC1C4 + \uC218\uD638 + \uB3C4\uC804\uC790 \uC82C\uC744 \uB3D9\uC2DC\uC5D0
\uC0AC\uC6A9\uD558\uB294 \uB51C\uB7EC \uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b8c86399865e91144a3d6fcfddc04fd9, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: 2c42bf0e90f5dd9488d534c337a44eed, type: 2}
- {fileID: 11400000, guid: de5e48980eba8794c93ea7168d592f8f, type: 2}
- {fileID: 11400000, guid: e86536592f45d2b49b9d25abbad1b184, type: 2}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uB51C\uB7EC_\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uB51C\uB7EC \uC82C \uD14C\uC2A4\uD2B8"
description: "\uD30C\uC1C4 \uC82C\uC744 \uC0AC\uC6A9\uD558\uB294 \uB51C\uB7EC \uAC80\uC99D
\uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b8c86399865e91144a3d6fcfddc04fd9, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: 2c42bf0e90f5dd9488d534c337a44eed, type: 2}
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uBC18\uBCF5\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uBC18\uBCF5 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uC5F0\uC18D \uC82C\uC744 \uC0AC\uC6A9\uD558\uB294 \uBC18\uBCF5 \uC2DC\uC804
\uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b8c86399865e91144a3d6fcfddc04fd9, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: 863dcd9e10827f94ab4574b529ffe683, type: 2}
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,48 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uC0C1\uD0DC\uBCF5\uD569\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uC0C1\uD0DC \uBCF5\uD569 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uAC15\uC778\uD568 + \uC57D\uD654 \uC82C\uC744 \uB3D9\uC2DC\uC5D0
\uC0AC\uC6A9\uD574 \uC790\uAE30 \uAC15\uD654\uC640 \uC801\uC911 \uB514\uBC84\uD504\uB97C
\uD568\uAED8 \uAC80\uC99D\uD558\uB294 \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b8c86399865e91144a3d6fcfddc04fd9, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: e020eee86f6c97f4393672759d73602e, type: 2}
- {fileID: 11400000, guid: 2edf7687dc6caa0489ae2111499fcfab, type: 2}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uC790\uAE30\uAC15\uD654\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uC790\uAE30\uAC15\uD654 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uAC15\uC778\uD568 \uC82C\uC73C\uB85C \uC2DC\uC804 \uC2DC \uC790\uAE30
\uAC15\uD654 \uC0C1\uD0DC\uB97C \uAC80\uC99D\uD558\uB294 \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b8c86399865e91144a3d6fcfddc04fd9, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: e020eee86f6c97f4393672759d73602e, type: 2}
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uC801\uC911\uC774\uC0C1\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uC801\uC911 \uC774\uC0C1 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uC57D\uD654 \uC82C\uC73C\uB85C \uC801\uC911 \uB300\uC0C1 \uB514\uBC84\uD504\uB97C
\uAC80\uC99D\uD558\uB294 \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b8c86399865e91144a3d6fcfddc04fd9, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: 2edf7687dc6caa0489ae2111499fcfab, type: 2}
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uC9C0\uC6D0_\uBCF5\uD569\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uC9C0\uC6D0 \uBCF5\uD569 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uC218\uD638 + \uB3C4\uC804\uC790 \uC82C\uC744 \uB3D9\uC2DC\uC5D0
\uC0AC\uC6A9\uD558\uB294 \uC9C0\uC6D0 \uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 21598931a138aa44c86d85d67f6c534a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 7a245d40a0d21b248b942033d4ec4309, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b78d2eb76cdfbe248b65bafe6e1dc231, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: de5e48980eba8794c93ea7168d592f8f, type: 2}
- {fileID: 11400000, guid: e86536592f45d2b49b9d25abbad1b184, type: 2}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uC9C0\uC6D0_\uC0BC\uC911\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uC9C0\uC6D0 \uC0BC\uC911 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uC218\uD638 + \uB3C4\uC804\uC790 + \uD30C\uC1C4 \uC82C\uC744 \uB3D9\uC2DC\uC5D0
\uC0AC\uC6A9\uD558\uB294 \uC9C0\uC6D0 \uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 21598931a138aa44c86d85d67f6c534a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 7a245d40a0d21b248b942033d4ec4309, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b78d2eb76cdfbe248b65bafe6e1dc231, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: de5e48980eba8794c93ea7168d592f8f, type: 2}
- {fileID: 11400000, guid: e86536592f45d2b49b9d25abbad1b184, type: 2}
- {fileID: 11400000, guid: 2c42bf0e90f5dd9488d534c337a44eed, type: 2}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uC9C0\uC6D0_\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uC9C0\uC6D0 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uC218\uD638 \uC82C\uC744 \uC0AC\uC6A9\uD558\uB294 \uC9C0\uC6D0 \uAC80\uC99D
\uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 21598931a138aa44c86d85d67f6c534a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 7a245d40a0d21b248b942033d4ec4309, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: b78d2eb76cdfbe248b65bafe6e1dc231, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: de5e48980eba8794c93ea7168d592f8f, type: 2}
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uD0F1\uCEE4_\uBCF5\uD569\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uD0F1\uCEE4 \uBCF5\uD569 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uB3C4\uC804\uC790 + \uD30C\uC1C4 \uC82C\uC744 \uB3D9\uC2DC\uC5D0
\uC0AC\uC6A9\uD558\uB294 \uD0F1\uCEE4 \uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 1020083ab98b8214f918fa2ab7c1a3a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: a822c7e8c7cee5546ad594b582208e53, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 29e1ce0656471b54f84b18a773032a99, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: e86536592f45d2b49b9d25abbad1b184, type: 2}
- {fileID: 11400000, guid: 2c42bf0e90f5dd9488d534c337a44eed, type: 2}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uD0F1\uCEE4_\uC0BC\uC911\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uD0F1\uCEE4 \uC0BC\uC911 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uB3C4\uC804\uC790 + \uD30C\uC1C4 + \uC218\uD638 \uC82C\uC744 \uB3D9\uC2DC\uC5D0
\uC0AC\uC6A9\uD558\uB294 \uD0F1\uCEE4 \uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 1020083ab98b8214f918fa2ab7c1a3a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: a822c7e8c7cee5546ad594b582208e53, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 29e1ce0656471b54f84b18a773032a99, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: e86536592f45d2b49b9d25abbad1b184, type: 2}
- {fileID: 11400000, guid: 2c42bf0e90f5dd9488d534c337a44eed, type: 2}
- {fileID: 11400000, guid: de5e48980eba8794c93ea7168d592f8f, type: 2}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -0,0 +1,47 @@
%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: 26d5895a89de4f24aade1ea4b5f7644e, type: 3}
m_Name: "Data_LoadoutPreset_Player_\uD0F1\uCEE4_\uC82C\uD14C\uC2A4\uD2B8"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.PlayerLoadoutPreset
presetName: "\uD0F1\uCEE4 \uC82C \uD14C\uC2A4\uD2B8"
description: "\uB3C4\uC804\uC790 \uC82C\uC744 \uC0AC\uC6A9\uD558\uB294 \uD0F1\uCEE4
\uAC80\uC99D \uD504\uB9AC\uC14B"
slots:
- baseSkill: {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 1020083ab98b8214f918fa2ab7c1a3a1, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: a822c7e8c7cee5546ad594b582208e53, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 29e1ce0656471b54f84b18a773032a99, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 549a9978338eb504690c3c490acc0c60, type: 2}
socketedGems:
- {fileID: 11400000, guid: e86536592f45d2b49b9d25abbad1b184, type: 2}
- {fileID: 0}
- {fileID: 0}
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
socketedGems:
- {fileID: 0}
- {fileID: 0}

View File

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

View File

@@ -19,5 +19,5 @@ MonoBehaviour:
Duration: 0
- Type: 1
Skill: {fileID: 0}
Duration: 6.5
Duration: 0
cooldown: 45

View File

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

View File

@@ -0,0 +1,36 @@
%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: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uAC15\uC778\uD568"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uAC15\uC778\uD568"
description: "\uC2A4\uD0AC \uC0AC\uC6A9 \uC2DC \uC790\uC2E0\uC5D0\uAC8C \uACBD\uC9C1
\uBA74\uC5ED\uC744 \uBD80\uC5EC\uD558\uB294 \uD14C\uC2A4\uD2B8\uC6A9 \uBC29\uC5B4
\uC82C"
icon: {fileID: 0}
category: 3
allowedSkillTypes: 63
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1.05
cooldownMultiplier: 1.05
castSpeedMultiplier: 1
damageMultiplier: 1
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects: []
selfAbnormalities:
- {fileID: 11400000, guid: f4f55b61c9d04fd2b83b9c80e81fa0a2, type: 2}
onHitAbnormalities: []

View File

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

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uAD00\uD1B5"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uAD00\uD1B5"
description: "\uB192\uC740 \uACE0\uC815 \uCD94\uAC00 \uD53C\uD574\uB97C \uBD80\uC5EC\uD558\uB294
\uD14C\uC2A4\uD2B8\uC6A9 \uACF5\uACA9 \uC82C"
icon: {fileID: 0}
category: 1
allowedSkillTypes: 1
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1
cooldownMultiplier: 1
castSpeedMultiplier: 1
damageMultiplier: 1
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects:
- triggerIndex: 0
effects:
- {fileID: 11400000, guid: 2a467b25340d65f4a854350319f10d0a, type: 2}
selfAbnormalities: []
onHitAbnormalities: []

View File

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

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uB3C4\uC804\uC790"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uB3C4\uC804\uC790"
description: "\uACE0\uC704\uB825 \uAE30\uC220\uC5D0 \uC704\uD611 \uC120\uC810 \uAE30\uB2A5\uC744
\uC5B9\uB294 \uD14C\uC2A4\uD2B8\uC6A9 \uC82C"
icon: {fileID: 0}
category: 2
allowedSkillTypes: 1
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1
cooldownMultiplier: 1
castSpeedMultiplier: 1
damageMultiplier: 1
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1.5
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects:
- triggerIndex: 0
effects:
- {fileID: 11400000, guid: f0aaa98426be3d44082a386c00ea9aea, type: 2}
selfAbnormalities: []
onHitAbnormalities: []

View File

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

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uC218\uD638"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uC218\uD638"
description: "\uACE0\uC704\uB825 \uAE30\uC220\uC5D0 \uBCF4\uD638\uB9C9 \uBCF4\uC870\uB97C
\uC5B9\uB294 \uD14C\uC2A4\uD2B8\uC6A9 \uC82C"
icon: {fileID: 0}
category: 4
allowedSkillTypes: 1
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1.05
cooldownMultiplier: 1.1
castSpeedMultiplier: 1
damageMultiplier: 1
healMultiplier: 1.2
shieldMultiplier: 1.5
threatMultiplier: 1
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects:
- triggerIndex: 0
effects:
- {fileID: 11400000, guid: 65ed1eabc2fb73d43b86230317222608, type: 2}
selfAbnormalities: []
onHitAbnormalities: []

View File

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

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uC57D\uD654"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uC57D\uD654"
description: "\uC2A4\uD0AC \uC801\uC911 \uB300\uC0C1\uC5D0\uAC8C \uD14C\uC2A4\uD2B8
\uB514\uBC84\uD504\uB97C \uBD80\uC5EC\uD558\uB294 \uC81C\uC5B4 \uC82C"
icon: {fileID: 0}
category: 5
allowedSkillTypes: 63
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1.05
cooldownMultiplier: 1.05
castSpeedMultiplier: 1
damageMultiplier: 1
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects: []
selfAbnormalities: []
onHitAbnormalities:
- triggerIndex: 0
abnormalities:
- {fileID: 11400000, guid: c4abb0f89779f294ab99562e085e8f3b, type: 2}

View File

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

View File

@@ -0,0 +1,34 @@
%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: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uC5F0\uC18D"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uC5F0\uC18D"
description: "\uBD99\uC740 \uC2A4\uD0AC\uC744 \uD55C \uBC88 \uB354 \uBC18\uBCF5
\uC2DC\uC804\uD558\uB294 \uD14C\uC2A4\uD2B8\uC6A9 \uC82C"
icon: {fileID: 0}
category: 6
allowedSkillTypes: 1
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1.2
cooldownMultiplier: 1.15
castSpeedMultiplier: 1.1
damageMultiplier: 1
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1
additionalRepeatCount: 1
castStartEffects: []
triggeredEffects: []
selfAbnormalities: []
onHitAbnormalities: []

View File

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

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uC608\uB9AC\uD568"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uC608\uB9AC\uD568"
description: "\uACE0\uC815 \uCD94\uAC00 \uD53C\uD574\uB97C \uBD80\uC5EC\uD558\uB294
\uD14C\uC2A4\uD2B8\uC6A9 \uACF5\uACA9 \uC82C"
icon: {fileID: 0}
category: 1
allowedSkillTypes: 1
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1
cooldownMultiplier: 1
castSpeedMultiplier: 1
damageMultiplier: 1
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects:
- triggerIndex: 0
effects:
- {fileID: 11400000, guid: 197e5c38a24c95044a5959bb4c67f055, type: 2}
selfAbnormalities: []
onHitAbnormalities: []

View File

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

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uCDA9\uACA9"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uCDA9\uACA9"
description: "\uC911\uAC04 \uACE0\uC815 \uCD94\uAC00 \uD53C\uD574\uB97C \uBD80\uC5EC\uD558\uB294
\uD14C\uC2A4\uD2B8\uC6A9 \uACF5\uACA9 \uC82C"
icon: {fileID: 0}
category: 1
allowedSkillTypes: 1
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1
cooldownMultiplier: 1
castSpeedMultiplier: 1
damageMultiplier: 1
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects:
- triggerIndex: 0
effects:
- {fileID: 11400000, guid: 1a6d1b31b640d87499ef7c9e3580ed34, type: 2}
selfAbnormalities: []
onHitAbnormalities: []

View File

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

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e81a62ae7c7624847ab572ff37789bb8, type: 3}
m_Name: "Data_SkillGem_Player_\uD30C\uC1C4"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillGemData
gemName: "\uD30C\uC1C4"
description: "\uACE0\uC704\uB825 \uAE30\uC220\uC758 \uB2E8\uC77C \uD53C\uD574\uB97C
\uAC15\uD654\uD558\uB294 \uD14C\uC2A4\uD2B8\uC6A9 \uC82C"
icon: {fileID: 0}
category: 1
allowedSkillTypes: 1
incompatibleCategories:
incompatibleGems: []
manaCostMultiplier: 1.15
cooldownMultiplier: 1.1
castSpeedMultiplier: 1
damageMultiplier: 1.2
healMultiplier: 1
shieldMultiplier: 1
threatMultiplier: 1
additionalRepeatCount: 0
castStartEffects: []
triggeredEffects:
- triggerIndex: 0
effects:
- {fileID: 11400000, guid: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4, type: 2}
selfAbnormalities: []
onHitAbnormalities: []

View File

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

View File

@@ -15,9 +15,9 @@ MonoBehaviour:
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
skillClip: {fileID: 1196400477972205583, guid: 330fdc27ae77eab44a6cfa040fa46036, type: 3}
endClip: {fileID: -473667693787628719, guid: 580fc907eee299f43a914da368c7a639, type: 3}
animationSpeed: 0.5
useRootMotion: 0
ignoreRootMotionY: 0
jumpToTarget: 0
@@ -26,4 +26,6 @@ MonoBehaviour:
blockOtherSkillsWhileCasting: 1
cooldown: 0
manaCost: 0
castStartEffects:
- {fileID: 11400000, guid: 032be692478542b2b7eae48b2a5b29c1, type: 2}
effects: []

View File

@@ -10,11 +10,13 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: Data_Skill_Player_광역치유
m_Name: "Data_Skill_Player_\uAD11\uC5ED\uCE58\uC720"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: 광역 치유
description: 주변 아군과 자신의 체력을 함께 회복한다.
skillName: "\uAD11\uC5ED \uCE58\uC720"
description: "\uC8FC\uBCC0 \uC544\uAD70\uACFC \uC790\uC2E0\uC758 \uCCB4\uB825\uC744
\uD568\uAED8 \uD68C\uBCF5\uD55C\uB2E4."
icon: {fileID: 0}
baseTypes: 4
skillClip: {fileID: -8689311932429934276, guid: 836c26605050496b9fd07dd456e6ea82, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
@@ -26,6 +28,7 @@ MonoBehaviour:
blockOtherSkillsWhileCasting: 1
cooldown: 16
manaCost: 30
maxGemSlotCount: 2
castStartEffects:
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
effects:

View File

@@ -15,14 +15,19 @@ MonoBehaviour:
skillName: "\uAD6C\uB974\uAE30"
description:
icon: {fileID: 21300000, guid: eafcc94eae3865944b93e64c4e281aa0, type: 3}
baseTypes: 16
skillClip: {fileID: -14460799136228694, guid: d6d51384d6dd17a419c1d8e2a1c0c875, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 10
manaCost: 0
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: 8b2c3d4e5f60718293a4b5c6d7e8f901, type: 2}

View File

@@ -10,11 +10,14 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: Data_Skill_Player_도발
m_Name: "Data_Skill_Player_\uB3C4\uBC1C"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: 도발
description: 주변 적의 위협 수치를 크게 높이고 짧은 시간 동안 위협 생성량을 증가시킨다.
skillName: "\uB3C4\uBC1C"
description: "\uC8FC\uBCC0 \uC801\uC758 \uC704\uD611 \uC218\uCE58\uB97C \uD06C\uAC8C
\uB192\uC774\uACE0 \uC9E7\uC740 \uC2DC\uAC04 \uB3D9\uC548 \uC704\uD611 \uC0DD\uC131\uB7C9\uC744
\uC99D\uAC00\uC2DC\uD0A8\uB2E4."
icon: {fileID: 0}
baseTypes: 40
skillClip: {fileID: -4662563244894722208, guid: de4d0153716747cd9fc90c60f5efb1ae, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
@@ -26,5 +29,7 @@ MonoBehaviour:
blockOtherSkillsWhileCasting: 1
cooldown: 8
manaCost: 10
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: f0aaa98426be3d44082a386c00ea9aea, type: 2}

View File

@@ -13,13 +13,21 @@ MonoBehaviour:
m_Name: "Data_Skill_Player_\uB3CC\uC9C4"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uB3CC\uC9C4"
description:
description:
icon: {fileID: 0}
baseTypes: 16
skillClip: {fileID: 0}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 3
manaCost: 15
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2, type: 2}

View File

@@ -10,11 +10,13 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: Data_Skill_Player_방어태세
m_Name: "Data_Skill_Player_\uBC29\uC5B4\uD0DC\uC138"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: 방어 태세
description: 짧은 시간 동안 받는 피해를 줄이고 위협 생성량을 높인다.
skillName: "\uBC29\uC5B4 \uD0DC\uC138"
description: "\uC9E7\uC740 \uC2DC\uAC04 \uB3D9\uC548 \uBC1B\uB294 \uD53C\uD574\uB97C
\uC904\uC774\uACE0 \uC704\uD611 \uC0DD\uC131\uB7C9\uC744 \uB192\uC778\uB2E4."
icon: {fileID: 0}
baseTypes: 2
skillClip: {fileID: -592826573199220879, guid: 52e14756abda46499f4739d811043b3d, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
@@ -26,6 +28,7 @@ MonoBehaviour:
blockOtherSkillsWhileCasting: 1
cooldown: 10
manaCost: 12
maxGemSlotCount: 2
castStartEffects:
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
effects:

View File

@@ -15,11 +15,19 @@ MonoBehaviour:
skillName: "\uBCA0\uAE30"
description:
icon: {fileID: 0}
baseTypes: 1
skillClip: {fileID: -7717634560727564301, guid: 0f6fd9302e489b94d96774e2713b1317, type: 3}
endClip: {fileID: -8265974341663887746, guid: fbcbf9c09792c924296ac6036e76f6dc, type: 3}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 1
manaCost: 5
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: e23fca57309ab2b4faa5c380118cd07e, type: 2}

View File

@@ -10,11 +10,13 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: Data_Skill_Player_보호막
m_Name: "Data_Skill_Player_\uBCF4\uD638\uB9C9"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: 보호막
description: 주변 아군과 자신에게 피해를 흡수하는 보호막을 부여한다.
skillName: "\uBCF4\uD638\uB9C9"
description: "\uC8FC\uBCC0 \uC544\uAD70\uACFC \uC790\uC2E0\uC5D0\uAC8C \uD53C\uD574\uB97C
\uD761\uC218\uD558\uB294 \uBCF4\uD638\uB9C9\uC744 \uBD80\uC5EC\uD55C\uB2E4."
icon: {fileID: 0}
baseTypes: 6
skillClip: {fileID: -1185230921767219677, guid: f2d90cfa60b04630af1dde00f4d29320, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
@@ -26,6 +28,7 @@ MonoBehaviour:
blockOtherSkillsWhileCasting: 1
cooldown: 18
manaCost: 24
maxGemSlotCount: 2
castStartEffects:
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
effects:

View File

@@ -0,0 +1,34 @@
%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_Player_\uC82C\uD14C\uC2A4\uD2B8\uACF5\uACA9"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uC82C \uD14C\uC2A4\uD2B8 \uACF5\uACA9"
description: "\uB2E4\uC911 \uC82C \uD6A8\uACFC \uAC80\uC99D\uC6A9 \uBE60\uB978
\uB2E8\uC77C \uACF5\uACA9"
icon: {fileID: 0}
baseTypes: 1
skillClip: {fileID: -8689311932429934276, guid: ac0adc4c7f982fe4d82eac9c2267f0c6, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 0
ignoreRootMotionY: 0
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 0.5
manaCost: 3
maxGemSlotCount: 3
castStartEffects: []
effects:
- {fileID: 11400000, guid: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4, type: 2}

View File

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

View File

@@ -13,13 +13,21 @@ MonoBehaviour:
m_Name: "Data_Skill_Player_\uCC0C\uB974\uAE30"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uCC0C\uB974\uAE30"
description:
description:
icon: {fileID: 0}
baseTypes: 1
skillClip: {fileID: -8689311932429934276, guid: ac0adc4c7f982fe4d82eac9c2267f0c6, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 1
manaCost: 5
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4, type: 2}

View File

@@ -10,11 +10,13 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: Data_Skill_Player_철벽
m_Name: "Data_Skill_Player_\uCCA0\uBCBD"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: 철벽
description: 짧은 시간 동안 무적이 되며 위협 생성량이 약간 증가한다.
skillName: "\uCCA0\uBCBD"
description: "\uC9E7\uC740 \uC2DC\uAC04 \uB3D9\uC548 \uBB34\uC801\uC774 \uB418\uBA70
\uC704\uD611 \uC0DD\uC131\uB7C9\uC774 \uC57D\uAC04 \uC99D\uAC00\uD55C\uB2E4."
icon: {fileID: 0}
baseTypes: 6
skillClip: {fileID: -7313196749698736815, guid: 95764ba490b24918b73fc1553e34dc1e, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
@@ -26,6 +28,7 @@ MonoBehaviour:
blockOtherSkillsWhileCasting: 1
cooldown: 18
manaCost: 20
maxGemSlotCount: 2
castStartEffects:
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
effects:

View File

@@ -10,11 +10,12 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: Data_Skill_Player_치유
m_Name: "Data_Skill_Player_\uCE58\uC720"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: 치유
description: 자신의 체력을 빠르게 회복한다.
skillName: "\uCE58\uC720"
description: "\uC790\uC2E0\uC758 \uCCB4\uB825\uC744 \uBE60\uB974\uAC8C \uD68C\uBCF5\uD55C\uB2E4."
icon: {fileID: 0}
baseTypes: 4
skillClip: {fileID: -8689311932429934276, guid: 4450ee0d92144ade9f63dd601432d3bf, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
@@ -26,6 +27,7 @@ MonoBehaviour:
blockOtherSkillsWhileCasting: 1
cooldown: 8
manaCost: 18
maxGemSlotCount: 2
castStartEffects:
- {fileID: 11400000, guid: e7d0d605c1c2449ebc41f1a713670d6b, type: 2}
effects:

View File

@@ -16,11 +16,19 @@ MonoBehaviour:
description: "\uD22C\uC0AC\uCCB4\uB97C \uBC1C\uC0AC\uD569\uB2C8\uB2E4. \uBA85\uC911
\uC2DC \uC6D0\uAC70\uB9AC \uB300\uBBF8\uC9C0\uB97C \uC785\uD799\uB2C8\uB2E4."
icon: {fileID: 0}
baseTypes: 1
skillClip: {fileID: -8689311932429934276, guid: ac0adc4c7f982fe4d82eac9c2267f0c6, type: 3}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 1.5
manaCost: 10
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: fa684d4a7ce68d54aa4ce101f9400c35, type: 2}

View File

@@ -13,13 +13,21 @@ MonoBehaviour:
m_Name: "Data_Skill_Player_\uD68C\uC804\uBCA0\uAE30"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uD68C\uC804\uBCA0\uAE30"
description:
description:
icon: {fileID: 0}
baseTypes: 1
skillClip: {fileID: 0}
endClip: {fileID: 0}
animationSpeed: 1
useRootMotion: 0
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
cooldown: 2
manaCost: 10
maxGemSlotCount: 2
castStartEffects: []
effects:
- {fileID: 11400000, guid: c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6, type: 2}

View File

@@ -0,0 +1,26 @@
%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: bf750718c64c4bd48af905d2927351de, type: 3}
m_Name: "Data_SkillEffect_Drog_\uC9D1\uD589\uAC1C\uC2DC_0_\uC9D1\uD589\uC900\uBE44"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.AbnormalityEffect
targetType: 0
targetTeam: 0
areaCenter: 0
areaShape: 0
targetLayers:
serializedVersion: 2
m_Bits: 4294967295
areaRadius: 3
fanOriginDistance: 1
fanRadius: 3
fanHalfAngle: 45
abnormalityData: {fileID: 11400000, guid: fb1a782e44ff4dc19fd8b3c633360752, type: 2}

View File

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

View File

@@ -27,3 +27,4 @@ MonoBehaviour:
baseShield: 28
shieldScaling: 0.8
duration: 5
shieldStateAbnormality: {fileID: 11400000, guid: 228bf5f3997e4cb582d5fcc66b8b93dc, type: 2}

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: 58efb3c775496fa40b801b21127a011e, type: 3}
m_Name: "Data_SkillEffect_Player_\uC82C\uD14C\uC2A4\uD2B8_\uCD94\uAC00\uB370\uBBF8\uC9C0A"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.DamageEffect
targetType: 1
targetTeam: 0
areaCenter: 1
areaShape: 0
targetLayers:
serializedVersion: 2
m_Bits: 0
includeCasterInArea: 0
areaRadius: 2
fanOriginDistance: 0
fanRadius: 3
fanHalfAngle: 45
baseDamage: 4
damageType: 3
statScaling: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 197e5c38a24c95044a5959bb4c67f055
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: 58efb3c775496fa40b801b21127a011e, type: 3}
m_Name: "Data_SkillEffect_Player_\uC82C\uD14C\uC2A4\uD2B8_\uCD94\uAC00\uB370\uBBF8\uC9C0B"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.DamageEffect
targetType: 1
targetTeam: 0
areaCenter: 1
areaShape: 0
targetLayers:
serializedVersion: 2
m_Bits: 0
includeCasterInArea: 0
areaRadius: 2
fanOriginDistance: 0
fanRadius: 3
fanHalfAngle: 45
baseDamage: 7
damageType: 3
statScaling: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1a6d1b31b640d87499ef7c9e3580ed34
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: 58efb3c775496fa40b801b21127a011e, type: 3}
m_Name: "Data_SkillEffect_Player_\uC82C\uD14C\uC2A4\uD2B8_\uCD94\uAC00\uB370\uBBF8\uC9C0C"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.DamageEffect
targetType: 1
targetTeam: 0
areaCenter: 1
areaShape: 0
targetLayers:
serializedVersion: 2
m_Bits: 0
includeCasterInArea: 0
areaRadius: 2
fanOriginDistance: 0
fanRadius: 3
fanHalfAngle: 45
baseDamage: 10
damageType: 3
statScaling: 0

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -2203,6 +2203,7 @@ MonoBehaviour:
phase3SlamInterval: 2
signatureMinPhase: 2
signatureRequiredDamageRatio: 0.1
signatureTelegraphAbnormality: {fileID: 11400000, guid: fb1a782e44ff4dc19fd8b3c633360752, type: 2}
signatureSuccessStaggerDuration: 2
signatureFailureAbnormality: {fileID: 11400000, guid: bc74f1485ad140c28cc14b821e22c127, type: 2}
signatureFailureDamage: 40

View File

@@ -47,6 +47,12 @@ public abstract partial class BossPatternActionBase : Action
if (!IsReady())
return Status.Failure;
if (combatBehaviorContext.IsBehaviorSuppressed)
{
StopMovement();
return Status.Failure;
}
if (bossEnemy.IsDead || bossEnemy.IsTransitioning)
return Status.Failure;
@@ -71,6 +77,12 @@ public abstract partial class BossPatternActionBase : Action
if (!IsReady() || activePattern == null)
return Status.Failure;
if (combatBehaviorContext.IsBehaviorSuppressed)
{
StopMovement();
return Status.Failure;
}
if (bossEnemy.IsDead || bossEnemy.IsTransitioning)
return Status.Failure;

View File

@@ -1,4 +1,5 @@
using System;
using Colosseum.Enemy;
using Unity.Behavior;
using UnityEngine;
using Action = Unity.Behavior.Action;
@@ -22,6 +23,12 @@ public partial class ChaseTargetAction : Action
protected override Status OnStart()
{
BossCombatBehaviorContext context = GameObject.GetComponent<BossCombatBehaviorContext>();
if (context != null && context.IsBehaviorSuppressed)
{
return Status.Failure;
}
if (Target.Value == null)
{
return Status.Failure;
@@ -47,6 +54,15 @@ public partial class ChaseTargetAction : Action
protected override Status OnUpdate()
{
BossCombatBehaviorContext context = GameObject.GetComponent<BossCombatBehaviorContext>();
if (context != null && context.IsBehaviorSuppressed)
{
if (agent != null)
agent.isStopped = true;
return Status.Failure;
}
if (Target.Value == null)
{
return Status.Failure;

View File

@@ -25,6 +25,9 @@ public abstract partial class CheckPatternReadyActionBase : Action
if (context == null)
return Status.Failure;
if (context.IsBehaviorSuppressed)
return Status.Failure;
BossPatternData pattern = context.GetPattern(PatternRole);
return UsePatternAction.IsPatternReady(GameObject, pattern) ? Status.Success : Status.Failure;
}

View File

@@ -21,6 +21,9 @@ public partial class CheckSignaturePatternReadyAction : Action
protected override Status OnStart()
{
BossCombatBehaviorContext context = GameObject.GetComponent<BossCombatBehaviorContext>();
if (context != null && context.IsBehaviorSuppressed)
return Status.Failure;
return context != null && context.IsSignaturePatternReady()
? Status.Success
: Status.Failure;

View File

@@ -24,6 +24,10 @@ public partial class RefreshPrimaryTargetAction : Action
protected override Status OnStart()
{
BossCombatBehaviorContext context = GameObject.GetComponent<BossCombatBehaviorContext>();
if (context != null && context.IsBehaviorSuppressed)
return Status.Failure;
EnemyBase enemyBase = GameObject.GetComponent<EnemyBase>();
if (enemyBase == null)
return Status.Failure;
@@ -34,7 +38,6 @@ public partial class RefreshPrimaryTargetAction : Action
if (resolvedTarget == null)
{
BossCombatBehaviorContext context = GameObject.GetComponent<BossCombatBehaviorContext>();
resolvedTarget = context != null ? context.FindNearestLivingTarget() : null;
}

View File

@@ -68,9 +68,26 @@ namespace Colosseum.Abnormalities
[Tooltip("플레이어 HUD의 이상상태 UI에 표시할지 여부")]
public bool showInUI = true;
[Tooltip("보호막 계열 상태인지 여부 (보호막 인스턴스 동기화용)")]
public bool isShieldState = false;
[Tooltip("활성 중에는 일반 피격 반응(경직, 넉백, 다운)을 무시할지 여부")]
public bool ignoreHitReaction = false;
[Header("시각 효과")]
[Tooltip("이상 상태가 유지되는 동안 대상에 붙일 루핑 VFX 프리팹")]
public GameObject loopingVfxPrefab;
[Tooltip("루핑 VFX 위치 보정값")]
public Vector3 loopingVfxOffset = Vector3.zero;
[Tooltip("루핑 VFX 스케일 배율")]
[Min(0.01f)]
public float loopingVfxScaleMultiplier = 1f;
[Tooltip("루핑 VFX를 대상의 자식으로 붙일지 여부")]
public bool parentLoopingVfxToTarget = true;
[Header("스탯 수정자")]
[Tooltip("스탯에 적용할 수정자 목록")]
public List<AbnormalityStatModifier> statModifiers = new List<AbnormalityStatModifier>();
@@ -110,6 +127,11 @@ namespace Colosseum.Abnormalities
/// </summary>
public bool HasControlEffect => controlType != ControlType.None;
/// <summary>
/// 유지형 루핑 VFX가 있는지 확인
/// </summary>
public bool HasLoopingVfx => loopingVfxPrefab != null;
/// <summary>
/// 받는 피해 배율 변경 여부
/// </summary>

View File

@@ -26,6 +26,7 @@ namespace Colosseum.Abnormalities
// 활성화된 이상 상태 목록
private readonly List<ActiveAbnormality> activeAbnormalities = new List<ActiveAbnormality>();
private readonly Dictionary<int, GameObject> abnormalityVisualInstances = new Dictionary<int, GameObject>();
// 제어 효과 상태
private int stunCount;
@@ -150,6 +151,8 @@ namespace Colosseum.Abnormalities
{
SyncControlEffects();
}
RefreshAbnormalityVisuals();
}
public override void OnNetworkDespawn()
@@ -165,6 +168,8 @@ namespace Colosseum.Abnormalities
{
networkController.OnDeathStateChanged -= HandleDeathStateChanged;
}
ClearAllAbnormalityVisuals();
}
private void Update()
@@ -255,6 +260,7 @@ namespace Colosseum.Abnormalities
ApplyControlEffect(data);
RecalculateIncomingDamageMultiplier();
SyncAbnormalityAdd(newAbnormality, source);
RefreshAbnormalityVisuals();
OnAbnormalityAdded?.Invoke(newAbnormality);
OnAbnormalitiesChanged?.Invoke();
@@ -301,6 +307,7 @@ namespace Colosseum.Abnormalities
RecalculateIncomingDamageMultiplier();
SyncAbnormalityRemove(abnormality);
activeAbnormalities.Remove(abnormality);
RefreshAbnormalityVisuals();
OnAbnormalityRemoved?.Invoke(abnormality);
OnAbnormalitiesChanged?.Invoke();
@@ -593,6 +600,7 @@ namespace Colosseum.Abnormalities
private void OnSyncedAbnormalitiesChanged(NetworkListEvent<AbnormalitySyncData> changeEvent)
{
RefreshAbnormalityVisuals();
OnAbnormalitiesChanged?.Invoke();
}
@@ -651,6 +659,111 @@ namespace Colosseum.Abnormalities
Debug.Log($"[Abnormality] Cleared all abnormalities on death: {gameObject.name}");
}
/// <summary>
/// 현재 활성 이상상태 기준으로 루핑 VFX를 동기화합니다.
/// </summary>
private void RefreshAbnormalityVisuals()
{
HashSet<int> desiredAbnormalityIds = new HashSet<int>();
if (IsServer)
{
for (int i = 0; i < activeAbnormalities.Count; i++)
{
ActiveAbnormality abnormality = activeAbnormalities[i];
if (abnormality?.Data == null || !abnormality.Data.HasLoopingVfx)
continue;
int abnormalityId = abnormality.Data.GetInstanceID();
desiredAbnormalityIds.Add(abnormalityId);
if (!abnormalityVisualInstances.ContainsKey(abnormalityId) || abnormalityVisualInstances[abnormalityId] == null)
{
abnormalityVisualInstances[abnormalityId] = CreateLoopingVfxInstance(abnormality.Data);
}
}
}
else
{
for (int i = 0; i < syncedAbnormalities.Count; i++)
{
AbnormalitySyncData syncData = syncedAbnormalities[i];
AbnormalityData data = FindAbnormalityDataById(syncData.AbnormalityId);
if (data == null || !data.HasLoopingVfx)
continue;
desiredAbnormalityIds.Add(syncData.AbnormalityId);
if (!abnormalityVisualInstances.ContainsKey(syncData.AbnormalityId) || abnormalityVisualInstances[syncData.AbnormalityId] == null)
{
abnormalityVisualInstances[syncData.AbnormalityId] = CreateLoopingVfxInstance(data);
}
}
}
List<int> removeIds = new List<int>();
foreach (KeyValuePair<int, GameObject> pair in abnormalityVisualInstances)
{
if (desiredAbnormalityIds.Contains(pair.Key))
continue;
if (pair.Value != null)
Destroy(pair.Value);
removeIds.Add(pair.Key);
}
for (int i = 0; i < removeIds.Count; i++)
{
abnormalityVisualInstances.Remove(removeIds[i]);
}
}
/// <summary>
/// 루핑 VFX 인스턴스를 생성합니다.
/// </summary>
private GameObject CreateLoopingVfxInstance(AbnormalityData data)
{
if (data == null || data.loopingVfxPrefab == null)
return null;
Transform parent = data.parentLoopingVfxToTarget ? transform : null;
GameObject instance = Instantiate(data.loopingVfxPrefab, transform.position + data.loopingVfxOffset, Quaternion.identity, parent);
instance.transform.localScale *= data.loopingVfxScaleMultiplier;
if (data.parentLoopingVfxToTarget)
instance.transform.localPosition = data.loopingVfxOffset;
else
instance.transform.position = transform.position + data.loopingVfxOffset;
ParticleSystem[] particleSystems = instance.GetComponentsInChildren<ParticleSystem>(true);
for (int i = 0; i < particleSystems.Length; i++)
{
ParticleSystem particleSystem = particleSystems[i];
var main = particleSystem.main;
main.loop = true;
main.stopAction = ParticleSystemStopAction.None;
particleSystem.Clear(true);
particleSystem.Play(true);
}
return instance;
}
/// <summary>
/// 현재 관리 중인 루핑 VFX를 모두 제거합니다.
/// </summary>
private void ClearAllAbnormalityVisuals()
{
foreach (KeyValuePair<int, GameObject> pair in abnormalityVisualInstances)
{
if (pair.Value != null)
Destroy(pair.Value);
}
abnormalityVisualInstances.Clear();
}
private void TryCancelCurrentSkill(SkillCancelReason reason, string sourceName)
{
if (!IsServer || skillController == null || !skillController.IsPlayingAnimation)
@@ -686,6 +799,9 @@ namespace Colosseum.Abnormalities
/// </summary>
public bool HasAbnormality(AbnormalityData data)
{
if (data == null)
return false;
return activeAbnormalities.Exists(a => a.Data.abnormalityName == data.abnormalityName);
}
}

View File

@@ -0,0 +1,332 @@
using System.Collections.Generic;
using System.Text;
using Unity.Netcode;
using UnityEngine;
using Colosseum.Enemy;
using Colosseum.Skills;
namespace Colosseum.Combat
{
/// <summary>
/// 전투 밸런싱 검증을 위한 런타임 계측기입니다.
/// 플레이어/보스 기준으로 대미지, 치유, 보호막, 위협, 패턴 사용량을 누적합니다.
/// </summary>
public static class CombatBalanceTracker
{
private sealed class ActorMetrics
{
public string label;
public float totalDamageDealt;
public float bossDamageDealt;
public float damageTaken;
public float healDone;
public float healReceived;
public float shieldApplied;
public float shieldReceived;
public float threatGenerated;
public readonly Dictionary<string, float> damageBySkill = new Dictionary<string, float>();
public readonly Dictionary<string, float> healBySkill = new Dictionary<string, float>();
public readonly Dictionary<string, float> shieldBySkill = new Dictionary<string, float>();
public readonly Dictionary<string, float> threatBySkill = new Dictionary<string, float>();
}
private static readonly Dictionary<string, ActorMetrics> actorMetrics = new Dictionary<string, ActorMetrics>();
private static readonly Dictionary<string, int> bossPatternCounts = new Dictionary<string, int>();
private static readonly Dictionary<string, int> bossEventCounts = new Dictionary<string, int>();
private static float combatStartTime = -1f;
private static float lastEventTime = -1f;
/// <summary>
/// 누적된 전투 계측 데이터를 초기화합니다.
/// </summary>
public static void Reset()
{
actorMetrics.Clear();
bossPatternCounts.Clear();
bossEventCounts.Clear();
combatStartTime = -1f;
lastEventTime = -1f;
}
/// <summary>
/// 실제 적용된 대미지를 기록합니다.
/// </summary>
public static void RecordDamage(GameObject source, GameObject target, float actualDamage)
{
if (actualDamage <= 0f || target == null)
return;
MarkCombatEvent();
ActorMetrics targetMetrics = GetMetrics(target);
targetMetrics.damageTaken += actualDamage;
if (source == null)
return;
ActorMetrics sourceMetrics = GetMetrics(source);
sourceMetrics.totalDamageDealt += actualDamage;
if (target.GetComponent<BossEnemy>() != null || target.GetComponentInParent<BossEnemy>() != null)
{
sourceMetrics.bossDamageDealt += actualDamage;
}
AddSkillValue(sourceMetrics.damageBySkill, ResolveSkillLabel(source), actualDamage);
}
/// <summary>
/// 실제 적용된 회복량을 기록합니다.
/// </summary>
public static void RecordHeal(GameObject source, GameObject target, float actualHeal)
{
if (actualHeal <= 0f || target == null)
return;
MarkCombatEvent();
ActorMetrics targetMetrics = GetMetrics(target);
targetMetrics.healReceived += actualHeal;
if (source == null)
return;
ActorMetrics sourceMetrics = GetMetrics(source);
sourceMetrics.healDone += actualHeal;
AddSkillValue(sourceMetrics.healBySkill, ResolveSkillLabel(source), actualHeal);
}
/// <summary>
/// 실제 적용된 보호막 수치를 기록합니다.
/// </summary>
public static void RecordShield(GameObject source, GameObject target, float actualShield)
{
if (actualShield <= 0f || target == null)
return;
MarkCombatEvent();
ActorMetrics targetMetrics = GetMetrics(target);
targetMetrics.shieldReceived += actualShield;
if (source == null)
return;
ActorMetrics sourceMetrics = GetMetrics(source);
sourceMetrics.shieldApplied += actualShield;
AddSkillValue(sourceMetrics.shieldBySkill, ResolveSkillLabel(source), actualShield);
}
/// <summary>
/// 실제 적용된 위협 증가량을 기록합니다.
/// </summary>
public static void RecordThreat(GameObject source, float threatAmount)
{
if (threatAmount <= 0f || source == null)
return;
MarkCombatEvent();
ActorMetrics sourceMetrics = GetMetrics(source);
sourceMetrics.threatGenerated += threatAmount;
AddSkillValue(sourceMetrics.threatBySkill, ResolveSkillLabel(source), threatAmount);
}
/// <summary>
/// 보스 패턴 사용 횟수를 기록합니다.
/// </summary>
public static void RecordBossPattern(string patternName)
{
if (string.IsNullOrWhiteSpace(patternName))
return;
MarkCombatEvent();
AddCount(bossPatternCounts, patternName);
}
/// <summary>
/// 시그니처 성공/실패 같은 보스 전투 이벤트를 기록합니다.
/// </summary>
public static void RecordBossEvent(string eventName)
{
if (string.IsNullOrWhiteSpace(eventName))
return;
MarkCombatEvent();
AddCount(bossEventCounts, eventName);
}
/// <summary>
/// 현재 누적 계측 데이터를 보기 좋은 문자열로 반환합니다.
/// </summary>
public static string BuildSummary()
{
StringBuilder builder = new StringBuilder();
builder.Append("[Balance] 전투 요약");
if (combatStartTime >= 0f && lastEventTime >= combatStartTime)
{
builder.Append(" | Duration=");
builder.Append((lastEventTime - combatStartTime).ToString("0.00"));
builder.Append("s");
}
if (bossPatternCounts.Count > 0)
{
builder.AppendLine();
builder.Append("보스 패턴: ");
AppendCountSummary(builder, bossPatternCounts);
}
if (bossEventCounts.Count > 0)
{
builder.AppendLine();
builder.Append("보스 이벤트: ");
AppendCountSummary(builder, bossEventCounts);
}
foreach (KeyValuePair<string, ActorMetrics> pair in actorMetrics)
{
ActorMetrics metrics = pair.Value;
builder.AppendLine();
builder.Append("- ");
builder.Append(metrics.label);
builder.Append(" | BossDmg=");
builder.Append(metrics.bossDamageDealt.ToString("0.##"));
builder.Append(" | TotalDmg=");
builder.Append(metrics.totalDamageDealt.ToString("0.##"));
builder.Append(" | Taken=");
builder.Append(metrics.damageTaken.ToString("0.##"));
builder.Append(" | Heal=");
builder.Append(metrics.healDone.ToString("0.##"));
builder.Append(" | HealRecv=");
builder.Append(metrics.healReceived.ToString("0.##"));
builder.Append(" | Shield=");
builder.Append(metrics.shieldApplied.ToString("0.##"));
builder.Append(" | ShieldRecv=");
builder.Append(metrics.shieldReceived.ToString("0.##"));
builder.Append(" | Threat=");
builder.Append(metrics.threatGenerated.ToString("0.##"));
AppendSkillBreakdown(builder, "DmgBySkill", metrics.damageBySkill);
AppendSkillBreakdown(builder, "HealBySkill", metrics.healBySkill);
AppendSkillBreakdown(builder, "ShieldBySkill", metrics.shieldBySkill);
AppendSkillBreakdown(builder, "ThreatBySkill", metrics.threatBySkill);
}
return builder.ToString();
}
private static void MarkCombatEvent()
{
if (!Application.isPlaying)
return;
float now = Time.time;
if (combatStartTime < 0f)
combatStartTime = now;
lastEventTime = now;
}
private static ActorMetrics GetMetrics(GameObject actor)
{
string actorLabel = ResolveActorLabel(actor);
if (!actorMetrics.TryGetValue(actorLabel, out ActorMetrics metrics))
{
metrics = new ActorMetrics
{
label = actorLabel,
};
actorMetrics.Add(actorLabel, metrics);
}
return metrics;
}
private static string ResolveActorLabel(GameObject actor)
{
if (actor == null)
return "Unknown";
NetworkObject networkObject = actor.GetComponent<NetworkObject>() ?? actor.GetComponentInParent<NetworkObject>();
if (networkObject != null)
{
string roleLabel = actor.GetComponent<BossEnemy>() != null || actor.GetComponentInParent<BossEnemy>() != null
? "Boss"
: "Actor";
return $"{roleLabel}:{actor.name}(Owner={networkObject.OwnerClientId})";
}
return actor.name;
}
private static string ResolveSkillLabel(GameObject source)
{
if (source == null)
return "Unknown";
SkillController skillController = source.GetComponent<SkillController>() ?? source.GetComponentInParent<SkillController>();
if (skillController != null && skillController.CurrentSkill != null)
return skillController.CurrentSkill.SkillName;
return "Unknown";
}
private static void AddSkillValue(Dictionary<string, float> dictionary, string key, float value)
{
if (dictionary == null || string.IsNullOrWhiteSpace(key) || value <= 0f)
return;
dictionary.TryGetValue(key, out float currentValue);
dictionary[key] = currentValue + value;
}
private static void AddCount(Dictionary<string, int> dictionary, string key)
{
dictionary.TryGetValue(key, out int currentValue);
dictionary[key] = currentValue + 1;
}
private static void AppendCountSummary(StringBuilder builder, Dictionary<string, int> dictionary)
{
bool first = true;
foreach (KeyValuePair<string, int> pair in dictionary)
{
if (!first)
builder.Append(" | ");
builder.Append(pair.Key);
builder.Append('=');
builder.Append(pair.Value);
first = false;
}
}
private static void AppendSkillBreakdown(StringBuilder builder, string label, Dictionary<string, float> dictionary)
{
if (dictionary == null || dictionary.Count == 0)
return;
builder.Append(" | ");
builder.Append(label);
builder.Append('=');
bool first = true;
foreach (KeyValuePair<string, float> pair in dictionary)
{
if (!first)
builder.Append(", ");
builder.Append(pair.Key);
builder.Append(':');
builder.Append(pair.Value.ToString("0.##"));
first = false;
}
}
}
}

View File

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

View File

@@ -0,0 +1,271 @@
using System.Collections.Generic;
using UnityEngine;
using Colosseum.Abnormalities;
namespace Colosseum.Combat
{
/// <summary>
/// 개별 보호막 인스턴스입니다.
/// 같은 종류의 보호막은 하나로 합쳐지고, 다른 종류의 보호막은 독립적으로 유지됩니다.
/// </summary>
[System.Serializable]
public sealed class ActiveShield
{
[SerializeField] private AbnormalityData shieldType;
[SerializeField] private float remainingAmount;
[SerializeField] private float remainingDuration;
[SerializeField] private bool isPermanent;
[SerializeField] private GameObject source;
public AbnormalityData ShieldType => shieldType;
public float RemainingAmount => remainingAmount;
public float RemainingDuration => isPermanent ? 0f : remainingDuration;
public bool IsPermanent => isPermanent;
public bool IsExpired => !isPermanent && remainingDuration <= 0f;
public bool IsDepleted => remainingAmount <= 0f;
public GameObject Source => source;
public ActiveShield(AbnormalityData shieldType, float amount, float duration, GameObject source)
{
this.shieldType = shieldType;
remainingAmount = Mathf.Max(0f, amount);
isPermanent = duration <= 0f;
remainingDuration = isPermanent ? 0f : duration;
this.source = source;
}
/// <summary>
/// 같은 종류 보호막이 다시 적용되었을 때 양을 더하고 지속시간을 갱신합니다.
/// </summary>
public float Add(float amount, float duration, GameObject source)
{
float appliedAmount = Mathf.Max(0f, amount);
remainingAmount += appliedAmount;
if (duration <= 0f)
{
isPermanent = true;
remainingDuration = 0f;
}
else if (!isPermanent)
{
remainingDuration = duration;
}
if (source != null)
{
this.source = source;
}
return appliedAmount;
}
/// <summary>
/// 지속시간을 감소시킵니다.
/// </summary>
public bool Tick(float deltaTime)
{
if (isPermanent || deltaTime <= 0f)
return false;
remainingDuration = Mathf.Max(0f, remainingDuration - deltaTime);
return IsExpired;
}
/// <summary>
/// 들어오는 피해를 흡수합니다.
/// </summary>
public float Consume(float incomingDamage)
{
if (incomingDamage <= 0f || remainingAmount <= 0f)
return 0f;
float absorbed = Mathf.Min(remainingAmount, incomingDamage);
remainingAmount = Mathf.Max(0f, remainingAmount - absorbed);
return absorbed;
}
}
/// <summary>
/// 대상이 가진 보호막 인스턴스를 관리합니다.
/// </summary>
[System.Serializable]
public sealed class ShieldCollection
{
private readonly List<ActiveShield> activeShields = new List<ActiveShield>();
public IReadOnlyList<ActiveShield> ActiveShields => activeShields;
public float TotalAmount
{
get
{
float total = 0f;
for (int i = 0; i < activeShields.Count; i++)
{
total += activeShields[i].RemainingAmount;
}
return total;
}
}
/// <summary>
/// 보호막을 적용합니다. 같은 종류는 자기 자신만 합산 및 갱신합니다.
/// </summary>
public float ApplyShield(AbnormalityData shieldType, float amount, float duration, GameObject source)
{
if (amount <= 0f)
return 0f;
ActiveShield existingShield = FindShield(shieldType);
if (existingShield != null)
{
return existingShield.Add(amount, duration, source);
}
activeShields.Add(new ActiveShield(shieldType, amount, duration, source));
return amount;
}
/// <summary>
/// 보호막이 적용된 순서대로 피해를 흡수하고 남은 피해를 반환합니다.
/// </summary>
public float ConsumeDamage(float incomingDamage)
{
if (incomingDamage <= 0f || activeShields.Count == 0)
return incomingDamage;
float remainingDamage = incomingDamage;
for (int i = 0; i < activeShields.Count && remainingDamage > 0f; i++)
{
remainingDamage -= activeShields[i].Consume(remainingDamage);
}
CleanupInactiveShields();
return Mathf.Max(0f, remainingDamage);
}
/// <summary>
/// 지속시간 경과를 처리합니다.
/// </summary>
public bool Tick(float deltaTime)
{
bool changed = false;
for (int i = activeShields.Count - 1; i >= 0; i--)
{
ActiveShield shield = activeShields[i];
bool expired = shield.Tick(deltaTime);
if (!expired && !shield.IsDepleted)
continue;
activeShields.RemoveAt(i);
changed = true;
}
return changed;
}
/// <summary>
/// 모든 보호막을 제거합니다.
/// </summary>
public void Clear()
{
activeShields.Clear();
}
private ActiveShield FindShield(AbnormalityData shieldType)
{
for (int i = 0; i < activeShields.Count; i++)
{
if (activeShields[i].ShieldType == shieldType)
return activeShields[i];
}
return null;
}
private void CleanupInactiveShields()
{
for (int i = activeShields.Count - 1; i >= 0; i--)
{
if (!activeShields[i].IsExpired && !activeShields[i].IsDepleted)
continue;
activeShields.RemoveAt(i);
}
}
}
/// <summary>
/// 보호막 수치와 보호막 이상상태를 동기화하는 유틸리티입니다.
/// </summary>
public static class ShieldAbnormalityUtility
{
/// <summary>
/// 활성 보호막 목록에 맞춰 보호막 이상상태를 적용하거나 제거합니다.
/// </summary>
public static void SyncShieldAbnormalities(
AbnormalityManager abnormalityManager,
IReadOnlyList<ActiveShield> activeShields,
GameObject defaultSource)
{
if (abnormalityManager == null)
return;
HashSet<AbnormalityData> desiredShieldStates = new HashSet<AbnormalityData>();
Dictionary<AbnormalityData, GameObject> shieldSources = new Dictionary<AbnormalityData, GameObject>();
if (activeShields != null)
{
for (int i = 0; i < activeShields.Count; i++)
{
ActiveShield shield = activeShields[i];
if (shield == null || shield.RemainingAmount <= 0f || shield.ShieldType == null)
continue;
desiredShieldStates.Add(shield.ShieldType);
if (!shieldSources.ContainsKey(shield.ShieldType))
{
shieldSources.Add(shield.ShieldType, shield.Source != null ? shield.Source : defaultSource);
}
}
}
foreach (AbnormalityData shieldState in desiredShieldStates)
{
if (abnormalityManager.HasAbnormality(shieldState))
continue;
GameObject source = shieldSources.TryGetValue(shieldState, out GameObject resolvedSource)
? resolvedSource
: defaultSource;
abnormalityManager.ApplyAbnormality(shieldState, source);
}
IReadOnlyList<ActiveAbnormality> activeAbnormalities = abnormalityManager.ActiveAbnormalities;
List<AbnormalityData> removeList = new List<AbnormalityData>();
for (int i = 0; i < activeAbnormalities.Count; i++)
{
ActiveAbnormality activeAbnormality = activeAbnormalities[i];
if (activeAbnormality?.Data == null || !activeAbnormality.Data.isShieldState)
continue;
if (desiredShieldStates.Contains(activeAbnormality.Data))
continue;
removeList.Add(activeAbnormality.Data);
}
for (int i = 0; i < removeList.Count; i++)
{
abnormalityManager.RemoveAbnormality(removeList[i]);
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 69ea46fefb9597e49a4ce68c81ccf0ce

View File

@@ -0,0 +1,356 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.IO;
using Process = System.Diagnostics.Process;
using UnityEditor;
using UnityEngine;
namespace Colosseum.Editor
{
/// <summary>
/// Multiplayer Play Mode 관련 상태와 리플렉션 정보를 점검하는 디버그 메뉴입니다.
/// </summary>
public static class MultiplayerPlayModeDebugMenu
{
private const string MultiplayerManagerAssetPath = "ProjectSettings/MultiplayerManager.asset";
private const string DiagnosticsDirectory = "Temp/MPP";
private const string VirtualProjectsRoot = "Library/VP";
[MenuItem("Tools/Colosseum/Multiplayer/Log Play Mode Module Types")]
private static void LogPlayModeModuleTypes()
{
Assembly playModeAssembly = typeof(UnityEditor.PlayModeStateChange).Assembly;
Type[] types = playModeAssembly
.GetTypes()
.Where(type => type.FullName != null &&
(type.FullName.Contains("PlayMode", StringComparison.OrdinalIgnoreCase) ||
type.FullName.Contains("Scenario", StringComparison.OrdinalIgnoreCase) ||
type.FullName.Contains("Multiplayer", StringComparison.OrdinalIgnoreCase)))
.OrderBy(type => type.FullName)
.ToArray();
StringBuilder builder = new StringBuilder();
builder.AppendLine("[MPP] PlayModeModule 타입 목록");
for (int i = 0; i < types.Length; i++)
{
builder.Append("- ");
builder.AppendLine(types[i].FullName);
}
string diagnosticsPath = EnsureDiagnosticsFilePath("PlayModeModuleTypes.txt");
File.WriteAllText(diagnosticsPath, builder.ToString(), Encoding.UTF8);
Debug.Log($"[MPP] PlayModeModule 타입 목록을 저장했습니다. {diagnosticsPath}");
}
[MenuItem("Tools/Colosseum/Multiplayer/Log Play Mode User Settings")]
private static void LogPlayModeUserSettings()
{
Type settingsType = Type.GetType("Unity.PlayMode.Editor.PlayModeUserSettings, UnityEditor.PlayModeModule");
if (settingsType == null)
{
Debug.LogWarning("[MPP] Unity.PlayMode.Editor.PlayModeUserSettings 타입을 찾지 못했습니다.");
return;
}
string diagnosticsPath = EnsureDiagnosticsFilePath("PlayModeUserSettings.txt");
MethodInfo getOrCreateMethod = settingsType.GetMethod(
"GetOrCreateSettings",
BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
object settings = getOrCreateMethod?.Invoke(null, null);
if (settings == null)
{
StringBuilder nullBuilder = new StringBuilder();
nullBuilder.AppendLine("[MPP] PlayModeUserSettings 인스턴스를 가져오지 못했습니다.");
nullBuilder.AppendLine($"Type: {settingsType.FullName}");
nullBuilder.AppendLine("Static Members:");
AppendStaticMembers(nullBuilder, settingsType);
File.WriteAllText(diagnosticsPath, nullBuilder.ToString(), Encoding.UTF8);
Debug.LogWarning($"[MPP] PlayModeUserSettings 인스턴스를 가져오지 못했습니다. 진단 파일: {diagnosticsPath}");
return;
}
StringBuilder builder = new StringBuilder();
builder.AppendLine("[MPP] PlayModeUserSettings");
AppendMembers(builder, settingsType, settings);
AppendStaticMembers(builder, settingsType);
File.WriteAllText(diagnosticsPath, builder.ToString(), Encoding.UTF8);
Debug.Log($"[MPP] PlayModeUserSettings 정보를 저장했습니다. {diagnosticsPath}");
}
[MenuItem("Tools/Colosseum/Multiplayer/Enable Local Deployment")]
private static void EnableLocalDeployment()
{
SerializedObject multiplayerManager = GetMultiplayerManagerSerializedObject();
if (multiplayerManager == null)
{
return;
}
SerializedProperty localDeployment = multiplayerManager.FindProperty("m_EnablePlayModeLocalDeployment");
if (localDeployment == null)
{
Debug.LogWarning("[MPP] m_EnablePlayModeLocalDeployment 속성을 찾지 못했습니다.");
return;
}
localDeployment.intValue = 1;
multiplayerManager.ApplyModifiedPropertiesWithoutUndo();
AssetDatabase.SaveAssets();
Debug.Log("[MPP] 로컬 Play Mode 배포를 활성화했습니다.");
}
[MenuItem("Tools/Colosseum/Multiplayer/Disable Local Deployment")]
private static void DisableLocalDeployment()
{
SerializedObject multiplayerManager = GetMultiplayerManagerSerializedObject();
if (multiplayerManager == null)
{
return;
}
SerializedProperty localDeployment = multiplayerManager.FindProperty("m_EnablePlayModeLocalDeployment");
if (localDeployment == null)
{
Debug.LogWarning("[MPP] m_EnablePlayModeLocalDeployment 속성을 찾지 못했습니다.");
return;
}
localDeployment.intValue = 0;
multiplayerManager.ApplyModifiedPropertiesWithoutUndo();
AssetDatabase.SaveAssets();
Debug.Log("[MPP] 로컬 Play Mode 배포를 비활성화했습니다.");
}
[MenuItem("Tools/Colosseum/Multiplayer/Log Multiplayer Manager Settings")]
private static void LogMultiplayerManagerSettings()
{
SerializedObject multiplayerManager = GetMultiplayerManagerSerializedObject();
if (multiplayerManager == null)
{
return;
}
SerializedProperty roles = multiplayerManager.FindProperty("m_EnableMultiplayerRoles");
SerializedProperty localDeployment = multiplayerManager.FindProperty("m_EnablePlayModeLocalDeployment");
SerializedProperty remoteDeployment = multiplayerManager.FindProperty("m_EnablePlayModeRemoteDeployment");
Debug.Log(
$"[MPP] MultiplayerManager | Roles={roles?.intValue ?? -1} | " +
$"LocalDeployment={localDeployment?.intValue ?? -1} | " +
$"RemoteDeployment={remoteDeployment?.intValue ?? -1}");
}
[MenuItem("Tools/Colosseum/Multiplayer/Log Virtual Player Clones")]
private static void LogVirtualPlayerClones()
{
string[] cloneDirectories = GetVirtualPlayerCloneDirectories();
if (cloneDirectories.Length == 0)
{
Debug.LogWarning("[MPP] Library/VP 아래에 가상 플레이어 복제본을 찾지 못했습니다.");
return;
}
StringBuilder builder = new StringBuilder();
builder.AppendLine("[MPP] 가상 플레이어 복제본 목록");
for (int i = 0; i < cloneDirectories.Length; i++)
{
builder.Append("- ");
builder.AppendLine(Path.GetFullPath(cloneDirectories[i]));
}
Debug.Log(builder.ToString());
}
[MenuItem("Tools/Colosseum/Multiplayer/Launch First Virtual Player Clone")]
private static void LaunchFirstVirtualPlayerClone()
{
string[] cloneDirectories = GetVirtualPlayerCloneDirectories();
if (cloneDirectories.Length == 0)
{
Debug.LogWarning("[MPP] 실행할 가상 플레이어 복제본이 없습니다.");
return;
}
string cloneProjectPath = Path.GetFullPath(cloneDirectories[0]);
Process.Start(new System.Diagnostics.ProcessStartInfo
{
FileName = EditorApplication.applicationPath,
Arguments = $"-projectPath \"{cloneProjectPath}\"",
UseShellExecute = true,
});
Debug.Log($"[MPP] 가상 플레이어 복제본을 실행했습니다. {cloneProjectPath}");
}
private static SerializedObject GetMultiplayerManagerSerializedObject()
{
UnityEngine.Object[] assets = AssetDatabase.LoadAllAssetsAtPath(MultiplayerManagerAssetPath);
if (assets == null || assets.Length == 0 || assets[0] == null)
{
Debug.LogWarning("[MPP] MultiplayerManager.asset를 찾지 못했습니다.");
return null;
}
return new SerializedObject(assets[0]);
}
private static void AppendMembers(StringBuilder builder, Type settingsType, object settings)
{
const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
List<PropertyInfo> properties = settingsType.GetProperties(flags)
.Where(property => property.GetIndexParameters().Length == 0)
.OrderBy(property => property.Name)
.ToList();
for (int i = 0; i < properties.Count; i++)
{
PropertyInfo property = properties[i];
object value = null;
bool success = true;
try
{
value = property.GetValue(settings);
}
catch (Exception exception)
{
success = false;
value = exception.GetType().Name;
}
builder.Append("- Property ");
builder.Append(property.Name);
builder.Append(" = ");
builder.AppendLine(success ? FormatValue(value) : $"<error: {value}>");
}
List<FieldInfo> fields = settingsType.GetFields(flags)
.OrderBy(field => field.Name)
.ToList();
for (int i = 0; i < fields.Count; i++)
{
FieldInfo field = fields[i];
object value = field.GetValue(settings);
builder.Append("- Field ");
builder.Append(field.Name);
builder.Append(" = ");
builder.AppendLine(FormatValue(value));
}
}
private static void AppendStaticMembers(StringBuilder builder, Type settingsType)
{
const BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
List<PropertyInfo> properties = settingsType.GetProperties(flags)
.Where(property => property.GetIndexParameters().Length == 0)
.OrderBy(property => property.Name)
.ToList();
for (int i = 0; i < properties.Count; i++)
{
PropertyInfo property = properties[i];
object value = null;
bool success = true;
try
{
value = property.GetValue(null);
}
catch (Exception exception)
{
success = false;
value = exception.GetType().Name;
}
builder.Append("- Static Property ");
builder.Append(property.Name);
builder.Append(" = ");
builder.AppendLine(success ? FormatValue(value) : $"<error: {value}>");
}
List<FieldInfo> fields = settingsType.GetFields(flags)
.OrderBy(field => field.Name)
.ToList();
for (int i = 0; i < fields.Count; i++)
{
FieldInfo field = fields[i];
object value = field.GetValue(null);
builder.Append("- Static Field ");
builder.Append(field.Name);
builder.Append(" = ");
builder.AppendLine(FormatValue(value));
}
List<MethodInfo> methods = settingsType.GetMethods(flags)
.Where(method => !method.IsSpecialName)
.OrderBy(method => method.Name)
.ToList();
for (int i = 0; i < methods.Count; i++)
{
MethodInfo method = methods[i];
string parameterSummary = string.Join(
", ",
method.GetParameters().Select(parameter => $"{parameter.ParameterType.Name} {parameter.Name}"));
builder.Append("- Static Method ");
builder.Append(method.ReturnType.Name);
builder.Append(' ');
builder.Append(method.Name);
builder.Append('(');
builder.Append(parameterSummary);
builder.AppendLine(")");
}
}
private static string EnsureDiagnosticsFilePath(string fileName)
{
Directory.CreateDirectory(DiagnosticsDirectory);
return Path.Combine(DiagnosticsDirectory, fileName);
}
private static string[] GetVirtualPlayerCloneDirectories()
{
if (!Directory.Exists(VirtualProjectsRoot))
{
return Array.Empty<string>();
}
return Directory
.GetDirectories(VirtualProjectsRoot, "mppm*")
.OrderBy(path => path)
.ToArray();
}
private static string FormatValue(object value)
{
if (value == null)
{
return "null";
}
if (value is string stringValue)
{
return stringValue;
}
if (value is IEnumerable<object> enumerable)
{
return "[" + string.Join(", ", enumerable.Select(FormatValue)) + "]";
}
return value.ToString();
}
}
}

Some files were not shown because too many files have changed in this diff Show More