Compare commits
12 Commits
a9b58571cc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| dadaa56511 | |||
| 8c08e63c81 | |||
| 5ba543ed8c | |||
| 42fe880830 | |||
| 9fd231626b | |||
| 12a481b596 | |||
| 5d58397fe0 | |||
| 72aae85afd | |||
| f6f7eaaef2 | |||
| 205b20e4e6 | |||
| b019acd0a3 | |||
| 4ba6d9d9ff |
8
Assets/DownloadCache.meta
Normal file
8
Assets/DownloadCache.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7df7bbd6d9b80e6e4a7ca8918d2b536b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/External/Animations/ActorCore/orc-beat.fbx
vendored
Normal file
BIN
Assets/External/Animations/ActorCore/orc-beat.fbx
vendored
Normal file
Binary file not shown.
1121
Assets/External/Animations/ActorCore/orc-beat.fbx.meta
vendored
Normal file
1121
Assets/External/Animations/ActorCore/orc-beat.fbx.meta
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Assets/External/Animations/ActorCore/orc-gasp-idle.fbx
vendored
Normal file
BIN
Assets/External/Animations/ActorCore/orc-gasp-idle.fbx
vendored
Normal file
Binary file not shown.
1060
Assets/External/Animations/ActorCore/orc-gasp-idle.fbx.meta
vendored
Normal file
1060
Assets/External/Animations/ActorCore/orc-gasp-idle.fbx.meta
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Assets/External/Animations/ActorCore/orc-irritable-idle.fbx
vendored
Normal file
BIN
Assets/External/Animations/ActorCore/orc-irritable-idle.fbx
vendored
Normal file
Binary file not shown.
1060
Assets/External/Animations/ActorCore/orc-irritable-idle.fbx.meta
vendored
Normal file
1060
Assets/External/Animations/ActorCore/orc-irritable-idle.fbx.meta
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Assets/External/Animations/ActorCore/orc-jog.fbx
vendored
Normal file
BIN
Assets/External/Animations/ActorCore/orc-jog.fbx
vendored
Normal file
Binary file not shown.
1060
Assets/External/Animations/ActorCore/orc-jog.fbx.meta
vendored
Normal file
1060
Assets/External/Animations/ActorCore/orc-jog.fbx.meta
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/External/Animations/Mixamo.meta
vendored
Normal file
8
Assets/External/Animations/Mixamo.meta
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cde700a8f68a683a7a2c09a10cff519f
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/External/Animations/Mixamo/Mutant Swiping Mirror.fbx
vendored
Normal file
BIN
Assets/External/Animations/Mixamo/Mutant Swiping Mirror.fbx
vendored
Normal file
Binary file not shown.
751
Assets/External/Animations/Mixamo/Mutant Swiping Mirror.fbx.meta
vendored
Normal file
751
Assets/External/Animations/Mixamo/Mutant Swiping Mirror.fbx.meta
vendored
Normal 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:
|
||||
BIN
Assets/External/Animations/Mixamo/Mutant Swiping.fbx
vendored
Normal file
BIN
Assets/External/Animations/Mixamo/Mutant Swiping.fbx
vendored
Normal file
Binary file not shown.
751
Assets/External/Animations/Mixamo/Mutant Swiping.fbx.meta
vendored
Normal file
751
Assets/External/Animations/Mixamo/Mutant Swiping.fbx.meta
vendored
Normal 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:
|
||||
@@ -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
176573
Assets/_Game/Animations/Anim_Drog_Idle1.anim
Normal file
176573
Assets/_Game/Animations/Anim_Drog_Idle1.anim
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4ff85a68bb491e143a001f3af82639ed
|
||||
guid: ed7913df0854ae86a9374a34d7ebdc7d
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
105329
Assets/_Game/Animations/Anim_Drog_Idle2.anim
Normal file
105329
Assets/_Game/Animations/Anim_Drog_Idle2.anim
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0b70d6464b876144c84f2410c0359a4f
|
||||
guid: 1654c779ca38159dab86a08864968bcc
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 94da51b9da4bad4129ba5e33e671db62
|
||||
guid: 51c52bb037757304ca6faaf68c181bcd
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
@@ -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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
89076
Assets/_Game/Animations/Anim_Drog_콤보-기본기.anim
Normal file
89076
Assets/_Game/Animations/Anim_Drog_콤보-기본기.anim
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기.anim.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0ac204f42d08127d486281f828f28742
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기1_3_1.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기1_3_1.anim.meta
Normal 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
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8cfd11750543a4484bae82462b7c0351
|
||||
guid: 6b11f2b53d826bba3ab9f8086a42de14
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b8206d6d914a86cd9a169763c82f273e
|
||||
guid: 156c90879bba0d7649e8b29224daa390
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 16c44854334d767d3af2fd774b89a809
|
||||
guid: 6439cde8bc726bd1caad7d6e18a31416
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 82cf3119cd7b56e3e9d579cac94fc09d
|
||||
guid: 606aec780e456217687074cbbf23a2c8
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
|
||||
36930
Assets/_Game/Animations/Anim_Drog_콤보-기본기2_2_1.anim
Normal file
36930
Assets/_Game/Animations/Anim_Drog_콤보-기본기2_2_1.anim
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기2_2_1.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기2_2_1.anim.meta
Normal 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
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18b092b0aae73b9219db20623b0c3427
|
||||
guid: ead3ca0dff8c0a3468e3234269c4a62e
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
|
||||
16180
Assets/_Game/Animations/Anim_Drog_콤보-기본기3_1_1.anim
Normal file
16180
Assets/_Game/Animations/Anim_Drog_콤보-기본기3_1_1.anim
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기3_1_1.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기3_1_1.anim.meta
Normal 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
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8f572193078ff9e229c1d39038620857
|
||||
guid: 3f077b889a0c441a8be8f51575b34f37
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기3_2_1.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Drog_콤보-기본기3_2_1.anim.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e63e8710eded48197ae534daf847bbb5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9678ad326a270e9aa9cb5ebf5fa00279
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
157435
Assets/_Game/Animations/Anim_Drog_콤보-발구르기2_1_0.anim
Normal file
157435
Assets/_Game/Animations/Anim_Drog_콤보-발구르기2_1_0.anim
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Drog_콤보-발구르기2_1_0.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Drog_콤보-발구르기2_1_0.anim.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b73a55c82a8bff692aa4a9e60395c247
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
166075
Assets/_Game/Animations/Anim_Drog_콤보-발구르기3_1_0.anim
Normal file
166075
Assets/_Game/Animations/Anim_Drog_콤보-발구르기3_1_0.anim
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Drog_콤보-발구르기3_1_0.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Drog_콤보-발구르기3_1_0.anim.meta
Normal 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
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 71c802f9bbefb10be81506bf40e18f19
|
||||
guid: b3cb0b329a21a7fcda3402b8e07e38b9
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a296d71e8987d8379c9871af2c55b6c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fc435c80b8f1348f889910629f8eec51
|
||||
guid: edcd515b78fc1dc4795c27e85470865f
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 76e508fdc9d7c8f7b9e370e453cee0fc
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5d0e0a2108f1cde06af0c597cfb2b81c
|
||||
@@ -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++)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
8
Assets/_Game/Scripts/Debug.meta
Normal file
8
Assets/_Game/Scripts/Debug.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 70661168ff52fffe7b990c89bbe7b0dc
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
44
Assets/_Game/Scripts/Debug/FacingDirectionGizmoUtility.cs
Normal file
44
Assets/_Game/Scripts/Debug/FacingDirectionGizmoUtility.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3481720c56d01e6dfa9327a4c386a1cd
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f0f0b49f4c980df0fb386a85a3d7a869
|
||||
165
Assets/_Game/Scripts/Editor/AnimationClipEndKeyBaker.cs
Normal file
165
Assets/_Game/Scripts/Editor/AnimationClipEndKeyBaker.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2b4cdd66881753313932344805cb72c3
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1352,6 +1352,7 @@ namespace Colosseum.Editor
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedPropertiesWithoutUndo();
|
||||
pattern.RefreshPatternStepsFromMatchingSkills();
|
||||
EditorUtility.SetDirty(pattern);
|
||||
return pattern;
|
||||
}
|
||||
|
||||
101
Assets/_Game/Scripts/Editor/SkillPatternDataMatcher.cs
Normal file
101
Assets/_Game/Scripts/Editor/SkillPatternDataMatcher.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 494e62541f2df8e189120345438d02d3
|
||||
@@ -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
Reference in New Issue
Block a user