Compare commits

...

12 Commits

Author SHA1 Message Date
dadaa56511 feat: 기본기3 브릿지 클립 및 애니메이션 편집 유틸 추가
- 기본기3 1타 브릿지 클립과 패턴/스킬 자산을 정리해 1타-2타 연결 흐름을 보강

- 애니메이션 브릿지 클립 생성 에디터 창을 추가해 앞뒤 프레임을 잘라 새 클립을 만들 수 있게 지원

- 선택한 애니메이션 클립의 마지막 프레임에 누락 키를 일괄 추가하는 에디터 메뉴를 추가
2026-04-17 11:22:02 +09:00
8c08e63c81 fix: 드로그 기본기3 시작 루트모션과 추적 보정 정리
- 기본기3 시작 프레임의 수평 루트모션 스냅을 차단하고 정면 투영/접촉 정지 거리 보정을 정리
- 스킬 완료 판정과 시작 타깃 정렬 로직을 보강하고 드로그/플레이어 정면 및 시작점 디버그 gizmo를 추가
- 드로그 기본기3 관련 애니메이션·패턴·스킬 자산을 재정리하고 Blender 보조 스크립트를 추가
2026-04-17 09:56:40 +09:00
5ba543ed8c feat: 드로그 콤보 및 발구르기 애니메이션 자산 재정리
- 외부 FBX 소스를 추가하고 드로그 콤보/발구르기 클립 자산을 재배치했다.

- Drog 씬 registeredClips와 스킬 애니메이션 참조를 새 자산 구성에 맞춰 동기화했다.

- 콤보-기본기2 3타용 데미지 이펙트 자산과 DownloadCache 메타를 함께 추가했다.
2026-04-15 09:54:54 +09:00
42fe880830 feat: 드로그 애니메이션 자산 정리
- 드로그 대기/조깅/콤보용 신규 애니메이션 자산을 추가하고 기본기 2-2, 3-1 스킬 클립 참조를 갱신
- 강타, 기본기2 1타, 콤보 발구르기 1타 클립의 루트/루프 블렌드 설정을 조정해 접속성을 보정
- 기본기 1-3-1 FBX와 기본기 2-2-1, 3-1-0 클립을 프로젝트 자산으로 반영
2026-04-13 22:12:57 +09:00
9fd231626b fix: 드로그 패턴 애니메이션 재생 끊김 수정
- BT 재평가 중에도 패턴 실행 상태를 보존하도록 보스 패턴 액션과 런타임 상태를 조정했다.
- 스킬 컨트롤러에서 동일 프레임 종료 판정을 막아 패턴 내 다음 스킬이 즉시 잘리는 문제를 수정했다.
- 드로그 BT, 패턴/스킬 데이터, 애니메이션 클립과 컨트롤러를 현재 검증된 재생 구성으로 정리했다.
- 자연 발동 기준으로 콤보-기본기2 재생 시간을 재검증해 클립 길이와 실제 재생 간격이 맞는 것을 확인했다.
2026-04-12 05:44:54 +09:00
12a481b596 fix: 보스 패턴 애니메이션 전환 안정화
- SkillController를 패턴 경계 기준으로 분기해 보스 첫 스킬은 즉시 시작하고 마지막 스킬만 Idle로 부드럽게 복귀하도록 조정
- 보스 패턴 실행 중 현재 스킬이 첫/마지막 스텝인지 BossBehaviorRuntimeState와 패턴 실행 경로에서 공유하도록 확장
- 패턴 내부 연속 클립 전환은 하드 전환으로 유지해 시작 프레임 스킵과 중간 Idle 복귀 문제를 줄이고 종료 전환 시간을 별도 노출
2026-04-11 14:18:29 +09:00
5d58397fe0 fix: 패턴 디버그 BT 토글 동작 정리
- 보스 패턴 디버그 실행기를 추가해 강제 패턴 실행과 BT 일시정지를 분리

- 디버그 패널의 패턴 강제 발동 UI에 BT ON/OFF 토글과 상태 동기화를 반영

- Unity 리프레시 및 dotnet build로 컴파일 오류 없이 동작 확인
2026-04-10 22:09:39 +09:00
72aae85afd feat: 스킬-패턴 자동 동기화 추가
- Data_Pattern_{name}가 Data_Skill_{name}_{seq}를 순번대로 찾아 시퀀스 스텝을 자동 재구성하도록 추가
- SkillData asset 변경 시 BossPatternData를 다시 맞추는 에디터 postprocessor를 추가
- 드로그 리빌드 경로와 콤보-기본기1 패턴 자산을 새 자동 동기화 규칙에 맞게 정리
2026-04-10 11:37:20 +09:00
f6f7eaaef2 feat: 드로그 페이즈별 아이들 모션 전환 추가
- EnemyAnimationController가 보스 런타임 페이즈를 Animator Phase 파라미터로 동기화\n- AC_Boss_Drog에 1/2페이즈 공용 Idle과 3페이즈 전용 Idle 상태 및 전이 추가\n- 정지 중 페이즈 변경과 이동/피격 후 복귀가 현재 페이즈 Idle로 이어지도록 정리
2026-04-10 09:43:26 +09:00
205b20e4e6 feat: 드로그 기본 루프 게이트를 BT로 이관
- big pattern grace period 판정을 런타임 헬퍼에서 제거하고 BT 조건/액션 노드로 명시

- Increment/Reset Basic Loop Count 노드 추가 및 BT_Drog 재빌드 반영

- Signature Failure Effects 수치를 BT 노드가 직접 보관하도록 정리
2026-04-10 09:22:56 +09:00
b019acd0a3 feat: 보스 공통 패턴 간격 추가
- BossBehaviorRuntimeState에 패턴 종료 후 공통 텀과 준비 판정을 추가\n- UsePatternAction이 런타임 패턴 실행 결과와 공통 텀을 함께 사용하도록 정리\n- 드로그 PlayMode 테스트에 패턴 종료 후 공통 간격 검증 케이스를 추가
2026-04-10 07:57:15 +09:00
4ba6d9d9ff fix: 애니메이션 클립 트리머 경계값과 참조 커브 보존
- 트리밍 구간에 기존 키가 없더라도 시작점과 종료점 값을 샘플링해 경계 구간이 비지 않도록 보정

- ObjectReference 커브를 함께 잘라 VFX와 소품 전환 키가 새 클립에서도 유지되도록 수정

- 새 클립 생성 시 루트 모션, 루프, 미러 등 AnimationClipSettings를 원본에서 복사하도록 보강
2026-04-09 23:24:24 +09:00
111 changed files with 1594709 additions and 805359 deletions

View File

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

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

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

Binary file not shown.

View File

@@ -0,0 +1,751 @@
fileFormatVersion: 2
guid: 55c7e5b44bb610227b6353a58f2c8ebf
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 3
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human:
- boneName: Hips
humanName: Hips
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: UpperLeg_L
humanName: LeftUpperLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: UpperLeg_R
humanName: RightUpperLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: LowerLeg_L
humanName: LeftLowerLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: LowerLeg_R
humanName: RightLowerLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ankle_L
humanName: LeftFoot
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ankle_R
humanName: RightFoot
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_01
humanName: Spine
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_02
humanName: Chest
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Neck
humanName: Neck
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Head
humanName: Head
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Clavicle_L
humanName: LeftShoulder
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Clavicle_R
humanName: RightShoulder
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Shoulder_L
humanName: LeftUpperArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Shoulder_R
humanName: RightUpperArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Elbow_L
humanName: LeftLowerArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Elbow_R
humanName: RightLowerArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Hand_L
humanName: LeftHand
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Hand_R
humanName: RightHand
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ball_L
humanName: LeftToes
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ball_R
humanName: RightToes
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Eyes
humanName: LeftEye
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Eyebrows
humanName: Jaw
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_01
humanName: Left Thumb Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_02
humanName: Left Thumb Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_03
humanName: Left Thumb Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_01
humanName: Left Index Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_02
humanName: Left Index Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_03
humanName: Left Index Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_01
humanName: Left Little Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_02
humanName: Left Little Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_03
humanName: Left Little Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_011
humanName: Right Thumb Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_021
humanName: Right Thumb Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_031
humanName: Right Thumb Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_011
humanName: Right Index Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_021
humanName: Right Index Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_031
humanName: Right Index Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_011
humanName: Right Little Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_021
humanName: Right Little Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_031
humanName: Right Little Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_03
humanName: UpperChest
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
skeleton:
- name: Standing Taunt Battlecry(Clone)
parentName:
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_BarbarianGiant_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_ElementalGolem_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_FortGolem_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Troll_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_RedDemon_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Big_Ork_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Pig_Butcher_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Slayer_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_MechanicalGolem_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_MutantGuy_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Dwarf_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Root
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0.00000018626451, y: 0.002320096, z: -0.041523628}
rotation: {x: -0, y: -0, z: -0.0000000043655746, w: 1}
scale: {x: 0.99999994, y: 1, z: 1}
- name: Hips
parentName: Root
position: {x: -0, y: 0.8762761, z: 0}
rotation: {x: 0.000000005738333, y: 9.761482e-10, z: 0.16770096, w: 0.98583794}
scale: {x: 1.0000001, y: 1, z: 1}
- name: Spine_01
parentName: Hips
position: {x: 0.03397978, y: 0.0969857, z: -0.015528781}
rotation: {x: -0.39460626, y: 0.58675885, z: -0.5664237, w: 0.42327797}
scale: {x: 1.0000035, y: 1.0000036, z: 1.0000011}
- name: Spine_02
parentName: Spine_01
position: {x: -0.18151169, y: 4.5519144e-17, z: -1.1814681e-17}
rotation: {x: 0.9951862, y: -0.09800279, z: 0.000000014901161, w: 0.000000029802322}
scale: {x: 1.0000033, y: 1.0000031, z: 1.0000024}
- name: Spine_03
parentName: Spine_02
position: {x: -0.17903724, y: 2.5588683e-17, z: -5.236993e-15}
rotation: {x: -0.9781115, y: 0.20808126, z: 0.000000046363315, w: 0.000000051945598}
scale: {x: 1.0000014, y: 1.0000014, z: 1.0000019}
- name: Neck
parentName: Spine_03
position: {x: -0.18112935, y: 0.0169739, z: -0.0000000011960342}
rotation: {x: -0.000000030073853, y: 0.000000095028874, z: 0.30901578, w: 0.95105696}
scale: {x: 1.0000004, y: 1.0000002, z: 0.99999887}
- name: Head
parentName: Neck
position: {x: -0.08285272, y: 0.036295444, z: -0.0000000011654561}
rotation: {x: -0.000000016204178, y: -0.000000063277405, z: 0.10955088, w: 0.99398124}
scale: {x: 1.0000004, y: 1.0000008, z: 1.0000004}
- name: Eyebrows
parentName: Head
position: {x: -0.19999892, y: 0.02186953, z: 1.6423345e-10}
rotation: {x: 0.8059357, y: -0.59200317, z: -0.00000006298803, w: 0.000000024526253}
scale: {x: 1.0000033, y: 1.0000031, z: 1.0000042}
- name: Eyes
parentName: Head
position: {x: -0.18457133, y: 0.010586951, z: 7.950428e-11}
rotation: {x: 0.15786922, y: -0.68925846, z: 0.15786922, w: 0.6892585}
scale: {x: 1.0000006, y: 1.0000005, z: 1.0000001}
- name: Clavicle_L
parentName: Spine_03
position: {x: -0.07733449, y: -0.0015139526, z: -0.16716343}
rotation: {x: 0.4217782, y: -0.624393, z: 0.42558777, w: 0.5011105}
scale: {x: 0.9999997, y: 1, z: 0.9999998}
- name: Shoulder_L
parentName: Clavicle_L
position: {x: -0.16134125, y: -4.7947756e-17, z: -5.7731595e-17}
rotation: {x: 0.002854496, y: 0.05185216, z: -0.054891802, w: 0.997141}
scale: {x: 1, y: 0.99999946, z: 0.9999997}
- name: Elbow_L
parentName: Shoulder_L
position: {x: -0.4568335, y: -1.3457903e-16, z: 2.1094237e-16}
rotation: {x: -0.000000057276324, y: 0.059024423, z: -0.00000003128661, w: 0.9982566}
scale: {x: 0.99999994, y: 0.9999997, z: 1.0000002}
- name: Hand_L
parentName: Elbow_L
position: {x: -0.3286817, y: -5.684342e-16, z: 1.4654943e-16}
rotation: {x: 0.054274905, y: 0.39597395, z: 0.124479204, w: 0.9081651}
scale: {x: 0.9999984, y: 0.9999997, z: 1.0000037}
- name: Thumb_01
parentName: Hand_L
position: {x: -0.08908812, y: -2.753353e-16, z: -4.4408918e-17}
rotation: {x: -0.032716393, y: -0.110337414, z: -0.07735347, w: 0.9903392}
scale: {x: 1.0000048, y: 1.0000017, z: 0.99999493}
- name: Thumb_02
parentName: Thumb_01
position: {x: -0.09701814, y: 4.396483e-16, z: 1.8651746e-16}
rotation: {x: -0.0526608, y: -0.017768951, z: 0.027707065, w: 0.99806994}
scale: {x: 0.99999934, y: 1.0000012, z: 1.0000004}
- name: Thumb_03
parentName: Thumb_02
position: {x: -0.092271924, y: 4.2188474e-17, z: -2.220446e-16}
rotation: {x: -0.046633955, y: -0.14921468, z: -0.29463217, w: 0.94273657}
scale: {x: 1.0000044, y: 0.9999984, z: 0.99999696}
- name: IndexFinger_01
parentName: Hand_L
position: {x: -0.120755404, y: 0.042213865, z: -0.0984221}
rotation: {x: -0.05360259, y: -0.37485915, z: -0.12035188, w: 0.91767246}
scale: {x: 1.0000088, y: 1.000001, z: 0.9999916}
- name: IndexFinger_02
parentName: IndexFinger_01
position: {x: -0.0614739, y: -3.1441861e-19, z: 0}
rotation: {x: -0.0015660704, y: -0.002976446, z: 0.036817674, w: 0.9993164}
scale: {x: 1, y: 0.99999887, z: 1.0000005}
- name: IndexFinger_03
parentName: IndexFinger_02
position: {x: -0.057940163, y: 1.8041123e-18, z: -2.5535128e-17}
rotation: {x: -0.009162882, y: -0.012816688, z: 0.037616946, w: 0.99916804}
scale: {x: 1.0000017, y: 0.9999991, z: 1.0000002}
- name: IndexFinger_04
parentName: IndexFinger_03
position: {x: -0.059118144, y: -1.8624858e-16, z: -5.551115e-19}
rotation: {x: -0.005975477, y: -0.027766017, z: -0.21030384, w: 0.9772235}
scale: {x: 0.99999243, y: 1.0000079, z: 1.0000004}
- name: Finger_01
parentName: Hand_L
position: {x: -0.051985342, y: 0.012058426, z: -0.14852415}
rotation: {x: -0.09862835, y: -0.46502224, z: -0.05665377, w: 0.8779619}
scale: {x: 1.0000072, y: 1.0000014, z: 0.99999243}
- name: Finger_02
parentName: Finger_01
position: {x: -0.0641512, y: 1.8214596e-19, z: 2.220446e-18}
rotation: {x: 0.003567463, y: 0.019343397, z: 0.028556647, w: 0.9993986}
scale: {x: 1.0000008, y: 0.99999934, z: 0.99999934}
- name: Finger_03
parentName: Finger_02
position: {x: -0.05330061, y: -1.7347668e-16, z: 4.2188474e-17}
rotation: {x: -0.024194188, y: -0.018460134, z: 0.031653017, w: 0.9990355}
scale: {x: 0.99999744, y: 0.9999996, z: 1.0000036}
- name: Finger_04
parentName: Finger_03
position: {x: -0.047222238, y: -3.8635761e-16, z: -5.662137e-17}
rotation: {x: 0.021918332, y: 0.09546627, z: -0.22269543, w: 0.9699549}
scale: {x: 0.9999971, y: 1.0000051, z: 0.9999983}
- name: Clavicle_R
parentName: Spine_03
position: {x: -0.07733742, y: -0.0015131371, z: 0.16716298}
rotation: {x: 0.62439305, y: 0.4217782, z: 0.5011104, w: -0.42558774}
scale: {x: 0.99999875, y: 1.0000032, z: 1.0000035}
- name: Shoulder_R
parentName: Clavicle_R
position: {x: 0.16134152, y: 0.00000022487666, z: -0.00000006441897}
rotation: {x: 0.0028544657, y: 0.051852185, z: -0.05489184, w: 0.99714094}
scale: {x: 0.99999946, y: 0.9999983, z: 0.9999984}
- name: Elbow_R
parentName: Shoulder_R
position: {x: 0.45683342, y: 8.5265126e-16, z: 0.00000003960579}
rotation: {x: 0.000000030966472, y: 0.059024457, z: -0.00000006533809, w: 0.99825656}
scale: {x: 0.9999996, y: 1.0000019, z: 1.0000029}
- name: Hand_R
parentName: Elbow_R
position: {x: 0.328678, y: -7.958079e-15, z: -0.00000031490552}
rotation: {x: 0.054274853, y: 0.39597386, z: 0.12447934, w: 0.90816504}
scale: {x: 0.9999978, y: 1.0000015, z: 1.0000079}
- name: Thumb_011
parentName: Hand_R
position: {x: 0.08908848, y: -0.0000018401335, z: 0.0000010454004}
rotation: {x: -0.032713063, y: -0.110324726, z: -0.07735346, w: 0.9903407}
scale: {x: 1.0000161, y: 1.0000014, z: 0.9999834}
- name: Thumb_021
parentName: Thumb_011
position: {x: 0.09702438, y: -0.0000012559718, z: 0.000003968674}
rotation: {x: -0.05266223, y: -0.017789794, z: 0.02766259, w: 0.9980707}
scale: {x: 1.0000037, y: 1.0000092, z: 0.99999607}
- name: Thumb_031
parentName: Thumb_021
position: {x: 0.09227324, y: 0.0000074613017, z: -0.000000493297}
rotation: {x: -0.046633795, y: -0.14921463, z: -0.2946321, w: 0.9427365}
scale: {x: 1.0000225, y: 1.0000014, z: 0.9999854}
- name: IndexFinger_011
parentName: Hand_R
position: {x: 0.12075663, y: -0.04220975, z: 0.09842222}
rotation: {x: -0.05360265, y: -0.37485918, z: -0.12035192, w: 0.9176725}
scale: {x: 1.0000279, y: 1.0000039, z: 0.99997544}
- name: IndexFinger_021
parentName: IndexFinger_011
position: {x: 0.061476283, y: -0.0000047270864, z: 0.00000030396376}
rotation: {x: -0.0015651392, y: -0.0029709328, z: 0.036722027, w: 0.99931985}
scale: {x: 1.0000029, y: 1.0000005, z: 1.0000062}
- name: IndexFinger_031
parentName: IndexFinger_021
position: {x: 0.05794711, y: 0.0000061344235, z: 0.00000056286797}
rotation: {x: -0.00916286, y: -0.0128391525, z: 0.037715007, w: 0.99916404}
scale: {x: 1.0000056, y: 1.0000017, z: 1.0000069}
- name: IndexFinger_041
parentName: IndexFinger_031
position: {x: 0.059107542, y: -0.0000048901334, z: -0.00000042587297}
rotation: {x: -0.0059754145, y: -0.027766181, z: -0.21030399, w: 0.9772234}
scale: {x: 0.9999805, y: 1.0000246, z: 1.0000051}
- name: Finger_011
parentName: Hand_R
position: {x: 0.051991317, y: -0.012054317, z: 0.14853004}
rotation: {x: -0.098623544, y: -0.46501857, z: -0.05666304, w: 0.8779638}
scale: {x: 1.0000256, y: 1.0000019, z: 0.9999755}
- name: Finger_021
parentName: Finger_011
position: {x: 0.064152494, y: 0.000001623162, z: -0.000000044617604}
rotation: {x: 0.0035673003, y: 0.019343434, z: 0.02855653, w: 0.9993987}
scale: {x: 1.0000013, y: 1.0000068, z: 1.0000048}
- name: Finger_031
parentName: Finger_021
position: {x: 0.05329311, y: 0.0000014939407, z: 0.00000036493486}
rotation: {x: -0.024189861, y: -0.018476665, z: 0.0317534, w: 0.99903214}
scale: {x: 0.9999959, y: 0.9999984, z: 1.0000075}
- name: Finger_041
parentName: Finger_031
position: {x: 0.047220778, y: -0.000008236042, z: -0.00000043038915}
rotation: {x: 0.021918578, y: 0.09546642, z: -0.22269535, w: 0.96995497}
scale: {x: 0.9999941, y: 1.0000123, z: 0.99999946}
- name: UpperLeg_L
parentName: Hips
position: {x: -0.13062388, y: -8.881784e-18, z: -1.11022296e-17}
rotation: {x: -0.2668567, y: -0.21296217, z: 0.49947357, w: 0.79621655}
scale: {x: 1, y: 0.99999994, z: 1.0000001}
- name: LowerLeg_L
parentName: UpperLeg_L
position: {x: -0.37842098, y: 1.02140514e-16, z: 2.2204459e-17}
rotation: {x: 0.000000014901161, y: 0.000000014901161, z: 0.0000000037252903, w: 1}
scale: {x: 1, y: 1.0000024, z: 1.0000001}
- name: Ankle_L
parentName: LowerLeg_L
position: {x: -0.37842098, y: -0.00000000799083, z: -0.00000017884236}
rotation: {x: 0.74587387, y: 0.5143675, z: -0.19933206, w: 0.3733162}
scale: {x: 1.0000031, y: 1.0000026, z: 1.0000039}
- name: Ball_L
parentName: Ankle_L
position: {x: -0.12877615, y: 3.5527136e-17, z: 3.3500888e-17}
rotation: {x: 0.000000059604645, y: -0.00000010430813, z: -0.23606837, w: 0.9717365}
scale: {x: 1.000003, y: 1.0000012, z: 1.0000043}
- name: Toes_L
parentName: Ball_L
position: {x: -0.0729575, y: 8.228515e-18, z: -1.3369588e-15}
rotation: {x: -0.000000011153303, y: -0.7071068, z: 0.00000005585679, w: 0.70710677}
scale: {x: 0.9999996, y: 0.99999994, z: 0.9999985}
- name: UpperLeg_R
parentName: Hips
position: {x: 0.102061786, y: -0.08152349, z: -1.1102199e-17}
rotation: {x: 0.58627975, y: -0.7346501, z: -0.28922033, w: 0.18143041}
scale: {x: 1.0000018, y: 1.0000002, z: 1.0000037}
- name: LowerLeg_R
parentName: UpperLeg_R
position: {x: 0.37842068, y: 0.00000027396194, z: 0.0000002682214}
rotation: {x: 0.000000044703484, y: -0, z: 0.00000008940697, w: 1}
scale: {x: 0.99999994, y: 1.0000006, z: 1.0000002}
- name: Ankle_R
parentName: LowerLeg_R
position: {x: 0.37842116, y: 0.0000002667152, z: 0.00000034490833}
rotation: {x: 0.7458739, y: 0.5143674, z: -0.19933215, w: 0.37331626}
scale: {x: 1.0000004, y: 1.0000017, z: 1.0000024}
- name: Ball_R
parentName: Ankle_R
position: {x: 0.12877613, y: -0.000000010258867, z: -1.0658141e-16}
rotation: {x: -0.000000059604638, y: -0.000000014901159, z: -0.23606837, w: 0.97173643}
scale: {x: 0.99999756, y: 1.000004, z: 0.9999984}
- name: Toes_R
parentName: Ball_R
position: {x: 0.0729575, y: -4.0909496e-14, z: 3.5527136e-17}
rotation: {x: 0.000000026054469, y: -0.7071068, z: 0.000000033550176, w: 0.7071068}
scale: {x: 0.99999934, y: 1.0000049, z: 1.0000044}
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 1
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {fileID: 9000000, guid: b63434e5ef6b98d45865ec4417e31bd4, type: 2}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 3
humanoidOversampling: 1
avatarSetup: 2
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,751 @@
fileFormatVersion: 2
guid: 9b1d3683f33367ef0a642371e9c3d73d
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 3
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human:
- boneName: Hips
humanName: Hips
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: UpperLeg_L
humanName: LeftUpperLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: UpperLeg_R
humanName: RightUpperLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: LowerLeg_L
humanName: LeftLowerLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: LowerLeg_R
humanName: RightLowerLeg
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ankle_L
humanName: LeftFoot
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ankle_R
humanName: RightFoot
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_01
humanName: Spine
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_02
humanName: Chest
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Neck
humanName: Neck
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Head
humanName: Head
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Clavicle_L
humanName: LeftShoulder
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Clavicle_R
humanName: RightShoulder
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Shoulder_L
humanName: LeftUpperArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Shoulder_R
humanName: RightUpperArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Elbow_L
humanName: LeftLowerArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Elbow_R
humanName: RightLowerArm
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Hand_L
humanName: LeftHand
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Hand_R
humanName: RightHand
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ball_L
humanName: LeftToes
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Ball_R
humanName: RightToes
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Eyes
humanName: LeftEye
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Eyebrows
humanName: Jaw
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_01
humanName: Left Thumb Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_02
humanName: Left Thumb Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_03
humanName: Left Thumb Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_01
humanName: Left Index Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_02
humanName: Left Index Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_03
humanName: Left Index Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_01
humanName: Left Little Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_02
humanName: Left Little Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_03
humanName: Left Little Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_011
humanName: Right Thumb Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_021
humanName: Right Thumb Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Thumb_031
humanName: Right Thumb Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_011
humanName: Right Index Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_021
humanName: Right Index Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: IndexFinger_031
humanName: Right Index Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_011
humanName: Right Little Proximal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_021
humanName: Right Little Intermediate
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Finger_031
humanName: Right Little Distal
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
- boneName: Spine_03
humanName: UpperChest
limit:
min: {x: 0, y: 0, z: 0}
max: {x: 0, y: 0, z: 0}
value: {x: 0, y: 0, z: 0}
length: 0
modified: 0
skeleton:
- name: Standing Taunt Battlecry(Clone)
parentName:
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_BarbarianGiant_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_ElementalGolem_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_FortGolem_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Troll_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_RedDemon_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Big_Ork_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Pig_Butcher_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Slayer_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_MechanicalGolem_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_MutantGuy_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Character_Dwarf_01
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0, y: 0, z: 0}
rotation: {x: 0, y: -0, z: -0, w: 1}
scale: {x: 1, y: 1, z: 1}
- name: Root
parentName: Standing Taunt Battlecry(Clone)
position: {x: -0.00000018626451, y: 0.002320096, z: -0.041523628}
rotation: {x: -0, y: -0, z: -0.0000000043655746, w: 1}
scale: {x: 0.99999994, y: 1, z: 1}
- name: Hips
parentName: Root
position: {x: -0, y: 0.8762761, z: 0}
rotation: {x: 0.000000005738333, y: 9.761482e-10, z: 0.16770096, w: 0.98583794}
scale: {x: 1.0000001, y: 1, z: 1}
- name: Spine_01
parentName: Hips
position: {x: 0.03397978, y: 0.0969857, z: -0.015528781}
rotation: {x: -0.39460626, y: 0.58675885, z: -0.5664237, w: 0.42327797}
scale: {x: 1.0000035, y: 1.0000036, z: 1.0000011}
- name: Spine_02
parentName: Spine_01
position: {x: -0.18151169, y: 4.5519144e-17, z: -1.1814681e-17}
rotation: {x: 0.9951862, y: -0.09800279, z: 0.000000014901161, w: 0.000000029802322}
scale: {x: 1.0000033, y: 1.0000031, z: 1.0000024}
- name: Spine_03
parentName: Spine_02
position: {x: -0.17903724, y: 2.5588683e-17, z: -5.236993e-15}
rotation: {x: -0.9781115, y: 0.20808126, z: 0.000000046363315, w: 0.000000051945598}
scale: {x: 1.0000014, y: 1.0000014, z: 1.0000019}
- name: Neck
parentName: Spine_03
position: {x: -0.18112935, y: 0.0169739, z: -0.0000000011960342}
rotation: {x: -0.000000030073853, y: 0.000000095028874, z: 0.30901578, w: 0.95105696}
scale: {x: 1.0000004, y: 1.0000002, z: 0.99999887}
- name: Head
parentName: Neck
position: {x: -0.08285272, y: 0.036295444, z: -0.0000000011654561}
rotation: {x: -0.000000016204178, y: -0.000000063277405, z: 0.10955088, w: 0.99398124}
scale: {x: 1.0000004, y: 1.0000008, z: 1.0000004}
- name: Eyebrows
parentName: Head
position: {x: -0.19999892, y: 0.02186953, z: 1.6423345e-10}
rotation: {x: 0.8059357, y: -0.59200317, z: -0.00000006298803, w: 0.000000024526253}
scale: {x: 1.0000033, y: 1.0000031, z: 1.0000042}
- name: Eyes
parentName: Head
position: {x: -0.18457133, y: 0.010586951, z: 7.950428e-11}
rotation: {x: 0.15786922, y: -0.68925846, z: 0.15786922, w: 0.6892585}
scale: {x: 1.0000006, y: 1.0000005, z: 1.0000001}
- name: Clavicle_L
parentName: Spine_03
position: {x: -0.07733449, y: -0.0015139526, z: -0.16716343}
rotation: {x: 0.4217782, y: -0.624393, z: 0.42558777, w: 0.5011105}
scale: {x: 0.9999997, y: 1, z: 0.9999998}
- name: Shoulder_L
parentName: Clavicle_L
position: {x: -0.16134125, y: -4.7947756e-17, z: -5.7731595e-17}
rotation: {x: 0.002854496, y: 0.05185216, z: -0.054891802, w: 0.997141}
scale: {x: 1, y: 0.99999946, z: 0.9999997}
- name: Elbow_L
parentName: Shoulder_L
position: {x: -0.4568335, y: -1.3457903e-16, z: 2.1094237e-16}
rotation: {x: -0.000000057276324, y: 0.059024423, z: -0.00000003128661, w: 0.9982566}
scale: {x: 0.99999994, y: 0.9999997, z: 1.0000002}
- name: Hand_L
parentName: Elbow_L
position: {x: -0.3286817, y: -5.684342e-16, z: 1.4654943e-16}
rotation: {x: 0.054274905, y: 0.39597395, z: 0.124479204, w: 0.9081651}
scale: {x: 0.9999984, y: 0.9999997, z: 1.0000037}
- name: Thumb_01
parentName: Hand_L
position: {x: -0.08908812, y: -2.753353e-16, z: -4.4408918e-17}
rotation: {x: -0.032716393, y: -0.110337414, z: -0.07735347, w: 0.9903392}
scale: {x: 1.0000048, y: 1.0000017, z: 0.99999493}
- name: Thumb_02
parentName: Thumb_01
position: {x: -0.09701814, y: 4.396483e-16, z: 1.8651746e-16}
rotation: {x: -0.0526608, y: -0.017768951, z: 0.027707065, w: 0.99806994}
scale: {x: 0.99999934, y: 1.0000012, z: 1.0000004}
- name: Thumb_03
parentName: Thumb_02
position: {x: -0.092271924, y: 4.2188474e-17, z: -2.220446e-16}
rotation: {x: -0.046633955, y: -0.14921468, z: -0.29463217, w: 0.94273657}
scale: {x: 1.0000044, y: 0.9999984, z: 0.99999696}
- name: IndexFinger_01
parentName: Hand_L
position: {x: -0.120755404, y: 0.042213865, z: -0.0984221}
rotation: {x: -0.05360259, y: -0.37485915, z: -0.12035188, w: 0.91767246}
scale: {x: 1.0000088, y: 1.000001, z: 0.9999916}
- name: IndexFinger_02
parentName: IndexFinger_01
position: {x: -0.0614739, y: -3.1441861e-19, z: 0}
rotation: {x: -0.0015660704, y: -0.002976446, z: 0.036817674, w: 0.9993164}
scale: {x: 1, y: 0.99999887, z: 1.0000005}
- name: IndexFinger_03
parentName: IndexFinger_02
position: {x: -0.057940163, y: 1.8041123e-18, z: -2.5535128e-17}
rotation: {x: -0.009162882, y: -0.012816688, z: 0.037616946, w: 0.99916804}
scale: {x: 1.0000017, y: 0.9999991, z: 1.0000002}
- name: IndexFinger_04
parentName: IndexFinger_03
position: {x: -0.059118144, y: -1.8624858e-16, z: -5.551115e-19}
rotation: {x: -0.005975477, y: -0.027766017, z: -0.21030384, w: 0.9772235}
scale: {x: 0.99999243, y: 1.0000079, z: 1.0000004}
- name: Finger_01
parentName: Hand_L
position: {x: -0.051985342, y: 0.012058426, z: -0.14852415}
rotation: {x: -0.09862835, y: -0.46502224, z: -0.05665377, w: 0.8779619}
scale: {x: 1.0000072, y: 1.0000014, z: 0.99999243}
- name: Finger_02
parentName: Finger_01
position: {x: -0.0641512, y: 1.8214596e-19, z: 2.220446e-18}
rotation: {x: 0.003567463, y: 0.019343397, z: 0.028556647, w: 0.9993986}
scale: {x: 1.0000008, y: 0.99999934, z: 0.99999934}
- name: Finger_03
parentName: Finger_02
position: {x: -0.05330061, y: -1.7347668e-16, z: 4.2188474e-17}
rotation: {x: -0.024194188, y: -0.018460134, z: 0.031653017, w: 0.9990355}
scale: {x: 0.99999744, y: 0.9999996, z: 1.0000036}
- name: Finger_04
parentName: Finger_03
position: {x: -0.047222238, y: -3.8635761e-16, z: -5.662137e-17}
rotation: {x: 0.021918332, y: 0.09546627, z: -0.22269543, w: 0.9699549}
scale: {x: 0.9999971, y: 1.0000051, z: 0.9999983}
- name: Clavicle_R
parentName: Spine_03
position: {x: -0.07733742, y: -0.0015131371, z: 0.16716298}
rotation: {x: 0.62439305, y: 0.4217782, z: 0.5011104, w: -0.42558774}
scale: {x: 0.99999875, y: 1.0000032, z: 1.0000035}
- name: Shoulder_R
parentName: Clavicle_R
position: {x: 0.16134152, y: 0.00000022487666, z: -0.00000006441897}
rotation: {x: 0.0028544657, y: 0.051852185, z: -0.05489184, w: 0.99714094}
scale: {x: 0.99999946, y: 0.9999983, z: 0.9999984}
- name: Elbow_R
parentName: Shoulder_R
position: {x: 0.45683342, y: 8.5265126e-16, z: 0.00000003960579}
rotation: {x: 0.000000030966472, y: 0.059024457, z: -0.00000006533809, w: 0.99825656}
scale: {x: 0.9999996, y: 1.0000019, z: 1.0000029}
- name: Hand_R
parentName: Elbow_R
position: {x: 0.328678, y: -7.958079e-15, z: -0.00000031490552}
rotation: {x: 0.054274853, y: 0.39597386, z: 0.12447934, w: 0.90816504}
scale: {x: 0.9999978, y: 1.0000015, z: 1.0000079}
- name: Thumb_011
parentName: Hand_R
position: {x: 0.08908848, y: -0.0000018401335, z: 0.0000010454004}
rotation: {x: -0.032713063, y: -0.110324726, z: -0.07735346, w: 0.9903407}
scale: {x: 1.0000161, y: 1.0000014, z: 0.9999834}
- name: Thumb_021
parentName: Thumb_011
position: {x: 0.09702438, y: -0.0000012559718, z: 0.000003968674}
rotation: {x: -0.05266223, y: -0.017789794, z: 0.02766259, w: 0.9980707}
scale: {x: 1.0000037, y: 1.0000092, z: 0.99999607}
- name: Thumb_031
parentName: Thumb_021
position: {x: 0.09227324, y: 0.0000074613017, z: -0.000000493297}
rotation: {x: -0.046633795, y: -0.14921463, z: -0.2946321, w: 0.9427365}
scale: {x: 1.0000225, y: 1.0000014, z: 0.9999854}
- name: IndexFinger_011
parentName: Hand_R
position: {x: 0.12075663, y: -0.04220975, z: 0.09842222}
rotation: {x: -0.05360265, y: -0.37485918, z: -0.12035192, w: 0.9176725}
scale: {x: 1.0000279, y: 1.0000039, z: 0.99997544}
- name: IndexFinger_021
parentName: IndexFinger_011
position: {x: 0.061476283, y: -0.0000047270864, z: 0.00000030396376}
rotation: {x: -0.0015651392, y: -0.0029709328, z: 0.036722027, w: 0.99931985}
scale: {x: 1.0000029, y: 1.0000005, z: 1.0000062}
- name: IndexFinger_031
parentName: IndexFinger_021
position: {x: 0.05794711, y: 0.0000061344235, z: 0.00000056286797}
rotation: {x: -0.00916286, y: -0.0128391525, z: 0.037715007, w: 0.99916404}
scale: {x: 1.0000056, y: 1.0000017, z: 1.0000069}
- name: IndexFinger_041
parentName: IndexFinger_031
position: {x: 0.059107542, y: -0.0000048901334, z: -0.00000042587297}
rotation: {x: -0.0059754145, y: -0.027766181, z: -0.21030399, w: 0.9772234}
scale: {x: 0.9999805, y: 1.0000246, z: 1.0000051}
- name: Finger_011
parentName: Hand_R
position: {x: 0.051991317, y: -0.012054317, z: 0.14853004}
rotation: {x: -0.098623544, y: -0.46501857, z: -0.05666304, w: 0.8779638}
scale: {x: 1.0000256, y: 1.0000019, z: 0.9999755}
- name: Finger_021
parentName: Finger_011
position: {x: 0.064152494, y: 0.000001623162, z: -0.000000044617604}
rotation: {x: 0.0035673003, y: 0.019343434, z: 0.02855653, w: 0.9993987}
scale: {x: 1.0000013, y: 1.0000068, z: 1.0000048}
- name: Finger_031
parentName: Finger_021
position: {x: 0.05329311, y: 0.0000014939407, z: 0.00000036493486}
rotation: {x: -0.024189861, y: -0.018476665, z: 0.0317534, w: 0.99903214}
scale: {x: 0.9999959, y: 0.9999984, z: 1.0000075}
- name: Finger_041
parentName: Finger_031
position: {x: 0.047220778, y: -0.000008236042, z: -0.00000043038915}
rotation: {x: 0.021918578, y: 0.09546642, z: -0.22269535, w: 0.96995497}
scale: {x: 0.9999941, y: 1.0000123, z: 0.99999946}
- name: UpperLeg_L
parentName: Hips
position: {x: -0.13062388, y: -8.881784e-18, z: -1.11022296e-17}
rotation: {x: -0.2668567, y: -0.21296217, z: 0.49947357, w: 0.79621655}
scale: {x: 1, y: 0.99999994, z: 1.0000001}
- name: LowerLeg_L
parentName: UpperLeg_L
position: {x: -0.37842098, y: 1.02140514e-16, z: 2.2204459e-17}
rotation: {x: 0.000000014901161, y: 0.000000014901161, z: 0.0000000037252903, w: 1}
scale: {x: 1, y: 1.0000024, z: 1.0000001}
- name: Ankle_L
parentName: LowerLeg_L
position: {x: -0.37842098, y: -0.00000000799083, z: -0.00000017884236}
rotation: {x: 0.74587387, y: 0.5143675, z: -0.19933206, w: 0.3733162}
scale: {x: 1.0000031, y: 1.0000026, z: 1.0000039}
- name: Ball_L
parentName: Ankle_L
position: {x: -0.12877615, y: 3.5527136e-17, z: 3.3500888e-17}
rotation: {x: 0.000000059604645, y: -0.00000010430813, z: -0.23606837, w: 0.9717365}
scale: {x: 1.000003, y: 1.0000012, z: 1.0000043}
- name: Toes_L
parentName: Ball_L
position: {x: -0.0729575, y: 8.228515e-18, z: -1.3369588e-15}
rotation: {x: -0.000000011153303, y: -0.7071068, z: 0.00000005585679, w: 0.70710677}
scale: {x: 0.9999996, y: 0.99999994, z: 0.9999985}
- name: UpperLeg_R
parentName: Hips
position: {x: 0.102061786, y: -0.08152349, z: -1.1102199e-17}
rotation: {x: 0.58627975, y: -0.7346501, z: -0.28922033, w: 0.18143041}
scale: {x: 1.0000018, y: 1.0000002, z: 1.0000037}
- name: LowerLeg_R
parentName: UpperLeg_R
position: {x: 0.37842068, y: 0.00000027396194, z: 0.0000002682214}
rotation: {x: 0.000000044703484, y: -0, z: 0.00000008940697, w: 1}
scale: {x: 0.99999994, y: 1.0000006, z: 1.0000002}
- name: Ankle_R
parentName: LowerLeg_R
position: {x: 0.37842116, y: 0.0000002667152, z: 0.00000034490833}
rotation: {x: 0.7458739, y: 0.5143674, z: -0.19933215, w: 0.37331626}
scale: {x: 1.0000004, y: 1.0000017, z: 1.0000024}
- name: Ball_R
parentName: Ankle_R
position: {x: 0.12877613, y: -0.000000010258867, z: -1.0658141e-16}
rotation: {x: -0.000000059604638, y: -0.000000014901159, z: -0.23606837, w: 0.97173643}
scale: {x: 0.99999756, y: 1.000004, z: 0.9999984}
- name: Toes_R
parentName: Ball_R
position: {x: 0.0729575, y: -4.0909496e-14, z: 3.5527136e-17}
rotation: {x: 0.000000026054469, y: -0.7071068, z: 0.000000033550176, w: 0.7071068}
scale: {x: 0.99999934, y: 1.0000049, z: 1.0000044}
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 1
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {fileID: 9000000, guid: b63434e5ef6b98d45865ec4417e31bd4, type: 2}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 3
humanoidOversampling: 1
avatarSetup: 2
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -14541,104 +14541,104 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: registeredClips.Array.size
value: 38
value: 29
objectReference: {fileID: 0}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[0]'
value:
objectReference: {fileID: 7400000, guid: 12e823759a003f5e9a47293f009111f8, type: 2}
objectReference: {fileID: 7400000, guid: c9691c41dd675a18dbf4d14aeb319ce0, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[1]'
value:
objectReference: {fileID: 7400000, guid: 8a5b6b14574ddf9c2990be2b5e6e4a73, type: 2}
objectReference: {fileID: 345540028182452376, guid: 393c4a955fb89979f81115ea7988d57e, type: 3}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[2]'
value:
objectReference: {fileID: 7400000, guid: 6a8225638f252a343bf7a63037d9646b, type: 2}
objectReference: {fileID: 7400000, guid: ed7913df0854ae86a9374a34d7ebdc7d, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[3]'
value:
objectReference: {fileID: 7400000, guid: c901be6f00fe40f85ac3cefc15305b22, type: 2}
objectReference: {fileID: 7400000, guid: 1654c779ca38159dab86a08864968bcc, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[4]'
value:
objectReference: {fileID: 7400000, guid: 79b23145d7dec4db98ff025556552e72, type: 2}
objectReference: {fileID: 7400000, guid: 51c52bb037757304ca6faaf68c181bcd, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[5]'
value:
objectReference: {fileID: 7400000, guid: c40824d39d8c11bedbeb448867e881c3, type: 2}
objectReference: {fileID: 7400000, guid: c901be6f00fe40f85ac3cefc15305b22, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[6]'
value:
objectReference: {fileID: 7400000, guid: 6a025fd35595e802b82bd468471d91e2, type: 2}
objectReference: {fileID: 7400000, guid: 79b23145d7dec4db98ff025556552e72, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[7]'
value:
objectReference: {fileID: 7400000, guid: 523e4247711d3fe44b47b9c932f176ae, type: 2}
objectReference: {fileID: 7400000, guid: c40824d39d8c11bedbeb448867e881c3, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[8]'
value:
objectReference: {fileID: 7400000, guid: 84f2b5202ad298d4b91bd0e56dcfa295, type: 2}
objectReference: {fileID: 7400000, guid: 6a025fd35595e802b82bd468471d91e2, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[9]'
value:
objectReference: {fileID: 7400000, guid: 58847e89d27d1b140b1075bba68445c0, type: 2}
objectReference: {fileID: 7400000, guid: 189617e6b9348dbb287d409c27866040, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[10]'
value:
objectReference: {fileID: 7400000, guid: 0b70d6464b876144c84f2410c0359a4f, type: 2}
objectReference: {fileID: 7400000, guid: 523e4247711d3fe44b47b9c932f176ae, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[11]'
value:
objectReference: {fileID: 7400000, guid: e35d6eb3ae2c5a146801c9dd399acd52, type: 2}
objectReference: {fileID: 7400000, guid: 84f2b5202ad298d4b91bd0e56dcfa295, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[12]'
value:
objectReference: {fileID: 7400000, guid: 4ff85a68bb491e143a001f3af82639ed, type: 2}
objectReference: {fileID: 7400000, guid: 852753add7a69599eaf82f0746cb8e2a, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[13]'
value:
objectReference: {fileID: 7400000, guid: 1c76b3d381d4b38e5811352df87fa9e9, type: 2}
objectReference: {fileID: 7400000, guid: 7cc42fa8d27f37167b5c3715e8ebef8c, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[14]'
value:
objectReference: {fileID: 7400000, guid: 99ab919e6f98f0396888bafc0149f31a, type: 2}
objectReference: {fileID: 7400000, guid: 61446056d515e836f9a210484e185660, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[15]'
value:
objectReference: {fileID: 7400000, guid: a7f2d3a84c10032de8d569dcf1eed9e0, type: 2}
objectReference: {fileID: 7400000, guid: 3c74a2162339f1e06920a807790022a0, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[16]'
value:
objectReference: {fileID: 7400000, guid: 852753add7a69599eaf82f0746cb8e2a, type: 2}
objectReference: {fileID: 7400000, guid: 436c85ff7f42b275ca867b40738254a6, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[17]'
value:
objectReference: {fileID: 7400000, guid: 7cc42fa8d27f37167b5c3715e8ebef8c, type: 2}
objectReference: {fileID: 7400000, guid: 567a0c8cbb10eafa08807226645826e2, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[18]'
value:
objectReference: {fileID: 7400000, guid: 61446056d515e836f9a210484e185660, type: 2}
objectReference: {fileID: 7400000, guid: b948f6e859be42cf9ad570e16fd418f1, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[19]'
value:
objectReference: {fileID: 7400000, guid: 567a0c8cbb10eafa08807226645826e2, type: 2}
objectReference: {fileID: 7400000, guid: 2ca3044b7e7a3ff4eb8d3d6bf75f5e92, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[20]'
value:
objectReference: {fileID: 7400000, guid: 94da51b9da4bad4129ba5e33e671db62, type: 2}
objectReference: {fileID: 7400000, guid: 6b11f2b53d826bba3ab9f8086a42de14, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[21]'
value:
objectReference: {fileID: 7400000, guid: b948f6e859be42cf9ad570e16fd418f1, type: 2}
objectReference: {fileID: 7400000, guid: 156c90879bba0d7649e8b29224daa390, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[22]'
value:
objectReference: {fileID: 7400000, guid: 8cfd11750543a4484bae82462b7c0351, type: 2}
objectReference: {fileID: 7400000, guid: 6439cde8bc726bd1caad7d6e18a31416, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[23]'
value:
objectReference: {fileID: 7400000, guid: b8206d6d914a86cd9a169763c82f273e, type: 2}
objectReference: {fileID: 7400000, guid: 606aec780e456217687074cbbf23a2c8, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[24]'
value:
@@ -14646,19 +14646,19 @@ PrefabInstance:
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[25]'
value:
objectReference: {fileID: 7400000, guid: 82cf3119cd7b56e3e9d579cac94fc09d, type: 2}
objectReference: {fileID: 7400000, guid: 71c802f9bbefb10be81506bf40e18f19, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[26]'
value:
objectReference: {fileID: 7400000, guid: 18b092b0aae73b9219db20623b0c3427, type: 2}
objectReference: {fileID: 7400000, guid: 7a296d71e8987d8379c9871af2c55b6c, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[27]'
value:
objectReference: {fileID: 7400000, guid: 8f572193078ff9e229c1d39038620857, type: 2}
objectReference: {fileID: 7400000, guid: 3f502eaa976c5a413a287b99d1fc0ba8, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[28]'
value:
objectReference: {fileID: 7400000, guid: 9678ad326a270e9aa9cb5ebf5fa00279, type: 2}
objectReference: {fileID: 7400000, guid: 7f928c2b013a2b36f891ff9a285e2698, type: 2}
- target: {fileID: 8818883032728065057, guid: 56986b707b0dc09439cb35ff2f87dcc9, type: 3}
propertyPath: 'registeredClips.Array.data[29]'
value:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4ff85a68bb491e143a001f3af82639ed
guid: ed7913df0854ae86a9374a34d7ebdc7d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0b70d6464b876144c84f2410c0359a4f
guid: 1654c779ca38159dab86a08864968bcc
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 94da51b9da4bad4129ba5e33e671db62
guid: 51c52bb037757304ca6faaf68c181bcd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

View File

@@ -45131,7 +45131,7 @@ AnimationClip:
m_HasAdditiveReferencePose: 0
m_LoopTime: 0
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendOrientation: 1
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e35d6eb3ae2c5a146801c9dd399acd52
guid: 9d61fd0c58927165096b86a443f50346
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -43628,7 +43628,7 @@ AnimationClip:
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 1
m_Mirror: 0
m_EditorCurves: []
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 8cfd11750543a4484bae82462b7c0351
guid: 6b11f2b53d826bba3ab9f8086a42de14
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b8206d6d914a86cd9a169763c82f273e
guid: 156c90879bba0d7649e8b29224daa390
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 16c44854334d767d3af2fd774b89a809
guid: 6439cde8bc726bd1caad7d6e18a31416
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 82cf3119cd7b56e3e9d579cac94fc09d
guid: 606aec780e456217687074cbbf23a2c8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 18b092b0aae73b9219db20623b0c3427
guid: ead3ca0dff8c0a3468e3234269c4a62e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 8f572193078ff9e229c1d39038620857
guid: 3f077b889a0c441a8be8f51575b34f37
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 71c802f9bbefb10be81506bf40e18f19
guid: b3cb0b329a21a7fcda3402b8e07e38b9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000

View File

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

View File

@@ -1,5 +1,30 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1101 &-8931477014669629951
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 3
m_ConditionEvent: Speed
m_EventTreshold: 0.01
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -4652545120162758660}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.9
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 0
--- !u!1107 &-8724618498758723359
AnimatorStateMachine:
serializedVersion: 6
@@ -22,33 +47,6 @@ AnimatorStateMachine:
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -1761221109508103449}
--- !u!1102 &-7908033645098541312
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Idle
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 3552691702041008167}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: ebc8e8e59d375104babccd596aa3bdc0, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &-7355565198356877363
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -96,6 +94,34 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-5661198802355905067
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 4
m_ConditionEvent: Speed
m_EventTreshold: 0.03
- m_ConditionMode: 4
m_ConditionEvent: Phase
m_EventTreshold: 3
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 1582555298472611487}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.1
m_TransitionOffset: 0
m_ExitTime: 0.9
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 0
--- !u!1102 &-5654511470593336247
AnimatorState:
serializedVersion: 6
@@ -107,7 +133,8 @@ AnimatorState:
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -4610620118332829913}
- {fileID: 7762382708247891322}
- {fileID: 5235194402694696982}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
@@ -132,12 +159,9 @@ AnimatorStateMachine:
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -7908033645098541312}
m_Position: {x: 30, y: 180, z: 0}
- serializedVersion: 1
m_State: {fileID: -4652545120162758660}
m_Position: {x: 290, y: 180, z: 0}
m_Position: {x: 480, y: 230, z: 0}
- serializedVersion: 1
m_State: {fileID: -2487449162152911812}
m_Position: {x: -220, y: 350, z: 0}
@@ -150,6 +174,12 @@ AnimatorStateMachine:
- serializedVersion: 1
m_State: {fileID: -5654511470593336247}
m_Position: {x: 30, y: 270, z: 0}
- serializedVersion: 1
m_State: {fileID: 1582555298472611487}
m_Position: {x: 240, y: 120, z: 0}
- serializedVersion: 1
m_State: {fileID: -498625244521711372}
m_Position: {x: 240, y: 320, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions:
- {fileID: -6146543620670552976}
@@ -161,7 +191,7 @@ AnimatorStateMachine:
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -7908033645098541312}
m_DefaultState: {fileID: 1582555298472611487}
--- !u!1102 &-4652545120162758660
AnimatorState:
serializedVersion: 6
@@ -173,7 +203,8 @@ AnimatorState:
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 8997152603305261974}
- {fileID: -5661198802355905067}
- {fileID: -4269009376538978435}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
@@ -183,34 +214,40 @@ AnimatorState:
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -1886843759694807048}
m_Motion: {fileID: 7400000, guid: 51c52bb037757304ca6faaf68c181bcd, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &-4610620118332829913
--- !u!1101 &-4269009376538978435
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions: []
m_Conditions:
- m_ConditionMode: 4
m_ConditionEvent: Speed
m_EventTreshold: 0.03
- m_ConditionMode: 6
m_ConditionEvent: Phase
m_EventTreshold: 3
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -7908033645098541312}
m_DstState: {fileID: -498625244521711372}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionDuration: 0.1
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 1
m_ExitTime: 0.9
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
m_CanTransitionToSelf: 0
--- !u!1102 &-2487449162152911812
AnimatorState:
serializedVersion: 6
@@ -237,45 +274,6 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!206 &-1886843759694807048
BlendTree:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Blend Tree
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: 4441030841997727119, guid: 005ddab128d7eb141b25099c0eb1ed39, type: 3}
m_Threshold: 0
m_Position: {x: 0, y: 0}
m_TimeScale: 1
m_CycleOffset: 0
m_DirectBlendParameter: Speed
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: 2571081563578608591, guid: e6a2aa1552aac6f46b40192ec605d57e, type: 3}
m_Threshold: 0.5
m_Position: {x: 0, y: 0}
m_TimeScale: 1
m_CycleOffset: 0
m_DirectBlendParameter: Speed
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: 1827226128182048838, guid: 60fb511bc6259b745b432aea6a222303, type: 3}
m_Threshold: 1
m_Position: {x: 0, y: 0}
m_TimeScale: 1
m_CycleOffset: 0
m_DirectBlendParameter: Speed
m_Mirror: 0
m_BlendParameter: Speed
m_BlendParameterY: Speed
m_MinThreshold: 0
m_MaxThreshold: 1
m_UseAutomaticThresholds: 1
m_NormalizedBlendValues: 0
m_BlendType: 0
--- !u!1102 &-1761221109508103449
AnimatorState:
serializedVersion: 6
@@ -302,6 +300,31 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &-1591912023002520841
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 3
m_ConditionEvent: Speed
m_EventTreshold: 0.01
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -4652545120162758660}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.9
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 0
--- !u!1101 &-1314145896434046212
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -327,13 +350,41 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &-498625244521711372
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Idle_Phase3
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -1591912023002520841}
- {fileID: 5829157465128090080}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 1654c779ca38159dab86a08864968bcc, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AC_Drog
m_Name: AC_Boss_Drog
serializedVersion: 5
m_AnimatorParameters:
- m_Name: Speed
@@ -384,6 +435,12 @@ AnimatorController:
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: Phase
m_Type: 3
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@@ -397,31 +454,35 @@ AnimatorController:
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: Override
m_StateMachine: {fileID: -8724618498758723359}
m_Mask: {fileID: 31900000, guid: d878cc26c0d6449d2ad2c0ed02c73eca, type: 2}
m_Motions:
- serializedVersion: 2
m_State: {fileID: 0}
m_Motion: {fileID: -1601098376034012026, guid: 86ec0c0d77d3fcd47b879e206e9b492c, type: 3}
- serializedVersion: 2
m_State: {fileID: -4652545120162758660}
m_Motion: {fileID: 691025228808474260, guid: f24af721b97fadb4ba0f82937853e9f7, type: 3}
- serializedVersion: 2
m_State: {fileID: -2487449162152911812}
m_Motion: {fileID: 8640942340808133859, guid: 235e9fb2014c3044ba826dd0e71987a4, type: 3}
- serializedVersion: 2
m_State: {fileID: -7908033645098541312}
m_Motion: {fileID: 9143937929783346939, guid: 92dc2765bff93f540a4433ac13713d72, type: 3}
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: 0
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1101 &3552691702041008167
--- !u!1102 &1582555298472611487
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Idle_Phase1
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -8931477014669629951}
- {fileID: 2459631991574308566}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 1
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: ebc8e8e59d375104babccd596aa3bdc0, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &2459631991574308566
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
@@ -429,23 +490,26 @@ AnimatorStateTransition:
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 3
- m_ConditionMode: 4
m_ConditionEvent: Speed
m_EventTreshold: 0.01
m_EventTreshold: 0.03
- m_ConditionMode: 6
m_ConditionEvent: Phase
m_EventTreshold: 3
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -4652545120162758660}
m_DstState: {fileID: -498625244521711372}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionDuration: 0.15
m_TransitionOffset: 0
m_ExitTime: 0.75
m_ExitTime: 0.9
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
m_CanTransitionToSelf: 0
--- !u!1102 &4717780193306342999
AnimatorState:
serializedVersion: 6
@@ -473,6 +537,59 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &5235194402694696982
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 6
m_ConditionEvent: Phase
m_EventTreshold: 3
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -498625244521711372}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 0
--- !u!1101 &5829157465128090080
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 4
m_ConditionEvent: Speed
m_EventTreshold: 0.03
- m_ConditionMode: 4
m_ConditionEvent: Phase
m_EventTreshold: 3
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 1582555298472611487}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.15
m_TransitionOffset: 0
m_ExitTime: 0.9
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 0
--- !u!1101 &7571880184799686224
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -495,6 +612,31 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &7762382708247891322
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 4
m_ConditionEvent: Phase
m_EventTreshold: 3
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 1582555298472611487}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 0
--- !u!1102 &8846385207969213533
AnimatorState:
serializedVersion: 6
@@ -522,28 +664,3 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &8997152603305261974
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 4
m_ConditionEvent: Speed
m_EventTreshold: 0.03
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -7908033645098541312}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.1
m_TransitionOffset: 0
m_ExitTime: 0.9977373
m_HasExitTime: 0
m_HasFixedDuration: 0
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1

View File

@@ -22,16 +22,16 @@ MonoBehaviour:
Skill: {fileID: 11400000, guid: ae7fc1b970b770680b95f69111f2b08a, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 0
Skill: {fileID: 11400000, guid: e666c41a932cdd478a62552e12c64801, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 1
Skill: {fileID: 0}
Duration: 0.1

View File

@@ -22,16 +22,23 @@ MonoBehaviour:
Skill: {fileID: 11400000, guid: 19675febf4943e06b87c83e7d8517e3c, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 0
Skill: {fileID: 11400000, guid: ff1a135feff0d1999892a94317128bcf, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 0
Skill: {fileID: 11400000, guid: ef31b6ee182b8ce4cb7a0abf35daa91e, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 2
cooldown: 2.5
minPhase: 1
skipJumpStepOnNoTarget: 0

View File

@@ -22,16 +22,16 @@ MonoBehaviour:
Skill: {fileID: 11400000, guid: d8008b7d595f832798f900b884fb6ac2, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 0
Skill: {fileID: 11400000, guid: a42c075b82a2b40b3b1c4540bea4bd03, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
cooldown: 3
minPhase: 1
skipJumpStepOnNoTarget: 0

View File

@@ -22,23 +22,16 @@ MonoBehaviour:
Skill: {fileID: 11400000, guid: 78fa18c15c0ea5248bc6966b4b2c4e04, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 0
Skill: {fileID: 11400000, guid: 03c4971dcffb2ea0eb36ac997ee2a1a0, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
- Type: 0
Skill: {fileID: 11400000, guid: fc435c80b8f1348f889910629f8eec51, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
cooldown: 3.25
minPhase: 1
skipJumpStepOnNoTarget: 0

View File

@@ -22,16 +22,16 @@ MonoBehaviour:
Skill: {fileID: 11400000, guid: a3d01db588247bc93861ea39572489f5, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 0
Skill: {fileID: 11400000, guid: 4d2a845524d535769b4e2583c6321ffe, type: 2}
Duration: 0
ChargeData:
requiredDamageRatio: 0
requiredDamageRatio: 0.1
telegraphAbnormality: {fileID: 0}
staggerDuration: 0
staggerDuration: 2
- Type: 1
Skill: {fileID: 0}
Duration: 0.1

View File

@@ -20,7 +20,6 @@ MonoBehaviour:
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 567a0c8cbb10eafa08807226645826e2, type: 2}
- {fileID: 7400000, guid: 94da51b9da4bad4129ba5e33e671db62, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1

View File

@@ -12,15 +12,15 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: "Data_Skill_Drog_\uCF64\uBCF4-\uAE30\uBCF8\uAE301_3"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uCF64\uBCF4-\uAE30\uBCF8\uAE301 2\uD0C0"
skillName: "\uCF64\uBCF4-\uAE30\uBCF8\uAE301 3"
description: "\uAE30\uBCF8\uAE30 \uCF64\uBCF41\uC758 \uD6C4\uC18D \uD0C0\uACA9\uC785\uB2C8\uB2E4."
icon: {fileID: 0}
skillRole: 1
activationType: 1
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 567a0c8cbb10eafa08807226645826e2, type: 2}
- {fileID: 7400000, guid: 94da51b9da4bad4129ba5e33e671db62, type: 2}
- {fileID: 7400000, guid: b948f6e859be42cf9ad570e16fd418f1, type: 2}
- {fileID: 7400000, guid: 2ca3044b7e7a3ff4eb8d3d6bf75f5e92, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1

View File

@@ -19,9 +19,9 @@ MonoBehaviour:
activationType: 1
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 8cfd11750543a4484bae82462b7c0351, type: 2}
- {fileID: 7400000, guid: b8206d6d914a86cd9a169763c82f273e, type: 2}
- {fileID: 7400000, guid: 16c44854334d767d3af2fd774b89a809, type: 2}
- {fileID: 7400000, guid: 6b11f2b53d826bba3ab9f8086a42de14, type: 2}
- {fileID: 7400000, guid: 156c90879bba0d7649e8b29224daa390, type: 2}
- {fileID: 7400000, guid: 6439cde8bc726bd1caad7d6e18a31416, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1

View File

@@ -19,7 +19,8 @@ MonoBehaviour:
activationType: 1
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 82cf3119cd7b56e3e9d579cac94fc09d, type: 2}
- {fileID: 7400000, guid: 606aec780e456217687074cbbf23a2c8, type: 2}
- {fileID: 7400000, guid: 1f04142b14e6fd1e9a98b8ac5f2297cc, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1

View File

@@ -19,7 +19,8 @@ MonoBehaviour:
activationType: 1
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 18b092b0aae73b9219db20623b0c3427, type: 2}
- {fileID: 7400000, guid: ead3ca0dff8c0a3468e3234269c4a62e, type: 2}
- {fileID: 7400000, guid: d13751966b5403386ab7a397454197e2, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
@@ -27,7 +28,7 @@ MonoBehaviour:
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
castTargetTrackingMode: 1
castTargetTrackingMode: 3
castTargetRotationSpeed: 12
castTargetStopDistance: 2.5
allowedWeaponTraits: 0

View File

@@ -19,7 +19,8 @@ MonoBehaviour:
activationType: 1
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 8f572193078ff9e229c1d39038620857, type: 2}
- {fileID: 7400000, guid: 3f077b889a0c441a8be8f51575b34f37, type: 2}
- {fileID: 7400000, guid: e63e8710eded48197ae534daf847bbb5, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
@@ -27,7 +28,7 @@ MonoBehaviour:
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
castTargetTrackingMode: 1
castTargetTrackingMode: 0
castTargetRotationSpeed: 12
castTargetStopDistance: 2.5
allowedWeaponTraits: 0

View File

@@ -1,65 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
m_Name: "Data_Skill_Drog_\uCF64\uBCF4-\uAE30\uBCF8\uAE303_3"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uCF64\uBCF4-\uAE30\uBCF8\uAE303 3\uD0C0"
description: "\uAE30\uBCF8\uAE30 \uCF64\uBCF43\uC758 \uBC1C\uCC28\uAE30 \uB9C8\uBB34\uB9AC\uC785\uB2C8\uB2E4."
icon: {fileID: 0}
skillRole: 1
activationType: 1
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 9678ad326a270e9aa9cb5ebf5fa00279, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1
jumpToTarget: 0
blockMovementWhileCasting: 1
blockJumpWhileCasting: 1
blockOtherSkillsWhileCasting: 1
castTargetTrackingMode: 1
castTargetRotationSpeed: 12
castTargetStopDistance: 2.5
allowedWeaponTraits: 0
cooldown: 0
manaCost: 0
maxGemSlotCount: 0
castStartEffects: []
triggeredEffects:
- triggerIndex: 0
effects:
- {fileID: 11400000, guid: 7061e70acfcf6971a8b451af29336e8a, type: 2}
isChanneling: 0
loopPhase:
enabled: 0
loopMode: 1
maxDuration: 3
tickInterval: 0.5
tickEffects: []
exitEffects: []
loopVfxPrefab: {fileID: 0}
loopVfxMountPath:
loopVfxLengthScale: 1
loopVfxWidthScale: 1
releasePhase:
enabled: 0
animationClips: []
startEffects: []
channelDuration: 3
channelTickInterval: 0.5
channelTickEffects: []
channelEndEffects: []
channelVfxPrefab: {fileID: 0}
channelVfxMountPath:
channelVfxLengthScale: 1
channelVfxWidthScale: 1

View File

@@ -19,7 +19,7 @@ MonoBehaviour:
activationType: 1
baseTypes: 1
animationClips:
- {fileID: 7400000, guid: 71c802f9bbefb10be81506bf40e18f19, type: 2}
- {fileID: 7400000, guid: b3cb0b329a21a7fcda3402b8e07e38b9, type: 2}
animationSpeed: 1
useRootMotion: 1
ignoreRootMotionY: 1

View File

@@ -0,0 +1,30 @@
%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_Drog_\uCF64\uBCF4-\uAE30\uBCF8\uAE302_3_0_\uB370\uBBF8\uC9C0"
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.DamageEffect
targetType: 1
targetTeam: 0
areaCenter: 0
areaShape: 1
targetLayers:
serializedVersion: 2
m_Bits: 4294967295
includeCasterInArea: 0
areaRadius: 3.6
fanOriginDistance: 1.35
fanRadius: 3.6
fanHalfAngle: 42
baseDamage: 20
damageType: 0
statScaling: 0.6
mitigationTier: 0

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: fc435c80b8f1348f889910629f8eec51
guid: edcd515b78fc1dc4795c27e85470865f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@@ -2212,17 +2212,6 @@ MonoBehaviour:
abnormalityManager: {fileID: 0}
navMeshAgent: {fileID: 5153439431748782209}
behaviorGraphAgent: {fileID: 0}
basicLoopMinCountAfterBigPattern: 2
signatureRequiredDamageRatio: 0.1
signatureTelegraphAbnormality: {fileID: 11400000, guid: fb1a782e44ff4dc19fd8b3c633360752, type: 2}
signatureSuccessStaggerDuration: 2
signatureFailureAbnormality: {fileID: 11400000, guid: bc74f1485ad140c28cc14b821e22c127, type: 2}
signatureFailureDamage: 40
signatureFailureKnockbackRadius: 8
signatureFailureDownRadius: 3
signatureFailureKnockbackSpeed: 12
signatureFailureKnockbackDuration: 0.35
signatureFailureDownDuration: 2
maxPatternPhase: 3
debugMode: 1
--- !u!114 &7544406269366897481

View File

@@ -43,6 +43,12 @@ public abstract partial class BossPatternActionBase : Action
private ChargeStepData activeChargeData;
private bool chargeTelegraphApplied;
/// <summary>
/// 현재 액션 인스턴스가 진행 중인 패턴 실행 상태를 이미 보유하고 있는지 여부입니다.
/// BT 재평가 중 재진입할 때 기존 실행을 이어가기 위한 가드로 사용합니다.
/// </summary>
protected bool HasActivePatternExecutionState => activePattern != null;
/// <summary>
/// 액션 시작 시 실제로 실행할 패턴과 대상을 결정합니다.
/// </summary>
@@ -56,6 +62,10 @@ public abstract partial class BossPatternActionBase : Action
protected override Status OnStart()
{
ResolveReferences();
if (ShouldPreserveExecutionState())
return Status.Running;
ClearRuntimeState();
if (!IsReady())
@@ -153,6 +163,9 @@ public abstract partial class BossPatternActionBase : Action
protected override void OnEnd()
{
if (ShouldPreserveExecutionState())
return;
ClearRuntimeState();
}
@@ -252,6 +265,10 @@ public abstract partial class BossPatternActionBase : Action
return Status.Failure;
}
runtimeState.SetCurrentPatternSkillBoundary(
startsFromIdle: IsFirstSkillStep(currentStepIndex),
returnsToIdle: IsLastSkillStep(currentStepIndex));
GameObject skillTarget = activeTarget;
if (step.Skill.JumpToTarget)
{
@@ -376,6 +393,7 @@ public abstract partial class BossPatternActionBase : Action
if (isChargeWaiting)
EndChargeWait(broken: false);
runtimeState?.SetCurrentPatternSkillBoundary(false, false);
activePattern = null;
activeTarget = null;
currentStepIndex = 0;
@@ -384,6 +402,50 @@ public abstract partial class BossPatternActionBase : Action
waitEndTime = 0f;
}
/// <summary>
/// BT 관찰자 재평가로 노드가 다시 시작될 때 현재 패턴 실행 상태를 유지해야 하는지 판단합니다.
/// </summary>
private bool ShouldPreserveExecutionState()
{
if (!IsReady() || activePattern == null || runtimeState == null || !runtimeState.IsExecutingPattern)
return false;
if (runtimeState.IsBehaviorSuppressed || bossEnemy.IsDead)
return false;
return true;
}
private bool IsFirstSkillStep(int stepIndex)
{
if (activePattern == null || activePattern.Steps == null)
return false;
for (int i = 0; i < activePattern.Steps.Count; i++)
{
PatternStep candidate = activePattern.Steps[i];
if (candidate != null && candidate.Type == PatternStepType.Skill && candidate.Skill != null)
return i == stepIndex;
}
return false;
}
private bool IsLastSkillStep(int stepIndex)
{
if (activePattern == null || activePattern.Steps == null)
return false;
for (int i = activePattern.Steps.Count - 1; i >= 0; i--)
{
PatternStep candidate = activePattern.Steps[i];
if (candidate != null && candidate.Type == PatternStepType.Skill && candidate.Skill != null)
return i == stepIndex;
}
return false;
}
private Status FinalizeResolvedPattern(BossPatternExecutionResult result)
{
runtimeState?.CompletePatternExecution(activePattern, result);

View File

@@ -0,0 +1,37 @@
using System;
using Colosseum.Enemy;
using Unity.Behavior;
using Unity.Properties;
using UnityEngine;
using Action = Unity.Behavior.Action;
/// <summary>
/// 마지막 대형/징벌 패턴 이후 기본 루프 누적 횟수를 증가시킵니다.
/// </summary>
[Serializable, GeneratePropertyBag]
[NodeDescription(
name: "Increment Basic Loop Count",
story: "기본 루프 누적 횟수를 [Count] ",
category: "Action",
id: "fd1dc402-c0d7-4cf7-a97f-79d999c36f8d")]
public partial class IncrementBasicLoopCountAction : Action
{
[SerializeReference]
[Tooltip("증가시킬 기본 루프 횟수")]
public BlackboardVariable<int> Count = new BlackboardVariable<int>(1);
protected override Status OnStart()
{
BossBehaviorRuntimeState runtimeState = GameObject.GetComponent<BossBehaviorRuntimeState>();
if (runtimeState == null)
return Status.Failure;
int appliedCount = Mathf.Max(0, Count?.Value ?? 0);
runtimeState.IncrementBasicLoopCount(appliedCount);
runtimeState.LogDebug(nameof(IncrementBasicLoopCountAction), $"기본 루프 누적 증가: +{appliedCount} => {runtimeState.BasicLoopCountSinceLastBigPattern}");
return Status.Success;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 76e508fdc9d7c8f7b9e370e453cee0fc

View File

@@ -0,0 +1,31 @@
using System;
using Colosseum.Enemy;
using Unity.Behavior;
using Unity.Properties;
using Action = Unity.Behavior.Action;
/// <summary>
/// 마지막 대형/징벌 패턴 이후 기본 루프 누적 횟수를 초기화합니다.
/// </summary>
[Serializable, GeneratePropertyBag]
[NodeDescription(
name: "Reset Basic Loop Count",
story: "기본 루프 누적 횟수 초기화",
category: "Action",
id: "0f7fc0e5-3c0d-4db6-a9aa-8e2e56f9b672")]
public partial class ResetBasicLoopCountAction : Action
{
protected override Status OnStart()
{
BossBehaviorRuntimeState runtimeState = GameObject.GetComponent<BossBehaviorRuntimeState>();
if (runtimeState == null)
return Status.Failure;
runtimeState.ResetBasicLoopCount();
runtimeState.LogDebug(nameof(ResetBasicLoopCountAction), "기본 루프 누적 초기화");
return Status.Success;
}
}

View File

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

View File

@@ -1,9 +1,7 @@
using System;
using Colosseum.Abnormalities;
using Colosseum.AI;
using Colosseum.Combat;
using Colosseum.Enemy;
using Colosseum.Player;
using Unity.Behavior;
@@ -14,7 +12,7 @@ using Action = Unity.Behavior.Action;
/// <summary>
/// 충전 차단에 실패하여 패턴이 완료되었을 때, 전체 플레이어에게 범위 효과를 적용합니다.
/// 런타임 상태에 저장된 시그니처 실패 수치를 읽어 범위 효과를 적용하는 BT 노드입니다.
/// 필요한 수치는 BT 노드 필드에서 직접 설정합니다.
/// </summary>
[Serializable, GeneratePropertyBag]
[NodeDescription(
@@ -24,30 +22,42 @@ using Action = Unity.Behavior.Action;
id: "c3d4e5f6-1111-2222-3333-777788889999")]
public partial class SignatureFailureEffectsAction : Action
{
private BossBehaviorRuntimeState runtimeState;
[SerializeReference]
public BlackboardVariable<float> FailureDamage = new BlackboardVariable<float>(40f);
[SerializeReference]
public BlackboardVariable<AbnormalityData> FailureAbnormality;
[SerializeReference]
public BlackboardVariable<float> KnockbackRadius = new BlackboardVariable<float>(8f);
[SerializeReference]
public BlackboardVariable<float> DownRadius = new BlackboardVariable<float>(3f);
[SerializeReference]
public BlackboardVariable<float> KnockbackSpeed = new BlackboardVariable<float>(12f);
[SerializeReference]
public BlackboardVariable<float> KnockbackDuration = new BlackboardVariable<float>(0.35f);
[SerializeReference]
public BlackboardVariable<float> DownDuration = new BlackboardVariable<float>(2f);
protected override Status OnStart()
{
runtimeState = GameObject.GetComponent<BossBehaviorRuntimeState>();
if (runtimeState == null)
{
Debug.LogWarning("[SignatureFailureEffects] BossBehaviorRuntimeState를 찾을 수 없습니다.");
return Status.Failure;
}
ApplyFailureEffects();
return Status.Success;
}
private void ApplyFailureEffects()
{
float failureDamage = runtimeState.SignatureFailureDamage;
AbnormalityData failureAbnormality = runtimeState.SignatureFailureAbnormality;
float knockbackRadius = runtimeState.SignatureFailureKnockbackRadius;
float downRadius = runtimeState.SignatureFailureDownRadius;
float knockbackSpeed = runtimeState.SignatureFailureKnockbackSpeed;
float knockbackDuration = runtimeState.SignatureFailureKnockbackDuration;
float downDuration = runtimeState.SignatureFailureDownDuration;
float failureDamage = Mathf.Max(0f, FailureDamage?.Value ?? 0f);
AbnormalityData failureAbnormality = FailureAbnormality?.Value;
float knockbackRadius = Mathf.Max(0f, KnockbackRadius?.Value ?? 0f);
float downRadius = Mathf.Max(0f, DownRadius?.Value ?? 0f);
float knockbackSpeed = Mathf.Max(0f, KnockbackSpeed?.Value ?? 0f);
float knockbackDuration = Mathf.Max(0f, KnockbackDuration?.Value ?? 0f);
float downDuration = Mathf.Max(0f, DownDuration?.Value ?? 0f);
PlayerNetworkController[] players = UnityEngine.Object.FindObjectsByType<PlayerNetworkController>(FindObjectsSortMode.None);
for (int i = 0; i < players.Length; i++)

View File

@@ -27,6 +27,7 @@ public partial class UsePatternAction : Action
new System.Collections.Generic.Dictionary<string, float>();
private SkillController skillController;
private BossBehaviorRuntimeState runtimeState;
private int currentStepIndex;
private float waitEndTime;
private bool isWaiting;
@@ -65,6 +66,9 @@ public partial class UsePatternAction : Action
return Status.Failure;
}
runtimeState = GameObject.GetComponent<BossBehaviorRuntimeState>();
runtimeState?.BeginPatternExecution(Pattern.Value);
currentStepIndex = 0;
isWaiting = false;
isSkillStepExecuting = false;
@@ -74,7 +78,7 @@ public partial class UsePatternAction : Action
protected override Status OnUpdate()
{
if (skillController == null)
return Status.Failure;
return FinalizePatternFailure(BossPatternExecutionResult.Cancelled);
if (isWaiting)
{
@@ -92,7 +96,7 @@ public partial class UsePatternAction : Action
isSkillStepExecuting = false;
if (skillController.LastExecutionResult != SkillExecutionResult.Completed)
return Status.Failure;
return FinalizePatternFailure(BossPatternExecutionResult.Cancelled);
}
else if (skillController.IsPlayingAnimation)
return Status.Running;
@@ -102,8 +106,7 @@ public partial class UsePatternAction : Action
if (currentStepIndex >= Pattern.Value.Steps.Count)
{
MarkPatternUsed(GameObject, Pattern.Value);
return Status.Success;
return FinalizePatternSuccess();
}
return ExecuteCurrentStep();
@@ -112,6 +115,7 @@ public partial class UsePatternAction : Action
protected override void OnEnd()
{
skillController = null;
runtimeState = null;
isSkillStepExecuting = false;
}
@@ -130,7 +134,7 @@ public partial class UsePatternAction : Action
if (step.Skill == null)
{
Debug.LogWarning($"[UsePatternAction] 스킬이 null입니다. (index {currentStepIndex})");
return Status.Failure;
return FinalizePatternFailure(BossPatternExecutionResult.Failed);
}
GameObject jumpTarget = null;
@@ -139,7 +143,7 @@ public partial class UsePatternAction : Action
jumpTarget = ResolveJumpTarget();
if (jumpTarget == null)
{
return Status.Failure;
return FinalizePatternFailure(BossPatternExecutionResult.Failed);
}
}
@@ -150,7 +154,7 @@ public partial class UsePatternAction : Action
if (!success)
{
Debug.LogWarning($"[UsePatternAction] 스킬 실행 실패: {step.Skill.SkillName} (index {currentStepIndex})");
return Status.Failure;
return FinalizePatternFailure(BossPatternExecutionResult.Failed);
}
isSkillStepExecuting = true;
@@ -222,6 +226,10 @@ public partial class UsePatternAction : Action
if (owner == null || pattern == null)
return false;
BossBehaviorRuntimeState context = owner.GetComponent<BossBehaviorRuntimeState>();
if (context != null)
return context.IsPatternReady(pattern);
string cooldownKey = BuildCooldownKey(owner, pattern);
if (!patternReadyTimes.TryGetValue(cooldownKey, out float readyTime))
return true;
@@ -237,6 +245,14 @@ public partial class UsePatternAction : Action
if (owner == null || pattern == null)
return;
BossBehaviorRuntimeState context = owner.GetComponent<BossBehaviorRuntimeState>();
if (context != null)
{
context.SetPatternCooldown(pattern);
context.CompletePatternExecution(pattern, BossPatternExecutionResult.Succeeded);
return;
}
string cooldownKey = BuildCooldownKey(owner, pattern);
patternReadyTimes[cooldownKey] = Time.time + pattern.Cooldown;
}
@@ -251,4 +267,25 @@ public partial class UsePatternAction : Action
BossBehaviorRuntimeState context = GameObject.GetComponent<BossBehaviorRuntimeState>();
context?.LogDebug(nameof(UsePatternAction), message);
}
private Status FinalizePatternSuccess()
{
if (runtimeState != null)
{
runtimeState.SetPatternCooldown(Pattern.Value);
runtimeState.CompletePatternExecution(Pattern.Value, BossPatternExecutionResult.Succeeded);
}
else
{
MarkPatternUsed(GameObject, Pattern.Value);
}
return Status.Success;
}
private Status FinalizePatternFailure(BossPatternExecutionResult result)
{
runtimeState?.CompletePatternExecution(Pattern.Value, result);
return Status.Failure;
}
}

View File

@@ -41,11 +41,6 @@ public partial class UsePatternByRoleAction : BossPatternActionBase
if (pattern == null)
return Status.Failure;
// 타겟 해석은 ResolveStepTarget에서 처리됩니다.
// 대형 패턴/징벌 패턴 후 기본 루프 강제 규칙이 유지되도록 모든 패턴 사용을 기록합니다.
BossBehaviorRuntimeState context = GameObject.GetComponent<BossBehaviorRuntimeState>();
context?.RegisterPatternUse(pattern);
// base.OnStart는 TryResolvePattern → ExecuteCurrentStep 호출
return base.OnStart();
}

View File

@@ -34,18 +34,22 @@ namespace Colosseum.AI.BehaviorActions.Actions
protected override Status OnStart()
{
if (HasActivePatternExecutionState)
return base.OnStart();
if (!TrySelectPattern(out selectedPattern))
return Status.Failure;
BossBehaviorRuntimeState context = GameObject.GetComponent<BossBehaviorRuntimeState>();
context?.RegisterPatternUse(selectedPattern);
context?.LogDebug(nameof(UseWeightedReadyPatternAction), $"가중치 패턴 선택 후 실행: {selectedPattern.PatternName}");
return base.OnStart();
}
protected override void OnEnd()
{
selectedPattern = null;
if (!HasActivePatternExecutionState)
selectedPattern = null;
base.OnEnd();
}

View File

@@ -12,7 +12,7 @@ namespace Colosseum.AI.BehaviorActions.Conditions
{
/// <summary>
/// 지정된 패턴이 현재 실행 가능한지 확인합니다.
/// 패턴의 특성 필드를 사용하여 grace period 등을 판단합니다.
/// BT에 명시된 추가 조건 외에, 페이즈/행동 억제/쿨다운만 판단합니다.
/// </summary>
public static bool IsPatternReady(GameObject gameObject, BossPatternData pattern)
{
@@ -29,9 +29,6 @@ namespace Colosseum.AI.BehaviorActions.Conditions
if (context.CurrentPatternPhase < pattern.MinPhase)
return false;
if (!context.IsPatternGracePeriodAllowed(pattern))
return false;
return context.IsPatternReady(pattern);
}
}

View File

@@ -1,6 +1,8 @@
using UnityEngine;
using System;
using System.Collections.Generic;
using UnityEngine;
using Colosseum.Abnormalities;
using Colosseum.Skills;
@@ -79,6 +81,12 @@ namespace Colosseum.AI
[CreateAssetMenu(fileName = "NewBossPattern", menuName = "Colosseum/Boss Pattern")]
public class BossPatternData : ScriptableObject
{
#if UNITY_EDITOR
private const string PatternAssetPrefix = "Data_Pattern_";
private const string SkillAssetPrefix = "Data_Skill_";
private const string SkillSearchFolder = "Assets/_Game/Data/Skills";
#endif
[Header("패턴 정보")]
[SerializeField] private string patternName;
@@ -123,5 +131,205 @@ namespace Colosseum.AI
/// Big 패턴인지 반환합니다 (grace period 대상).
/// </summary>
public bool IsBigPattern => category == PatternCategory.Big;
#if UNITY_EDITOR
/// <summary>
/// 패턴 자산 이름을 기준으로 시퀀스 스킬 스텝을 자동 동기화합니다.
/// Data_Pattern_{이름} 패턴은 Data_Skill_{이름}_{순번} 스킬들을 찾아 앞쪽 스킬 스텝 구간을 재구성합니다.
/// </summary>
private void OnValidate()
{
RefreshPatternStepsFromMatchingSkills();
}
/// <summary>
/// 매칭되는 시퀀스 스킬을 찾아 패턴 스텝에 반영합니다.
/// </summary>
public bool RefreshPatternStepsFromMatchingSkills()
{
if (!name.StartsWith(PatternAssetPrefix, StringComparison.Ordinal))
return false;
string patternKey = name.Substring(PatternAssetPrefix.Length);
if (string.IsNullOrEmpty(patternKey))
return false;
List<SkillData> matchingSkills = FindMatchingSkills(patternKey);
if (matchingSkills.Count == 0)
return false;
int insertionIndex = -1;
var preservedSteps = new List<PatternStep>(steps.Count);
for (int i = 0; i < steps.Count; i++)
{
PatternStep step = steps[i];
if (IsMatchingSkillStep(step, patternKey))
{
if (insertionIndex < 0)
insertionIndex = preservedSteps.Count;
continue;
}
preservedSteps.Add(step);
}
if (insertionIndex < 0)
insertionIndex = 0;
var rebuiltSteps = new List<PatternStep>(preservedSteps.Count + matchingSkills.Count);
for (int i = 0; i < insertionIndex; i++)
rebuiltSteps.Add(preservedSteps[i]);
for (int i = 0; i < matchingSkills.Count; i++)
{
rebuiltSteps.Add(new PatternStep
{
Type = PatternStepType.Skill,
Skill = matchingSkills[i],
Duration = 0f,
ChargeData = null,
});
}
for (int i = insertionIndex; i < preservedSteps.Count; i++)
rebuiltSteps.Add(preservedSteps[i]);
if (AreStepsEquivalent(steps, rebuiltSteps))
return false;
steps = rebuiltSteps;
UnityEditor.EditorUtility.SetDirty(this);
return true;
}
/// <summary>
/// 패턴 이름과 매칭되는 시퀀스 스킬 목록을 순번 기준으로 수집합니다.
/// </summary>
private static List<SkillData> FindMatchingSkills(string patternKey)
{
string[] guids = UnityEditor.AssetDatabase.FindAssets("t:SkillData", new[] { SkillSearchFolder });
var matchedSkills = new List<(SkillData skill, int order)>();
for (int i = 0; i < guids.Length; i++)
{
string path = UnityEditor.AssetDatabase.GUIDToAssetPath(guids[i]);
SkillData skill = UnityEditor.AssetDatabase.LoadAssetAtPath<SkillData>(path);
if (skill == null)
continue;
if (!TryGetMatchingSkillOrder(skill.name, patternKey, out int order))
continue;
matchedSkills.Add((skill, order));
}
matchedSkills.Sort((a, b) => a.order.CompareTo(b.order));
var orderedSkills = new List<SkillData>(matchedSkills.Count);
int previousOrder = int.MinValue;
for (int i = 0; i < matchedSkills.Count; i++)
{
if (matchedSkills[i].order == previousOrder)
continue;
orderedSkills.Add(matchedSkills[i].skill);
previousOrder = matchedSkills[i].order;
}
return orderedSkills;
}
/// <summary>
/// 지정한 스텝이 현재 패턴 이름에 대응하는 시퀀스 스킬 스텝인지 확인합니다.
/// </summary>
private static bool IsMatchingSkillStep(PatternStep step, string patternKey)
{
return step != null
&& step.Type == PatternStepType.Skill
&& step.Skill != null
&& TryGetMatchingSkillOrder(step.Skill.name, patternKey, out _);
}
/// <summary>
/// 스킬 자산 이름에서 패턴과 매칭되는 순번을 추출합니다.
/// </summary>
private static bool TryGetMatchingSkillOrder(string skillAssetName, string patternKey, out int order)
{
order = 0;
if (string.IsNullOrEmpty(skillAssetName) || string.IsNullOrEmpty(patternKey))
return false;
string prefix = $"{SkillAssetPrefix}{patternKey}_";
if (!skillAssetName.StartsWith(prefix, StringComparison.Ordinal))
return false;
string suffix = skillAssetName.Substring(prefix.Length);
return int.TryParse(suffix, out order);
}
/// <summary>
/// 현재 스텝 구성과 재구성 결과가 같은지 비교합니다.
/// </summary>
private static bool AreStepsEquivalent(IReadOnlyList<PatternStep> currentSteps, IReadOnlyList<PatternStep> rebuiltSteps)
{
if (ReferenceEquals(currentSteps, rebuiltSteps))
return true;
if (currentSteps == null || rebuiltSteps == null)
return false;
if (currentSteps.Count != rebuiltSteps.Count)
return false;
for (int i = 0; i < currentSteps.Count; i++)
{
PatternStep current = currentSteps[i];
PatternStep rebuilt = rebuiltSteps[i];
if (current == null || rebuilt == null)
{
if (current != rebuilt)
return false;
continue;
}
if (current.Type != rebuilt.Type)
return false;
if (current.Skill != rebuilt.Skill)
return false;
if (!Mathf.Approximately(current.Duration, rebuilt.Duration))
return false;
if (!AreChargeDataEquivalent(current.ChargeData, rebuilt.ChargeData))
return false;
}
return true;
}
/// <summary>
/// ChargeWait 보조 데이터를 비교합니다.
/// </summary>
private static bool AreChargeDataEquivalent(ChargeStepData current, ChargeStepData rebuilt)
{
if (ReferenceEquals(current, rebuilt))
return true;
if (current == null || rebuilt == null)
return false;
return Mathf.Approximately(current.RequiredDamageRatio, rebuilt.RequiredDamageRatio)
&& current.TelegraphAbnormality == rebuilt.TelegraphAbnormality
&& Mathf.Approximately(current.StaggerDuration, rebuilt.StaggerDuration);
}
#endif
}
}

View File

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

View File

@@ -0,0 +1,44 @@
using UnityEngine;
namespace Colosseum.Debugging
{
/// <summary>
/// 씬 뷰에서 캐릭터의 정면 방향을 화살표로 표시하는 Gizmo 유틸리티입니다.
/// </summary>
public static class FacingDirectionGizmoUtility
{
/// <summary>
/// 지정한 Transform의 정면 방향 화살표를 그립니다.
/// </summary>
public static void DrawFacingArrow(Transform targetTransform, Color color, float length = 1.6f, float headLength = 0.35f, float headWidth = 0.22f, float heightOffset = 0.1f, float shaftThickness = 0.08f)
{
if (targetTransform == null)
return;
Vector3 origin = targetTransform.position + Vector3.up * heightOffset;
Vector3 forward = targetTransform.forward.normalized;
if (forward.sqrMagnitude <= 0.0001f)
return;
Vector3 tip = origin + forward * length;
Vector3 right = targetTransform.right.normalized;
Vector3 up = targetTransform.up.normalized;
Vector3 headBase = tip - forward * headLength;
Vector3 rightOffset = right * shaftThickness;
Vector3 upOffset = up * shaftThickness;
Gizmos.color = color;
Gizmos.DrawLine(origin, tip);
Gizmos.DrawLine(origin + rightOffset, tip + rightOffset);
Gizmos.DrawLine(origin - rightOffset, tip - rightOffset);
Gizmos.DrawLine(origin + upOffset, tip + upOffset);
Gizmos.DrawLine(origin - upOffset, tip - upOffset);
Gizmos.DrawLine(tip, headBase + right * headWidth);
Gizmos.DrawLine(tip, headBase - right * headWidth);
Gizmos.DrawLine(tip, headBase + up * headWidth * 0.7f);
Gizmos.DrawLine(tip, headBase - up * headWidth * 0.7f);
Gizmos.DrawSphere(origin, shaftThickness * 0.55f);
Gizmos.DrawSphere(tip, shaftThickness * 0.65f);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 3481720c56d01e6dfa9327a4c386a1cd

View File

@@ -0,0 +1,364 @@
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;
/// <summary>
/// 두 AnimationClip의 경계 포즈를 샘플링해 브릿지용 AnimationClip을 생성합니다.
/// 독립 .anim 클립 기준으로 사용하며, 생성 후 수동 미세 조정을 권장합니다.
/// </summary>
public class AnimationBridgeClipGeneratorWindow : EditorWindow
{
private const string MenuPath = "Tools/Animation/Generate Bridge Clip";
private AnimationClip sourceClip;
private AnimationClip targetClip;
private int sourceEndTrimFrames;
private int targetStartTrimFrames;
private int bridgeDurationFrames = 4;
private string outputName = string.Empty;
private string outputDirectory = "Assets/_Game/Animations";
[MenuItem(MenuPath, false, 22)]
public static void ShowWindow()
{
AnimationClip[] selectedClips = Selection.GetFiltered<AnimationClip>(SelectionMode.Assets);
AnimationBridgeClipGeneratorWindow window = GetWindow<AnimationBridgeClipGeneratorWindow>("Bridge Clip");
window.minSize = new Vector2(380f, 280f);
window.InitializeFromSelection(selectedClips);
window.Show();
}
private void InitializeFromSelection(AnimationClip[] selectedClips)
{
if (selectedClips == null || selectedClips.Length < 2)
return;
sourceClip = selectedClips[0];
targetClip = selectedClips[1];
string sourcePath = AssetDatabase.GetAssetPath(sourceClip);
if (!string.IsNullOrEmpty(sourcePath))
outputDirectory = Path.GetDirectoryName(sourcePath)?.Replace("\\", "/") ?? outputDirectory;
RefreshOutputName();
}
private void OnGUI()
{
EditorGUILayout.Space(8f);
EditorGUILayout.LabelField("브릿지 클립 생성", EditorStyles.boldLabel);
EditorGUILayout.HelpBox(
"앞 클립의 끝 포즈와 뒤 클립의 시작 포즈를 샘플링해 짧은 브릿지 클립을 생성합니다.\n" +
"Humanoid 클립은 생성 후 수동 미세 조정을 권장합니다.",
MessageType.Info);
EditorGUI.BeginChangeCheck();
sourceClip = (AnimationClip)EditorGUILayout.ObjectField("앞 클립", sourceClip, typeof(AnimationClip), false);
targetClip = (AnimationClip)EditorGUILayout.ObjectField("뒤 클립", targetClip, typeof(AnimationClip), false);
if (EditorGUI.EndChangeCheck())
RefreshOutputName();
using (new EditorGUI.DisabledScope(sourceClip == null))
{
sourceEndTrimFrames = Mathf.Max(0, EditorGUILayout.IntField("앞 클립 끝에서 제외 프레임", sourceEndTrimFrames));
}
using (new EditorGUI.DisabledScope(targetClip == null))
{
targetStartTrimFrames = Mathf.Max(0, EditorGUILayout.IntField("뒤 클립 시작에서 제외 프레임", targetStartTrimFrames));
}
bridgeDurationFrames = Mathf.Max(1, EditorGUILayout.IntField("브릿지 길이(프레임)", bridgeDurationFrames));
outputName = EditorGUILayout.TextField("출력 이름", outputName);
outputDirectory = EditorGUILayout.TextField("출력 폴더", outputDirectory);
EditorGUILayout.Space(8f);
if (sourceClip != null)
DrawClipSummary("앞 클립 샘플", sourceClip, sourceEndTrimFrames, useEndSample: true);
if (targetClip != null)
DrawClipSummary("뒤 클립 샘플", targetClip, targetStartTrimFrames, useEndSample: false);
EditorGUILayout.Space(12f);
using (new EditorGUI.DisabledScope(!CanGenerate()))
{
if (GUILayout.Button("브릿지 클립 생성", GUILayout.Height(32f)))
GenerateBridgeClip();
}
}
private void DrawClipSummary(string label, AnimationClip clip, int trimFrames, bool useEndSample)
{
float sampleTime = GetSampleTime(clip, trimFrames, useEndSample);
int totalFrames = Mathf.RoundToInt(clip.length * clip.frameRate);
int sampleFrame = Mathf.RoundToInt(sampleTime * clip.frameRate);
EditorGUILayout.LabelField(label, EditorStyles.boldLabel);
EditorGUILayout.LabelField(
$" {clip.name} / {clip.frameRate:F0} FPS / {clip.length:F3}초 / {totalFrames}프레임");
EditorGUILayout.LabelField($" 샘플 프레임: {sampleFrame} / 샘플 시간: {sampleTime:F3}초");
}
private bool CanGenerate()
{
if (sourceClip == null || targetClip == null)
return false;
if (string.IsNullOrWhiteSpace(outputName) || string.IsNullOrWhiteSpace(outputDirectory))
return false;
return AssetDatabase.IsValidFolder(outputDirectory);
}
private void RefreshOutputName()
{
if (sourceClip == null || targetClip == null)
return;
outputName = $"{sourceClip.name}_to_{targetClip.name}_Bridge";
}
private void GenerateBridgeClip()
{
float frameRate = sourceClip != null ? sourceClip.frameRate : 30f;
float duration = bridgeDurationFrames / frameRate;
float sourceSampleTime = GetSampleTime(sourceClip, sourceEndTrimFrames, useEndSample: true);
float targetSampleTime = GetSampleTime(targetClip, targetStartTrimFrames, useEndSample: false);
AnimationClip bridgeClip = new AnimationClip
{
name = outputName,
frameRate = frameRate,
legacy = sourceClip.legacy,
wrapMode = WrapMode.Once,
localBounds = sourceClip.localBounds
};
HashSet<EditorCurveBinding> floatBindings = new HashSet<EditorCurveBinding>(new EditorCurveBindingComparer());
AddCurveBindings(floatBindings, AnimationUtility.GetCurveBindings(sourceClip));
AddCurveBindings(floatBindings, AnimationUtility.GetCurveBindings(targetClip));
foreach (EditorCurveBinding binding in floatBindings)
{
AnimationCurve sourceCurve = AnimationUtility.GetEditorCurve(sourceClip, binding);
AnimationCurve targetCurve = AnimationUtility.GetEditorCurve(targetClip, binding);
if (sourceCurve == null && targetCurve == null)
continue;
float startValue = EvaluateCurveOrDefault(sourceCurve, sourceSampleTime);
float endValue = EvaluateCurveOrDefault(targetCurve, targetSampleTime);
AnimationCurve bridgeCurve = CreateBridgeCurve(startValue, endValue, duration);
AnimationUtility.SetEditorCurve(bridgeClip, binding, bridgeCurve);
}
HashSet<EditorCurveBinding> objectBindings = new HashSet<EditorCurveBinding>(new EditorCurveBindingComparer());
AddCurveBindings(objectBindings, AnimationUtility.GetObjectReferenceCurveBindings(sourceClip));
AddCurveBindings(objectBindings, AnimationUtility.GetObjectReferenceCurveBindings(targetClip));
foreach (EditorCurveBinding binding in objectBindings)
{
ObjectReferenceKeyframe[] sourceKeys = AnimationUtility.GetObjectReferenceCurve(sourceClip, binding);
ObjectReferenceKeyframe[] targetKeys = AnimationUtility.GetObjectReferenceCurve(targetClip, binding);
Object startValue = SampleObjectReferenceValue(sourceKeys, sourceSampleTime);
Object endValue = SampleObjectReferenceValue(targetKeys, targetSampleTime);
if (startValue == null && endValue == null)
continue;
ObjectReferenceKeyframe[] bridgeKeys = CreateBridgeObjectCurve(startValue, endValue, duration);
AnimationUtility.SetObjectReferenceCurve(bridgeClip, binding, bridgeKeys);
}
string savePath = AssetDatabase.GenerateUniqueAssetPath(
Path.Combine(outputDirectory, outputName + ".anim").Replace("\\", "/"));
AssetDatabase.CreateAsset(bridgeClip, savePath);
CopyClipSettings(sourceClip, bridgeClip, duration);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.FocusProjectWindow();
Selection.activeObject = bridgeClip;
Debug.Log(
$"[AnimationBridgeClipGenerator] 브릿지 생성 완료: {sourceClip.name} -> {targetClip.name} " +
$"(앞-{sourceEndTrimFrames}f / 뒤+{targetStartTrimFrames}f / 길이 {bridgeDurationFrames}f) => {savePath}");
}
private static void AddCurveBindings(HashSet<EditorCurveBinding> destination, EditorCurveBinding[] bindings)
{
if (bindings == null)
return;
for (int i = 0; i < bindings.Length; i++)
destination.Add(bindings[i]);
}
private static float GetSampleTime(AnimationClip clip, int trimFrames, bool useEndSample)
{
if (clip == null)
return 0f;
float frameRate = Mathf.Max(1f, clip.frameRate);
int totalFrames = Mathf.Max(0, Mathf.RoundToInt(clip.length * frameRate));
int clampedTrim = Mathf.Clamp(trimFrames, 0, totalFrames);
int sampleFrame = useEndSample
? Mathf.Max(0, totalFrames - clampedTrim)
: clampedTrim;
float sampleTime = sampleFrame / frameRate;
return Mathf.Clamp(sampleTime, 0f, clip.length);
}
private static float EvaluateCurveOrDefault(AnimationCurve curve, float time)
{
return curve != null ? curve.Evaluate(time) : 0f;
}
private static AnimationCurve CreateBridgeCurve(float startValue, float endValue, float duration)
{
AnimationCurve curve = new AnimationCurve(
new Keyframe(0f, startValue),
new Keyframe(duration, endValue));
for (int i = 0; i < curve.keys.Length; i++)
{
AnimationUtility.SetKeyLeftTangentMode(curve, i, AnimationUtility.TangentMode.ClampedAuto);
AnimationUtility.SetKeyRightTangentMode(curve, i, AnimationUtility.TangentMode.ClampedAuto);
}
return curve;
}
private static Object SampleObjectReferenceValue(ObjectReferenceKeyframe[] keys, float time)
{
if (keys == null || keys.Length == 0)
return null;
Object value = keys[0].value;
for (int i = 0; i < keys.Length; i++)
{
if (keys[i].time > time)
break;
value = keys[i].value;
}
return value;
}
private static ObjectReferenceKeyframe[] CreateBridgeObjectCurve(Object startValue, Object endValue, float duration)
{
return new[]
{
new ObjectReferenceKeyframe { time = 0f, value = startValue },
new ObjectReferenceKeyframe { time = duration, value = endValue }
};
}
/// <summary>
/// 원본 클립의 루프/미러/루트 모션 설정을 유지합니다.
/// </summary>
private static void CopyClipSettings(AnimationClip source, AnimationClip target, float duration)
{
if (source == null || target == null)
return;
SerializedObject sourceSerializedObject = new SerializedObject(source);
SerializedObject targetSerializedObject = new SerializedObject(target);
SerializedProperty sourceSettings = sourceSerializedObject.FindProperty("m_AnimationClipSettings");
SerializedProperty targetSettings = targetSerializedObject.FindProperty("m_AnimationClipSettings");
if (sourceSettings == null || targetSettings == null)
return;
string[] relativePropertyNames =
{
"m_AdditiveReferencePoseClip",
"m_AdditiveReferencePoseTime",
"m_OrientationOffsetY",
"m_Level",
"m_CycleOffset",
"m_HasAdditiveReferencePose",
"m_LoopTime",
"m_LoopBlend",
"m_LoopBlendOrientation",
"m_LoopBlendPositionY",
"m_LoopBlendPositionXZ",
"m_KeepOriginalOrientation",
"m_KeepOriginalPositionY",
"m_KeepOriginalPositionXZ",
"m_HeightFromFeet",
"m_Mirror"
};
for (int i = 0; i < relativePropertyNames.Length; i++)
{
SerializedProperty sourceProperty = sourceSettings.FindPropertyRelative(relativePropertyNames[i]);
SerializedProperty targetProperty = targetSettings.FindPropertyRelative(relativePropertyNames[i]);
if (sourceProperty == null || targetProperty == null)
continue;
CopySerializedPropertyValue(sourceProperty, targetProperty);
}
SerializedProperty startTimeProperty = targetSettings.FindPropertyRelative("m_StartTime");
if (startTimeProperty != null)
startTimeProperty.floatValue = 0f;
SerializedProperty stopTimeProperty = targetSettings.FindPropertyRelative("m_StopTime");
if (stopTimeProperty != null)
stopTimeProperty.floatValue = Mathf.Max(0f, duration);
targetSerializedObject.ApplyModifiedPropertiesWithoutUndo();
}
private static void CopySerializedPropertyValue(SerializedProperty source, SerializedProperty target)
{
switch (source.propertyType)
{
case SerializedPropertyType.Integer:
target.intValue = source.intValue;
break;
case SerializedPropertyType.Boolean:
target.boolValue = source.boolValue;
break;
case SerializedPropertyType.Float:
target.floatValue = source.floatValue;
break;
case SerializedPropertyType.ObjectReference:
target.objectReferenceValue = source.objectReferenceValue;
break;
}
}
private sealed class EditorCurveBindingComparer : IEqualityComparer<EditorCurveBinding>
{
public bool Equals(EditorCurveBinding x, EditorCurveBinding y)
{
return x.path == y.path
&& x.propertyName == y.propertyName
&& x.type == y.type
&& x.isPPtrCurve == y.isPPtrCurve;
}
public int GetHashCode(EditorCurveBinding obj)
{
unchecked
{
int hash = 17;
hash = (hash * 31) + (obj.path != null ? obj.path.GetHashCode() : 0);
hash = (hash * 31) + (obj.propertyName != null ? obj.propertyName.GetHashCode() : 0);
hash = (hash * 31) + (obj.type != null ? obj.type.GetHashCode() : 0);
hash = (hash * 31) + obj.isPPtrCurve.GetHashCode();
return hash;
}
}
}
}

View File

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

View File

@@ -0,0 +1,165 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
/// <summary>
/// 선택한 .anim 클립의 마지막 프레임에 모든 커브 키를 보강합니다.
/// 애니메이션을 잘라서 연결할 때 마지막 포즈가 정확히 유지되도록 돕는 도구입니다.
/// </summary>
public static class AnimationClipEndKeyBaker
{
private const string MenuPath = "Tools/Animation/Bake End Frame Keys";
[MenuItem(MenuPath, false, 23)]
public static void BakeSelectedClipEndKeys()
{
AnimationClip[] clips = Selection.GetFiltered<AnimationClip>(SelectionMode.Assets);
if (clips == null || clips.Length == 0)
{
EditorUtility.DisplayDialog(
"Bake End Frame Keys",
"마지막 프레임 키를 보강할 AnimationClip을 1개 이상 선택해 주세요.",
"확인");
return;
}
int processedClipCount = 0;
int addedFloatKeyCount = 0;
int addedObjectKeyCount = 0;
List<string> skippedClips = new List<string>();
for (int i = 0; i < clips.Length; i++)
{
AnimationClip clip = clips[i];
string clipPath = AssetDatabase.GetAssetPath(clip);
if (clip == null || string.IsNullOrEmpty(clipPath) || !clipPath.EndsWith(".anim"))
{
skippedClips.Add(clip != null ? clip.name : "(null)");
continue;
}
processedClipCount++;
float lastFrameTime = clip.length;
EditorCurveBinding[] floatBindings = AnimationUtility.GetCurveBindings(clip);
for (int bindingIndex = 0; bindingIndex < floatBindings.Length; bindingIndex++)
{
EditorCurveBinding binding = floatBindings[bindingIndex];
AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding);
if (curve == null)
continue;
if (HasFloatKeyAtTime(curve, lastFrameTime))
continue;
float value = curve.Evaluate(lastFrameTime);
int keyIndex = curve.AddKey(new Keyframe(lastFrameTime, value));
if (keyIndex >= 0)
{
AnimationUtility.SetKeyLeftTangentMode(curve, keyIndex, AnimationUtility.TangentMode.ClampedAuto);
AnimationUtility.SetKeyRightTangentMode(curve, keyIndex, AnimationUtility.TangentMode.ClampedAuto);
}
AnimationUtility.SetEditorCurve(clip, binding, curve);
addedFloatKeyCount++;
}
EditorCurveBinding[] objectBindings = AnimationUtility.GetObjectReferenceCurveBindings(clip);
for (int bindingIndex = 0; bindingIndex < objectBindings.Length; bindingIndex++)
{
EditorCurveBinding binding = objectBindings[bindingIndex];
ObjectReferenceKeyframe[] keys = AnimationUtility.GetObjectReferenceCurve(clip, binding);
if (keys == null || keys.Length == 0)
continue;
if (HasObjectKeyAtTime(keys, lastFrameTime))
continue;
Object sampledValue = SampleObjectReferenceValue(keys, lastFrameTime);
List<ObjectReferenceKeyframe> bakedKeys = new List<ObjectReferenceKeyframe>(keys)
{
new ObjectReferenceKeyframe
{
time = lastFrameTime,
value = sampledValue
}
};
bakedKeys.Sort((a, b) => a.time.CompareTo(b.time));
AnimationUtility.SetObjectReferenceCurve(clip, binding, bakedKeys.ToArray());
addedObjectKeyCount++;
}
EditorUtility.SetDirty(clip);
AssetDatabase.ImportAsset(clipPath, ImportAssetOptions.ForceUpdate);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
string message =
$"처리한 클립: {processedClipCount}개\n" +
$"추가한 Float 키: {addedFloatKeyCount}개\n" +
$"추가한 Object 키: {addedObjectKeyCount}개";
if (skippedClips.Count > 0)
message += $"\n\n건너뛴 클립: {string.Join(", ", skippedClips)}";
Debug.Log($"[AnimationClipEndKeyBaker] {message.Replace('\n', ' ')}");
EditorUtility.DisplayDialog("Bake End Frame Keys", message, "확인");
}
[MenuItem(MenuPath, true)]
public static bool ValidateBakeSelectedClipEndKeys()
{
return Selection.GetFiltered<AnimationClip>(SelectionMode.Assets).Length > 0;
}
private static bool HasFloatKeyAtTime(AnimationCurve curve, float time)
{
if (curve == null)
return false;
Keyframe[] keys = curve.keys;
for (int i = 0; i < keys.Length; i++)
{
if (Mathf.Abs(keys[i].time - time) <= 0.0001f)
return true;
}
return false;
}
private static bool HasObjectKeyAtTime(ObjectReferenceKeyframe[] keys, float time)
{
if (keys == null)
return false;
for (int i = 0; i < keys.Length; i++)
{
if (Mathf.Abs(keys[i].time - time) <= 0.0001f)
return true;
}
return false;
}
private static Object SampleObjectReferenceValue(ObjectReferenceKeyframe[] keys, float time)
{
if (keys == null || keys.Length == 0)
return null;
Object value = keys[0].value;
for (int i = 0; i < keys.Length; i++)
{
if (keys[i].time > time)
break;
value = keys[i].value;
}
return value;
}
}

View File

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

View File

@@ -158,7 +158,7 @@ public class AnimationClipTrimmerWindow : EditorWindow
continue;
AnimationCurve trimmedCurve = TrimCurve(sourceCurve, startTime, endTime);
if (trimmedCurve.keys.Length > 0)
if (trimmedCurve != null && trimmedCurve.keys.Length > 0)
{
trimmedClip.SetCurve(binding.path, binding.type, binding.propertyName, trimmedCurve);
}
@@ -191,8 +191,21 @@ public class AnimationClipTrimmerWindow : EditorWindow
AnimationUtility.SetAnimationEvents(trimmedClip, trimmedEvents.ToArray());
}
// Object reference 커브도 함께 복사해 VFX/소품 전환이 유지되도록 합니다.
EditorCurveBinding[] objectBindings = AnimationUtility.GetObjectReferenceCurveBindings(sourceClip);
foreach (EditorCurveBinding binding in objectBindings)
{
ObjectReferenceKeyframe[] sourceKeys = AnimationUtility.GetObjectReferenceCurve(sourceClip, binding);
ObjectReferenceKeyframe[] trimmedKeys = TrimObjectReferenceCurve(sourceKeys, startTime, endTime);
if (trimmedKeys != null && trimmedKeys.Length > 0)
{
AnimationUtility.SetObjectReferenceCurve(trimmedClip, binding, trimmedKeys);
}
}
// 저장
AssetDatabase.CreateAsset(trimmedClip, savePath);
CopyClipSettings(sourceClip, trimmedClip, endTime - startTime);
AssetDatabase.SaveAssets();
EditorUtility.FocusProjectWindow();
@@ -210,8 +223,12 @@ public class AnimationClipTrimmerWindow : EditorWindow
/// </summary>
private static AnimationCurve TrimCurve(AnimationCurve curve, float startTime, float endTime)
{
if (curve == null || endTime < startTime)
return null;
Keyframe[] sourceKeys = curve.keys;
List<Keyframe> trimmedKeys = new List<Keyframe>();
float duration = endTime - startTime;
foreach (Keyframe key in sourceKeys)
{
@@ -226,8 +243,50 @@ public class AnimationClipTrimmerWindow : EditorWindow
}
}
// 선택 구간에 기존 키가 없더라도 경계 값을 샘플링해 고정 구간을 유지합니다.
if (trimmedKeys.Count == 0)
return null;
{
float startValue = curve.Evaluate(startTime);
float endValue = curve.Evaluate(endTime);
trimmedKeys.Add(new Keyframe(0f, startValue));
if (duration > Mathf.Epsilon)
trimmedKeys.Add(new Keyframe(duration, endValue));
}
else
{
float startValue = curve.Evaluate(startTime);
float endValue = curve.Evaluate(endTime);
if (!Mathf.Approximately(trimmedKeys[0].time, 0f))
{
trimmedKeys.Insert(0, new Keyframe(0f, startValue));
}
else
{
Keyframe firstKey = trimmedKeys[0];
firstKey.time = 0f;
firstKey.value = startValue;
trimmedKeys[0] = firstKey;
}
if (duration > Mathf.Epsilon)
{
int lastIndex = trimmedKeys.Count - 1;
if (!Mathf.Approximately(trimmedKeys[lastIndex].time, duration))
{
trimmedKeys.Add(new Keyframe(duration, endValue));
}
else
{
Keyframe lastKey = trimmedKeys[lastIndex];
lastKey.time = duration;
lastKey.value = endValue;
trimmedKeys[lastIndex] = lastKey;
}
}
}
return new AnimationCurve(trimmedKeys.ToArray())
{
@@ -235,4 +294,150 @@ public class AnimationClipTrimmerWindow : EditorWindow
postWrapMode = curve.postWrapMode
};
}
/// <summary>
/// Object reference 커브에서 선택 구간만 잘라내고 시간을 0부터 다시 시작합니다.
/// </summary>
private static ObjectReferenceKeyframe[] TrimObjectReferenceCurve(
ObjectReferenceKeyframe[] sourceKeys,
float startTime,
float endTime)
{
if (sourceKeys == null || sourceKeys.Length == 0 || endTime < startTime)
return null;
List<ObjectReferenceKeyframe> trimmedKeys = new List<ObjectReferenceKeyframe>();
float duration = endTime - startTime;
for (int i = 0; i < sourceKeys.Length; i++)
{
ObjectReferenceKeyframe key = sourceKeys[i];
if (key.time >= startTime && key.time <= endTime)
{
trimmedKeys.Add(new ObjectReferenceKeyframe
{
time = key.time - startTime,
value = key.value
});
}
}
if (trimmedKeys.Count == 0)
{
ObjectReferenceKeyframe sampledKey = sourceKeys[0];
for (int i = sourceKeys.Length - 1; i >= 0; i--)
{
if (sourceKeys[i].time <= startTime)
{
sampledKey = sourceKeys[i];
break;
}
}
trimmedKeys.Add(new ObjectReferenceKeyframe
{
time = 0f,
value = sampledKey.value
});
}
if (!Mathf.Approximately(trimmedKeys[0].time, 0f))
{
trimmedKeys.Insert(0, new ObjectReferenceKeyframe
{
time = 0f,
value = trimmedKeys[0].value
});
}
int lastIndex = trimmedKeys.Count - 1;
if (duration > Mathf.Epsilon && !Mathf.Approximately(trimmedKeys[lastIndex].time, duration))
{
trimmedKeys.Add(new ObjectReferenceKeyframe
{
time = duration,
value = trimmedKeys[lastIndex].value
});
}
return trimmedKeys.ToArray();
}
/// <summary>
/// 원본 클립의 루트 모션/루프/미러 설정을 새 클립에 유지합니다.
/// </summary>
private static void CopyClipSettings(AnimationClip source, AnimationClip target, float duration)
{
if (source == null || target == null)
return;
SerializedObject sourceSerializedObject = new SerializedObject(source);
SerializedObject targetSerializedObject = new SerializedObject(target);
SerializedProperty sourceSettings = sourceSerializedObject.FindProperty("m_AnimationClipSettings");
SerializedProperty targetSettings = targetSerializedObject.FindProperty("m_AnimationClipSettings");
if (sourceSettings == null || targetSettings == null)
return;
string[] relativePropertyNames =
{
"m_AdditiveReferencePoseClip",
"m_AdditiveReferencePoseTime",
"m_OrientationOffsetY",
"m_Level",
"m_CycleOffset",
"m_HasAdditiveReferencePose",
"m_LoopTime",
"m_LoopBlend",
"m_LoopBlendOrientation",
"m_LoopBlendPositionY",
"m_LoopBlendPositionXZ",
"m_KeepOriginalOrientation",
"m_KeepOriginalPositionY",
"m_KeepOriginalPositionXZ",
"m_HeightFromFeet",
"m_Mirror"
};
for (int i = 0; i < relativePropertyNames.Length; i++)
{
SerializedProperty sourceProperty = sourceSettings.FindPropertyRelative(relativePropertyNames[i]);
SerializedProperty targetProperty = targetSettings.FindPropertyRelative(relativePropertyNames[i]);
if (sourceProperty == null || targetProperty == null)
continue;
CopySerializedPropertyValue(sourceProperty, targetProperty);
}
SerializedProperty startTimeProperty = targetSettings.FindPropertyRelative("m_StartTime");
if (startTimeProperty != null)
startTimeProperty.floatValue = 0f;
SerializedProperty stopTimeProperty = targetSettings.FindPropertyRelative("m_StopTime");
if (stopTimeProperty != null)
stopTimeProperty.floatValue = Mathf.Max(0f, duration);
targetSerializedObject.ApplyModifiedPropertiesWithoutUndo();
}
private static void CopySerializedPropertyValue(SerializedProperty source, SerializedProperty target)
{
switch (source.propertyType)
{
case SerializedPropertyType.Integer:
target.intValue = source.intValue;
break;
case SerializedPropertyType.Boolean:
target.boolValue = source.boolValue;
break;
case SerializedPropertyType.Float:
target.floatValue = source.floatValue;
break;
case SerializedPropertyType.ObjectReference:
target.objectReferenceValue = source.objectReferenceValue;
break;
default:
break;
}
}
}

View File

@@ -7,6 +7,7 @@ using System.Reflection;
using Colosseum.AI;
using Colosseum.AI.BehaviorActions.Actions;
using Colosseum.AI.BehaviorActions.Conditions;
using Colosseum.Abnormalities;
using Colosseum.Enemy;
using Colosseum.Skills;
@@ -33,6 +34,7 @@ namespace Colosseum.Editor
private const string DefaultPressurePatternPath = "Assets/_Game/Data/Patterns/Data_Pattern_Drog_콤보-발구르기.asset";
private const string DefaultUtilityPatternPath = "Assets/_Game/Data/Patterns/Data_Pattern_Drog_투척.asset";
private const string DefaultPhase3TransitionSkillPath = "Assets/_Game/Data/Skills/Data_Skill_Drog_포효.asset";
private const string DefaultSignatureFailureAbnormalityPath = "Assets/_Game/Data/Abnormalities/Data_Abnormality_Player_집행자의낙인.asset";
private const float DefaultDownedTargetSearchRadius = 6f;
private const float DefaultLeapTargetMinDistance = 8f;
@@ -45,11 +47,18 @@ namespace Colosseum.Editor
private const float DefaultGroundShakeInterval = 12f;
private const float DefaultPhase2EnterHealthPercent = 75f;
private const float DefaultPhase3EnterHealthPercent = 40f;
private const int DefaultBasicLoopRequirementBeforeBigPattern = 2;
private const float DefaultComboPatternWeight = 26f;
private const float DefaultPressurePatternWeight = 24f;
private const float DefaultPrimaryPatternWeight = 22f;
private const float DefaultSecondaryPatternWeight = 16f;
private const float DefaultTertiaryPatternWeight = 12f;
private const float DefaultSignatureFailureDamage = 40f;
private const float DefaultSignatureFailureKnockbackRadius = 8f;
private const float DefaultSignatureFailureDownRadius = 3f;
private const float DefaultSignatureFailureKnockbackSpeed = 12f;
private const float DefaultSignatureFailureKnockbackDuration = 0.35f;
private const float DefaultSignatureFailureDownDuration = 2f;
[MenuItem("Tools/Colosseum/Rebuild Drog Behavior Authoring Graph")]
private static void Rebuild()
@@ -243,6 +252,7 @@ namespace Colosseum.Editor
BossPatternData pressurePattern = LoadRequiredAsset<BossPatternData>(DefaultPressurePatternPath, "콤보-발구르기 패턴");
BossPatternData utilityPattern = LoadRequiredAsset<BossPatternData>(DefaultUtilityPatternPath, "투척 패턴");
SkillData phase3TransitionSkill = LoadRequiredAsset<SkillData>(DefaultPhase3TransitionSkillPath, "포효 스킬");
AbnormalityData signatureFailureAbnormality = LoadRequiredAsset<AbnormalityData>(DefaultSignatureFailureAbnormalityPath, "집행 실패 디버프");
if (punishPattern == null
|| signaturePattern == null
@@ -315,6 +325,7 @@ namespace Colosseum.Editor
object phase3RefreshNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(RefreshPrimaryTargetAction), new Vector2(actionX4, startY + stepY));
SetNodeFieldValue(phase3RefreshNode, "SearchRange", DefaultTargetSearchRange, setFieldValueMethod);
object phase3ValidateNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(actionX5, startY + stepY));
object phase3SignatureResetLoopNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ResetBasicLoopCountAction), new Vector2(actionX6 - 200f, startY + stepY));
object phase3UseSignatureNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(actionX6, startY + stepY));
SetNodeFieldValue(phase3UseSignatureNode, "Pattern", signaturePattern, setFieldValueMethod);
SetNodeFieldValue(phase3UseSignatureNode, "ContinueOnResolvedFailure", true, setFieldValueMethod);
@@ -323,6 +334,7 @@ namespace Colosseum.Editor
SetBranchRequiresAll(phase3SignatureResultBranch, true);
object phase3SignatureStaggerNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(BossStaggerAction), new Vector2(actionX6 + 820f, startY + stepY - 120f));
object phase3SignatureFailureNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SignatureFailureEffectsAction), new Vector2(actionX6 + 820f, startY + stepY + 120f));
ConfigureSignatureFailureNode(phase3SignatureFailureNode, signatureFailureAbnormality, setFieldValueMethod);
object phase3SignatureTimerResetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SetBossPhaseAction), new Vector2(actionX6 + 1220f, startY + stepY));
SetNodeFieldValue(phase3SignatureTimerResetNode, "TargetPhase", 3, setFieldValueMethod);
SetNodeFieldValue(phase3SignatureTimerResetNode, "ResetTimer", true, setFieldValueMethod);
@@ -335,6 +347,7 @@ namespace Colosseum.Editor
phase3SetPhaseNode,
phase3RefreshNode,
phase3ValidateNode,
phase3SignatureResetLoopNode,
phase3UseSignatureNode,
phase3SignatureResultBranch,
phase3SignatureTimerResetNode);
@@ -357,12 +370,14 @@ namespace Colosseum.Editor
SetNodeFieldValue(punishSelectNode, "SearchRadius", DefaultDownedTargetSearchRadius, setFieldValueMethod);
object punishUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(actionX2, startY + stepY * 2f));
SetNodeFieldValue(punishUseNode, "Pattern", punishPattern, setFieldValueMethod);
ConnectChildren(graphAsset, connectEdgeMethod, punishSequence, punishSelectNode, punishUseNode);
object punishResetLoopNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ResetBasicLoopCountAction), new Vector2(actionX3, startY + stepY * 2f));
ConnectChildren(graphAsset, connectEdgeMethod, punishSequence, punishSelectNode, punishUseNode, punishResetLoopNode);
object signatureBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 3f));
AttachConditionWithValue(signatureBranch, typeof(IsCurrentPhaseCondition), "Phase", 3, authoringAssembly);
AttachConditionWithValue(signatureBranch, typeof(IsPhaseElapsedTimeAboveCondition), "Seconds", DefaultSignatureRepeatInterval, authoringAssembly);
AttachPatternReadyCondition(signatureBranch, signaturePattern, authoringAssembly);
AttachConditionWithValue(signatureBranch, typeof(IsBasicLoopCountAtLeastCondition), "Count", DefaultBasicLoopRequirementBeforeBigPattern, authoringAssembly);
SetBranchRequiresAll(signatureBranch, true);
object signatureSequence = CreateNode(
@@ -377,11 +392,13 @@ namespace Colosseum.Editor
object signatureUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(actionX3, startY + stepY * 3f));
SetNodeFieldValue(signatureUseNode, "Pattern", signaturePattern, setFieldValueMethod);
SetNodeFieldValue(signatureUseNode, "ContinueOnResolvedFailure", true, setFieldValueMethod);
object signatureResetLoopNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ResetBasicLoopCountAction), new Vector2(actionX3 + 220f, startY + stepY * 3f));
object signatureResultBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(actionX4, startY + stepY * 3f));
AttachConditionWithValue(signatureResultBranch, typeof(IsPatternExecutionResultCondition), "Result", BossPatternExecutionResult.Failed, authoringAssembly);
SetBranchRequiresAll(signatureResultBranch, true);
object signatureStaggerNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(BossStaggerAction), new Vector2(actionX4 + 420f, startY + stepY * 3f - 120f));
object signatureFailureNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SignatureFailureEffectsAction), new Vector2(actionX4 + 420f, startY + stepY * 3f + 120f));
ConfigureSignatureFailureNode(signatureFailureNode, signatureFailureAbnormality, setFieldValueMethod);
object signatureTimerResetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SetBossPhaseAction), new Vector2(actionX5, startY + stepY * 3f));
SetNodeFieldValue(signatureTimerResetNode, "TargetPhase", 3, setFieldValueMethod);
SetNodeFieldValue(signatureTimerResetNode, "ResetTimer", true, setFieldValueMethod);
@@ -392,6 +409,7 @@ namespace Colosseum.Editor
signatureRefreshNode,
signatureValidateNode,
signatureUseNode,
signatureResetLoopNode,
signatureResultBranch,
signatureTimerResetNode);
@@ -417,6 +435,7 @@ namespace Colosseum.Editor
object leapBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 5f));
AttachPatternReadyCondition(leapBranch, mobilityPattern, authoringAssembly);
AttachConditionWithValue(leapBranch, typeof(IsTargetBeyondDistanceCondition), "MinDistance", DefaultLeapTargetMinDistance, authoringAssembly);
AttachConditionWithValue(leapBranch, typeof(IsBasicLoopCountAtLeastCondition), "Count", DefaultBasicLoopRequirementBeforeBigPattern, authoringAssembly);
SetBranchRequiresAll(leapBranch, true);
object leapSequence = CreateNode(
@@ -432,12 +451,14 @@ namespace Colosseum.Editor
object leapValidateNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(actionX2, startY + stepY * 5f));
object leapUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(actionX3, startY + stepY * 5f));
SetNodeFieldValue(leapUseNode, "Pattern", mobilityPattern, setFieldValueMethod);
ConnectChildren(graphAsset, connectEdgeMethod, leapSequence, leapSelectNode, leapValidateNode, leapUseNode);
object leapResetLoopNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ResetBasicLoopCountAction), new Vector2(actionX4, startY + stepY * 5f));
ConnectChildren(graphAsset, connectEdgeMethod, leapSequence, leapSelectNode, leapValidateNode, leapUseNode, leapResetLoopNode);
object groundShakeBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 6f));
AttachConditionWithValue(groundShakeBranch, typeof(IsCurrentPhaseCondition), "Phase", 2, authoringAssembly);
AttachConditionWithValue(groundShakeBranch, typeof(IsPhaseElapsedTimeAboveCondition), "Seconds", DefaultGroundShakeInterval, authoringAssembly);
AttachPatternReadyCondition(groundShakeBranch, groundShakePattern, authoringAssembly);
AttachConditionWithValue(groundShakeBranch, typeof(IsBasicLoopCountAtLeastCondition), "Count", DefaultBasicLoopRequirementBeforeBigPattern, authoringAssembly);
SetBranchRequiresAll(groundShakeBranch, true);
object groundShakeSequence = CreateNode(
@@ -451,10 +472,11 @@ namespace Colosseum.Editor
object groundShakeValidateNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(actionX2, startY + stepY * 6f));
object groundShakeUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UsePatternByRoleAction), new Vector2(actionX3, startY + stepY * 6f));
SetNodeFieldValue(groundShakeUseNode, "Pattern", groundShakePattern, setFieldValueMethod);
object groundShakeResetLoopNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ResetBasicLoopCountAction), new Vector2(actionX4 - 180f, startY + stepY * 6f));
object groundShakeTimerResetNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(SetBossPhaseAction), new Vector2(actionX4, startY + stepY * 6f));
SetNodeFieldValue(groundShakeTimerResetNode, "TargetPhase", 2, setFieldValueMethod);
SetNodeFieldValue(groundShakeTimerResetNode, "ResetTimer", true, setFieldValueMethod);
ConnectChildren(graphAsset, connectEdgeMethod, groundShakeSequence, groundShakeRefreshNode, groundShakeValidateNode, groundShakeUseNode, groundShakeTimerResetNode);
ConnectChildren(graphAsset, connectEdgeMethod, groundShakeSequence, groundShakeRefreshNode, groundShakeValidateNode, groundShakeUseNode, groundShakeResetLoopNode, groundShakeTimerResetNode);
object meleeBranch = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, branchCompositeType, new Vector2(branchX, startY + stepY * 7f));
object meleeRangeCondModel = AttachCondition(meleeBranch, typeof(IsTargetInAttackRangeCondition), authoringAssembly);
@@ -475,7 +497,9 @@ namespace Colosseum.Editor
object meleeValidateNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(ValidateTargetAction), new Vector2(actionX1, startY + stepY * 7f));
object meleeUseNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(UseWeightedReadyPatternAction), new Vector2(actionX2, startY + stepY * 7f));
SetWeightedPatternFields(meleeUseNode, setFieldValueMethod, comboPattern, DefaultComboPatternWeight, pressurePattern, DefaultPressurePatternWeight, primaryPattern, DefaultPrimaryPatternWeight, secondaryPattern, DefaultSecondaryPatternWeight, tertiaryPattern, DefaultTertiaryPatternWeight);
ConnectChildren(graphAsset, connectEdgeMethod, meleeSequence, meleeValidateNode, meleeUseNode);
object meleeIncrementLoopNode = CreateNode(graphAsset, createNodeMethod, getNodeInfoMethod, typeof(IncrementBasicLoopCountAction), new Vector2(actionX3, startY + stepY * 7f));
SetNodeFieldValue(meleeIncrementLoopNode, "Count", 1, setFieldValueMethod);
ConnectChildren(graphAsset, connectEdgeMethod, meleeSequence, meleeValidateNode, meleeUseNode, meleeIncrementLoopNode);
object chaseSequence = CreateNode(
graphAsset,
@@ -819,6 +843,17 @@ namespace Colosseum.Editor
}
}
private static void ConfigureSignatureFailureNode(object nodeModel, AbnormalityData failureAbnormality, MethodInfo setFieldValueMethod)
{
SetNodeFieldValue(nodeModel, "FailureDamage", DefaultSignatureFailureDamage, setFieldValueMethod);
SetNodeFieldValue(nodeModel, "FailureAbnormality", failureAbnormality, setFieldValueMethod);
SetNodeFieldValue(nodeModel, "KnockbackRadius", DefaultSignatureFailureKnockbackRadius, setFieldValueMethod);
SetNodeFieldValue(nodeModel, "DownRadius", DefaultSignatureFailureDownRadius, setFieldValueMethod);
SetNodeFieldValue(nodeModel, "KnockbackSpeed", DefaultSignatureFailureKnockbackSpeed, setFieldValueMethod);
SetNodeFieldValue(nodeModel, "KnockbackDuration", DefaultSignatureFailureKnockbackDuration, setFieldValueMethod);
SetNodeFieldValue(nodeModel, "DownDuration", DefaultSignatureFailureDownDuration, setFieldValueMethod);
}
private static object CreateNode(UnityEngine.Object graphAsset, MethodInfo createNodeMethod, MethodInfo getNodeInfoMethod, Type runtimeType, Vector2 position)
{
if (runtimeType == null)

View File

@@ -1352,6 +1352,7 @@ namespace Colosseum.Editor
}
serializedObject.ApplyModifiedPropertiesWithoutUndo();
pattern.RefreshPatternStepsFromMatchingSkills();
EditorUtility.SetDirty(pattern);
return pattern;
}

View File

@@ -0,0 +1,101 @@
using System;
using UnityEditor;
using Colosseum.AI;
namespace Colosseum.Editor
{
/// <summary>
/// SkillData 자산이 변경되면 이름 규칙에 맞는 BossPatternData 스텝 구성을 자동 갱신합니다.
/// </summary>
public class SkillPatternDataMatcher : AssetPostprocessor
{
private const string SkillsFolderPath = "Assets/_Game/Data/Skills";
private const string PatternsFolderPath = "Assets/_Game/Data/Patterns";
private static void OnPostprocessAllAssets(
string[] importedAssets,
string[] deletedAssets,
string[] movedAssets,
string[] movedFromAssetPaths)
{
if (!HasSkillAssetChange(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths))
return;
RefreshAllPatternSteps();
}
/// <summary>
/// 에디터가 다시 로드될 때 기존 패턴과 스킬 자산 정합성을 한 번 점검합니다.
/// </summary>
[InitializeOnLoadMethod]
private static void RefreshPatternsOnEditorLoad()
{
EditorApplication.delayCall += RefreshAllPatternSteps;
}
/// <summary>
/// 모든 BossPatternData를 순회하며 시퀀스 스킬 스텝을 갱신합니다.
/// </summary>
public static void RefreshAllPatternSteps()
{
string[] patternGuids = AssetDatabase.FindAssets("t:BossPatternData", new[] { PatternsFolderPath });
int refreshedCount = 0;
for (int i = 0; i < patternGuids.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(patternGuids[i]);
BossPatternData pattern = AssetDatabase.LoadAssetAtPath<BossPatternData>(path);
if (pattern == null)
continue;
if (pattern.RefreshPatternStepsFromMatchingSkills())
refreshedCount++;
}
if (refreshedCount > 0)
AssetDatabase.SaveAssets();
}
/// <summary>
/// SkillData 관련 자산이 추가/삭제/이동되었는지 확인합니다.
/// </summary>
private static bool HasSkillAssetChange(
string[] importedAssets,
string[] deletedAssets,
string[] movedAssets,
string[] movedFromAssetPaths)
{
for (int i = 0; i < importedAssets.Length; i++)
{
if (IsSkillAssetPath(importedAssets[i]))
return true;
}
for (int i = 0; i < deletedAssets.Length; i++)
{
if (IsSkillAssetPath(deletedAssets[i]))
return true;
}
for (int i = 0; i < movedAssets.Length; i++)
{
if (IsSkillAssetPath(movedAssets[i]) || IsSkillAssetPath(movedFromAssetPaths[i]))
return true;
}
return false;
}
/// <summary>
/// 지정한 경로가 SkillData 자동 매칭 대상 폴더인지 확인합니다.
/// </summary>
private static bool IsSkillAssetPath(string assetPath)
{
return assetPath != null
&& assetPath.StartsWith(SkillsFolderPath, StringComparison.Ordinal)
&& assetPath.EndsWith(".asset", StringComparison.OrdinalIgnoreCase);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 494e62541f2df8e189120345438d02d3

View File

@@ -8,7 +8,6 @@ using Colosseum.Skills;
using Unity.Behavior;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Serialization;
namespace Colosseum.Enemy
{
@@ -44,39 +43,10 @@ namespace Colosseum.Enemy
[SerializeField] protected BehaviorGraphAgent behaviorGraphAgent;
[Header("Pattern Flow")]
[Tooltip("대형 패턴(시그니처/기동/조합) 직후 기본 패턴 최소 순환 횟수")]
[Min(0)] [SerializeField] protected int basicLoopMinCountAfterBigPattern = 2;
[Header("시그니처 효과 설정")]
[Tooltip("시그니처 패턴 차단에 필요한 누적 피해 비율")]
[Range(0f, 1f)] [SerializeField] protected float signatureRequiredDamageRatio = 0.1f;
[Tooltip("시그니처 준비 상태를 나타내는 이상상태")]
[SerializeField] protected AbnormalityData signatureTelegraphAbnormality;
[Tooltip("시그니처 차단 성공 시 보스가 멈추는 시간")]
[Min(0f)] [SerializeField] protected float signatureSuccessStaggerDuration = 2f;
[Tooltip("시그니처 실패 시 모든 플레이어에게 적용할 디버프")]
[SerializeField] protected AbnormalityData signatureFailureAbnormality;
[Tooltip("시그니처 실패 시 모든 플레이어에게 주는 기본 피해")]
[Min(0f)] [SerializeField] protected float signatureFailureDamage = 40f;
[Tooltip("시그니처 실패 시 넉백이 적용되는 반경")]
[Min(0f)] [SerializeField] protected float signatureFailureKnockbackRadius = 8f;
[Tooltip("시그니처 실패 시 다운이 적용되는 반경")]
[Min(0f)] [SerializeField] protected float signatureFailureDownRadius = 3f;
[Tooltip("시그니처 실패 시 넉백 속도")]
[Min(0f)] [SerializeField] protected float signatureFailureKnockbackSpeed = 12f;
[Tooltip("시그니처 실패 시 넉백 지속 시간")]
[Min(0f)] [SerializeField] protected float signatureFailureKnockbackDuration = 0.35f;
[Tooltip("시그니처 실패 시 다운 지속 시간")]
[Min(0f)] [SerializeField] protected float signatureFailureDownDuration = 2f;
[Tooltip("패턴 하나가 끝난 뒤 다음 패턴을 시작하기까지의 공통 텀")]
[Min(0f)] [SerializeField] protected float commonPatternInterval = 0.35f;
[Tooltip("패턴 종료 후 Idle 자세가 잠깐 안착할 수 있도록 추가로 확보하는 시간")]
[Min(0f)] [SerializeField] protected float postPatternIdleSettleDuration = 0.12f;
[Header("Phase State")]
[Tooltip("BT가 관리하는 최대 페이즈 수")]
@@ -93,8 +63,13 @@ namespace Colosseum.Enemy
protected int basicLoopCountSinceLastBigPattern;
protected int currentPatternPhase = 1;
protected float currentPhaseStartTime;
protected float nextPatternReadyTime;
protected float lastPatternCompletedTime = float.NegativeInfinity;
protected BossPatternExecutionResult lastPatternExecutionResult;
protected BossPatternData lastExecutedPattern;
protected BossPatternData activePattern;
protected bool currentPatternSkillStartsFromIdle;
protected bool currentPatternSkillReturnsToIdle;
protected GameObject lastReviveCaster;
protected GameObject lastRevivedTarget;
protected float lastReviveEventTime = float.NegativeInfinity;
@@ -120,10 +95,16 @@ namespace Colosseum.Enemy
public float PhaseElapsedTime => Time.time - currentPhaseStartTime;
/// <summary>
/// 마지막 대형 패턴 이후 누적된 기본 루프 횟수
/// 마지막 대형/징벌 패턴 이후 누적된 기본 루프 횟수
/// </summary>
public int BasicLoopCountSinceLastBigPattern => basicLoopCountSinceLastBigPattern;
/// <summary>
/// 패턴 종료 후 다음 패턴 시작까지 남은 공통 텀입니다.
/// </summary>
public float RemainingPatternInterval => Mathf.Max(0f, nextPatternReadyTime - Time.time);
public float RemainingPatternIdleSettleTime => Mathf.Max(0f, (lastPatternCompletedTime + Mathf.Max(0f, postPatternIdleSettleDuration)) - Time.time);
/// <summary>
/// 마지막 패턴 실행 결과
/// </summary>
@@ -134,6 +115,21 @@ namespace Colosseum.Enemy
/// </summary>
public BossPatternData LastExecutedPattern => lastExecutedPattern;
/// <summary>
/// 현재 패턴 실행 중인지 여부
/// </summary>
public bool IsExecutingPattern => activePattern != null && lastPatternExecutionResult == BossPatternExecutionResult.Running;
/// <summary>
/// 현재 스킬 스텝이 패턴 시작에서 Idle과 이어져야 하는지 여부
/// </summary>
public bool CurrentPatternSkillStartsFromIdle => currentPatternSkillStartsFromIdle;
/// <summary>
/// 현재 스킬 스텝이 패턴 종료에서 Idle로 돌아가야 하는지 여부
/// </summary>
public bool CurrentPatternSkillReturnsToIdle => currentPatternSkillReturnsToIdle;
/// <summary>
/// EnemyBase 접근자
/// </summary>
@@ -144,41 +140,6 @@ namespace Colosseum.Enemy
/// </summary>
public bool DebugModeEnabled => debugMode;
/// <summary>
/// 시그니처 실패 시 모든 플레이어에게 주는 기본 피해
/// </summary>
public float SignatureFailureDamage => signatureFailureDamage;
/// <summary>
/// 시그니처 실패 시 모든 플레이어에게 적용할 디버프
/// </summary>
public AbnormalityData SignatureFailureAbnormality => signatureFailureAbnormality;
/// <summary>
/// 시그니처 실패 시 넉백이 적용되는 반경
/// </summary>
public float SignatureFailureKnockbackRadius => signatureFailureKnockbackRadius;
/// <summary>
/// 시그니처 실패 시 다운이 적용되는 반경
/// </summary>
public float SignatureFailureDownRadius => signatureFailureDownRadius;
/// <summary>
/// 시그니처 실패 시 넉백 속도
/// </summary>
public float SignatureFailureKnockbackSpeed => signatureFailureKnockbackSpeed;
/// <summary>
/// 시그니처 실패 시 넉백 지속 시간
/// </summary>
public float SignatureFailureKnockbackDuration => signatureFailureKnockbackDuration;
/// <summary>
/// 시그니처 실패 시 다운 지속 시간
/// </summary>
public float SignatureFailureDownDuration => signatureFailureDownDuration;
/// <summary>
/// 마지막 충전 차단 시 설정된 경직 시간 (BossPatternActionBase가 설정)
/// </summary>
@@ -265,8 +226,11 @@ namespace Colosseum.Enemy
/// </summary>
public void BeginPatternExecution(BossPatternData pattern)
{
activePattern = pattern;
lastExecutedPattern = pattern;
lastPatternExecutionResult = BossPatternExecutionResult.Running;
currentPatternSkillStartsFromIdle = false;
currentPatternSkillReturnsToIdle = false;
}
/// <summary>
@@ -276,6 +240,22 @@ namespace Colosseum.Enemy
{
lastExecutedPattern = pattern;
lastPatternExecutionResult = result;
activePattern = null;
currentPatternSkillStartsFromIdle = false;
currentPatternSkillReturnsToIdle = false;
lastPatternCompletedTime = Time.time;
if (pattern != null && IsTerminalPatternExecutionResult(result))
StartCommonPatternInterval();
}
/// <summary>
/// 현재 실행할 패턴 스킬이 패턴 시작/종료 경계인지 기록합니다.
/// </summary>
public void SetCurrentPatternSkillBoundary(bool startsFromIdle, bool returnsToIdle)
{
currentPatternSkillStartsFromIdle = startsFromIdle;
currentPatternSkillReturnsToIdle = returnsToIdle;
}
/// <summary>
@@ -334,24 +314,19 @@ namespace Colosseum.Enemy
&& value;
}
/// <summary>
/// 근접 패턴 사용 카운터를 갱신합니다.
/// </summary>
public void RegisterPatternUse(BossPatternData pattern)
public void IncrementBasicLoopCount(int count = 1)
{
if (pattern == null)
int appliedCount = Mathf.Max(0, count);
if (appliedCount <= 0)
return;
if (pattern.IsMelee)
{
meleePatternCounter++;
basicLoopCountSinceLastBigPattern++;
}
meleePatternCounter += appliedCount;
basicLoopCountSinceLastBigPattern += appliedCount;
}
if (pattern.Category == PatternCategory.Punish || pattern.IsBigPattern)
{
basicLoopCountSinceLastBigPattern = 0;
}
public void ResetBasicLoopCount()
{
basicLoopCountSinceLastBigPattern = 0;
}
/// <summary>
@@ -363,29 +338,17 @@ namespace Colosseum.Enemy
Debug.Log($"[{source}] {message}");
}
/// <summary>
/// 지정 패턴이 grace period를 통과했는지 반환합니다.
/// Punish/Melee/Utility는 항상 허용됩니다.
/// </summary>
public bool IsPatternGracePeriodAllowed(BossPatternData pattern)
{
if (pattern == null)
return false;
if (pattern.Category == PatternCategory.Punish)
return true;
if (pattern.IsMelee || pattern.TargetMode == TargetResolveMode.Utility)
return true;
return basicLoopCountSinceLastBigPattern >= basicLoopMinCountAfterBigPattern;
}
public bool IsPatternReady(BossPatternData pattern)
{
if (pattern == null || pattern.Steps == null || pattern.Steps.Count == 0)
return false;
if (Time.time < lastPatternCompletedTime + Mathf.Max(0f, postPatternIdleSettleDuration))
return false;
if (!IsCommonPatternIntervalReady())
return false;
if (!patternCooldownTracker.TryGetValue(pattern, out float readyTime))
return true;
@@ -401,6 +364,22 @@ namespace Colosseum.Enemy
patternCooldownTracker[pattern] = Time.time + pattern.Cooldown;
}
/// <summary>
/// 공통 패턴 텀이 끝났는지 반환합니다.
/// </summary>
public bool IsCommonPatternIntervalReady()
{
return Time.time >= nextPatternReadyTime;
}
/// <summary>
/// 현재 시점부터 공통 패턴 텀을 다시 시작합니다.
/// </summary>
public void StartCommonPatternInterval()
{
nextPatternReadyTime = Time.time + Mathf.Max(0f, commonPatternInterval);
}
protected void StopMovement()
{
if (navMeshAgent == null || !navMeshAgent.enabled)
@@ -435,6 +414,8 @@ namespace Colosseum.Enemy
{
currentPatternPhase = 1;
currentPhaseStartTime = Time.time;
nextPatternReadyTime = 0f;
lastPatternCompletedTime = float.NegativeInfinity;
lastPatternExecutionResult = BossPatternExecutionResult.None;
lastExecutedPattern = null;
lastReviveCaster = null;
@@ -443,6 +424,13 @@ namespace Colosseum.Enemy
customPhaseConditions.Clear();
}
private static bool IsTerminalPatternExecutionResult(BossPatternExecutionResult result)
{
return result == BossPatternExecutionResult.Succeeded
|| result == BossPatternExecutionResult.Failed
|| result == BossPatternExecutionResult.Cancelled;
}
public override void OnNetworkDespawn()
{
if (IsServer)

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