Wall-climb mesh lean + separate climb/mantle/sprint speeds; reworked rig

PlayerCharacterController:
- Wall lean now moves only the visual model + its paint collider (auto-resolved
  mesh root parenting both renderer and bones), not the CharacterController
  capsule, so the mesh can sink into the wall (wallMaxInset) as well as lean out
  (wallMaxOffset); capsule stays flush.
- Lean eases back to the authored pose when leaving the wall instead of snapping.
- Sprint multiplier now also applies while wall/ceiling climbing.
- Separate wallMantleSpeedMultiplier for pulling up over the top edge,
  independent of the climb speed.

Assets:
- Re-exported paintman_UV.FBX and added Paintman.blend: rescaled armature to
  mesh, merged seam duplicate vertices, fresh automatic weights, inner-thigh
  weight fix (no webbing on leg spread).
- Updated anims, animator controller, font SDF and scene.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 4.8 committed 2026-06-25 20:57:15 +02:00
1 parent cda1373979
commit d867c617df
10 files changed
+15698 -2821

No files matched your search

File diff suppressed because it is too large. Load diff
+262 -190
View File
@@ -19,7 +19,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0, y: 0, z: 74.851}
value: {x: 0, y: 0, z: 58.672}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -35,7 +35,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0, y: 0, z: -74.714}
value: {x: 0, y: 0, z: -58.672}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -46,45 +46,45 @@ AnimationClip:
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0, y: 0, z: -122.435}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_R
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0, y: 0, z: 122.43}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_L
m_PositionCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0.66, y: 7.25, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: -0.65, y: 7.05, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: -0.79, y: 5.73, z: 0}
value: {x: -0.069, y: 0.211, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -100,7 +100,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0.74, y: 5.73, z: -0}
value: {x: 0.069, y: 0.211, z: -0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -121,24 +121,6 @@ AnimationClip:
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings:
- serializedVersion: 2
path: 3536277082
attribute: 1
script: {fileID: 0}
typeID: 4
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 1714018643
attribute: 1
script: {fileID: 0}
typeID: 4
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 2919828665
attribute: 1
@@ -175,6 +157,24 @@ AnimationClip:
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 1409692122
attribute: 4
script: {fileID: 0}
typeID: 4
customType: 4
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 2919828665
attribute: 4
script: {fileID: 0}
typeID: 4
customType: 4
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
@@ -197,69 +197,6 @@ AnimationClip:
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves:
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0.66
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.x
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 7.25
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.y
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.z
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
@@ -308,7 +245,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: 74.851
value: 58.672
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -323,69 +260,6 @@ AnimationClip:
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: -0.65
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.x
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 7.05
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.y
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.z
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
@@ -434,7 +308,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: -74.714
value: -58.672
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -455,7 +329,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: -0.79
value: -0.069
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -476,7 +350,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: 5.73
value: 0.211
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -518,7 +392,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: 0.74
value: 0.069
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -539,7 +413,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: 5.73
value: 0.211
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -575,6 +449,132 @@ AnimationClip:
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.x
path: amm/loot/spine1/spine2/spine3/shoulder_R
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.y
path: amm/loot/spine1/spine2/spine3/shoulder_R
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: -122.435
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.z
path: amm/loot/spine1/spine2/spine3/shoulder_R
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.x
path: amm/loot/spine1/spine2/spine3/shoulder_L
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.y
path: amm/loot/spine1/spine2/spine3/shoulder_L
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 122.43
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.z
path: amm/loot/spine1/spine2/spine3/shoulder_L
classID: 4
script: {fileID: 0}
flags: 16
m_EulerEditorCurves:
- serializedVersion: 2
curve:
@@ -583,8 +583,8 @@ AnimationClip:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
attribute: m_LocalEulerAngles.z
path: amm/loot/spine1/spine2/spine3/shoulder_L
classID: 4
script: {fileID: 0}
flags: 0
@@ -596,7 +596,19 @@ AnimationClip:
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
path: amm/loot/spine1/spine2/spine3/shoulder_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: amm/loot/spine1/spine2/spine3/shoulder_L
classID: 4
script: {fileID: 0}
flags: 0
@@ -608,7 +620,31 @@ AnimationClip:
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
path: amm/loot/spine1/spine2/spine3/shoulder_R
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: amm/loot/spine1/spine2/spine3/shoulder_R
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: amm/loot/spine1/spine2/spine3/shoulder_R
classID: 4
script: {fileID: 0}
flags: 0
@@ -648,6 +684,42 @@ AnimationClip:
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []
+194 -122
View File
@@ -19,7 +19,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: {x: -16.569, y: 4.611, z: -32.197}
value: {x: -10.006, y: 0.447, z: -31.238}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -35,7 +35,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: {x: -23.82, y: -6.851, z: 39.707}
value: {x: -16.156, y: -0.354, z: 37.479}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -46,13 +46,12 @@ AnimationClip:
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
m_PositionCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: -0.29, y: 3.55, z: 0}
value: {x: -10.853, y: 0, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -62,13 +61,13 @@ AnimationClip:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L/lower_arm_L
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0.44, y: 3.02, z: 0}
value: {x: -10.345, y: 0, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
@@ -78,7 +77,8 @@ AnimationClip:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R/lower_arm_R
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
@@ -89,24 +89,6 @@ AnimationClip:
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings:
- serializedVersion: 2
path: 3536277082
attribute: 1
script: {fileID: 0}
typeID: 4
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 1714018643
attribute: 1
script: {fileID: 0}
typeID: 4
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 3536277082
attribute: 4
@@ -125,6 +107,24 @@ AnimationClip:
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 1953922141
attribute: 4
script: {fileID: 0}
typeID: 4
customType: 4
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
- serializedVersion: 2
path: 3747558187
attribute: 4
script: {fileID: 0}
typeID: 4
customType: 4
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
@@ -153,7 +153,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: -16.569
value: -10.006
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -174,7 +174,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: 4.611
value: 0.447
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -195,7 +195,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: -32.197
value: -31.238
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -216,70 +216,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: -0.29
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.x
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 3.55
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.y
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.z
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: -23.82
value: -16.156
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -300,7 +237,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: -6.851
value: -0.354
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -321,7 +258,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: 39.707
value: 37.479
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -342,7 +279,7 @@ AnimationClip:
m_Curve:
- serializedVersion: 3
time: 0
value: 0.44
value: -10.853
inSlope: 0
outSlope: 0
tangentMode: 136
@@ -352,32 +289,11 @@ AnimationClip:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.x
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
attribute: localEulerAnglesRaw.x
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L/lower_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 3.02
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.y
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
classID: 4
script: {fileID: 0}
flags: 0
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
@@ -394,12 +310,132 @@ AnimationClip:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.z
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R
attribute: localEulerAnglesRaw.y
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L/lower_arm_L
classID: 4
script: {fileID: 0}
flags: 0
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.z
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L/lower_arm_L
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: -10.345
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.x
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R/lower_arm_R
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.y
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R/lower_arm_R
classID: 4
script: {fileID: 0}
flags: 16
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.z
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R/lower_arm_R
classID: 4
script: {fileID: 0}
flags: 16
m_EulerEditorCurves:
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L/lower_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L/lower_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: amm/loot/spine1/spine2/spine3/shoulder_L/upper_arm_L/lower_arm_L
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
@@ -472,6 +508,42 @@ AnimationClip:
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R/lower_arm_R
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R/lower_arm_R
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: amm/loot/spine1/spine2/spine3/shoulder_R/upper_arm_R/lower_arm_R
classID: 4
script: {fileID: 0}
flags: 0
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []
File diff suppressed because it is too large. Load diff
Binary file not shown.
+110
View File
@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: c2044ff1352a6bb4586d6d04b59012b7
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: 1
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: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:
+3 -3
View File
@@ -88,10 +88,10 @@ AnimatorStateMachine:
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -6714276574684263144}
m_Position: {x: 280, y: -10, z: 0}
m_Position: {x: 330, y: 10, z: 0}
- serializedVersion: 1
m_State: {fileID: -6819265730547739275}
m_Position: {x: 260, y: 60, z: 0}
m_Position: {x: 320, y: 100, z: 0}
- serializedVersion: 1
m_State: {fileID: -1498405215906516480}
m_Position: {x: 150, y: -110, z: 0}
@@ -111,7 +111,7 @@ AnimatorStateMachine:
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 570, y: -10, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -6819265730547739275}
m_DefaultState: {fileID: -6714276574684263144}
--- !u!1102 &-2107490064458262391
AnimatorState:
serializedVersion: 6
Binary file not shown.
+118 -132
View File
@@ -565,7 +565,7 @@ MonoBehaviour:
Enabled: 1
DistanceLimit: 0
MinimumOcclusionTime: 0
CameraRadius: 0.2
CameraRadius: 0.07
UseFollowTarget:
Enabled: 0
YOffset: 0
@@ -1341,6 +1341,33 @@ MonoBehaviour:
m_PostInfinity: 2
m_RotationOrder: 4
CustomBlends: {fileID: 0}
--- !u!1 &341947179 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 6583767446015258322, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
m_PrefabInstance: {fileID: 821516643}
m_PrefabAsset: {fileID: 0}
--- !u!95 &341947181
Animator:
serializedVersion: 7
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 341947179}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: db81cb9b04dc81e4bbb493a273d47245, type: 2}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_AnimatePhysics: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!1 &347639556
GameObject:
m_ObjectHideFlags: 0
@@ -1840,33 +1867,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 4009941363576130, guid: a8cba3361c8f7724e8899289f1efa8cc, type: 3}
m_PrefabInstance: {fileID: 830003388}
m_PrefabAsset: {fileID: 0}
--- !u!1 &597997895 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: -7694449539802768922, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
m_PrefabInstance: {fileID: 821516643}
m_PrefabAsset: {fileID: 0}
--- !u!95 &597997897
Animator:
serializedVersion: 7
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 597997895}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: db81cb9b04dc81e4bbb493a273d47245, type: 2}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_AnimatePhysics: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!1001 &607565146
PrefabInstance:
m_ObjectHideFlags: 0
@@ -1994,69 +1994,6 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 29636f40562819649b730c52f1babbcb, type: 3}
--- !u!1 &682237518 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: -8278657895335465921, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
m_PrefabInstance: {fileID: 821516643}
m_PrefabAsset: {fileID: 0}
--- !u!114 &682237521
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 682237518}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5fc799adb27d5ea45990b5522b75ddda, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MeshPainter
brushShader: {fileID: 0}
dilateShader: {fileID: 0}
packMsShader: {fileID: 0}
persistPaint: 1
saveId:
pipette: 0
spray: 0
sprayDots: 24
sprayDotSizeMin: 0.05
sprayDotSizeMax: 0.18
sprayDotAlphaMin: 0.25
sprayDotAlphaMax: 1
useGpu: 1
paintAlbedo: 1
paintMetallicSmoothness: 0
paintOcclusion: 0
paintEmission: 0
brushColor: {r: 0.6, g: 0.6, b: 1, a: 1}
metallic: 1
smoothness: 1
metallicSmoothnessOpacity: 1
occlusion: 1
occlusionOpacity: 1
emissionColor: {r: 1, g: 0.6, b: 0, a: 1}
emissionIntensity: 20
brushSize: 50
brushMasks:
- {fileID: 2800000, guid: d07c01c40cc7be54da0ff3ae52484cd2, type: 3}
- {fileID: 2800000, guid: ccc205272b051834eb39593f647c7bf1, type: 3}
- {fileID: 2800000, guid: 04bc55e2853356e4f999b995d0066b33, type: 3}
- {fileID: 2800000, guid: 25780adbe09da488ba079bc33c4bbf0f, type: 3}
- {fileID: 2800000, guid: 25780adbe09da488ba079bc33c4bbf0f, type: 3}
- {fileID: 2800000, guid: 25780adbe09da488ba079bc33c4bbf0f, type: 3}
activeBrushIndex: 0
brushAlignment: 0
brushRotation: 0
paintOnMoveOnly: 1
paintInterval: 0
previewMode: 2
previewOpacity: 1
textureSize: 1024
baseColor: {r: 0.8, g: 0.8, b: 0.8, a: 1}
paddingTexels: 2
paintCamera: {fileID: 0}
updateColliderEveryFrame: 1
previewShader: {fileID: 0}
--- !u!1 &686187286
GameObject:
m_ObjectHideFlags: 0
@@ -2515,37 +2452,9 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 1141039639}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalRotation.w
value: 0.7071068
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalRotation.x
value: -0.7071068
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: -90
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
@@ -2559,20 +2468,28 @@ PrefabInstance:
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -658204318216070287, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalPosition.x
value: 0.0002354744
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_Name
value: paintman_UV
objectReference: {fileID: 0}
- target: {fileID: 3152786563411696340, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: -7694449539802768922, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
- targetCorrespondingSourceObject: {fileID: 6583767446015258322, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
insertIndex: -1
addedObject: {fileID: 597997897}
- targetCorrespondingSourceObject: {fileID: -8278657895335465921, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
addedObject: {fileID: 341947181}
- targetCorrespondingSourceObject: {fileID: 3763709765074082564, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
insertIndex: -1
addedObject: {fileID: 682237521}
addedObject: {fileID: 1610102374}
m_SourcePrefab: {fileID: 100100000, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
--- !u!1 &829281440
GameObject:
@@ -3258,7 +3175,9 @@ MonoBehaviour:
wallMinAngle: 60
wallGrabMinPush: 0.3
wallClimbSpeedMultiplier: 0.5
wallMantleSpeedMultiplier: 0.5
wallMaxOffset: 0.25
wallMaxInset: 1.2
wallOffsetSensitivity: 0.001
wallRotateSensitivity: 0.2
wallOffsetReturnSpeed: 2
@@ -3267,6 +3186,7 @@ MonoBehaviour:
ceilingGrabDistance: 0.3
wallTopOutBoost: 1.2
cameraOrbit: {fileID: 0}
meshOffsetTarget: {fileID: 0}
--- !u!143 &1129539840
CharacterController:
m_ObjectHideFlags: 0
@@ -3362,13 +3282,13 @@ CharacterController:
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Height: 0.95
m_Height: 1.3
m_Radius: 0.1
m_SlopeLimit: 59
m_StepOffset: 0.15
m_SkinWidth: 0.01
m_MinMoveDistance: 0.001
m_Center: {x: 0, y: 0.49, z: 0}
m_Center: {x: 0, y: 0.66, z: 0}
--- !u!114 &1141039642
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -3383,13 +3303,13 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::PlayerCharacterController
persistPlayer: 1
playerSaveId:
moveSpeed: 4
sprintSpeedMultiplier: 1.8
moveSpeed: 2
sprintSpeedMultiplier: 3.2
acceleration: 30
deceleration: 45
cameraRelative: 1
cameraTransform: {fileID: 0}
animator: {fileID: 597997897}
animator: {fileID: 341947181}
runningParameter: Running
rotateTowardMovement: 1
rotationSpeed: 360
@@ -3404,7 +3324,9 @@ MonoBehaviour:
wallMinAngle: 60
wallGrabMinPush: 0.3
wallClimbSpeedMultiplier: 0.5
wallMaxOffset: 0.25
wallMantleSpeedMultiplier: 1.5
wallMaxOffset: 0.1
wallMaxInset: 0.2
wallOffsetSensitivity: 0.001
wallRotateSensitivity: 0.2
wallOffsetReturnSpeed: 2
@@ -3413,6 +3335,7 @@ MonoBehaviour:
ceilingGrabDistance: 0.3
wallTopOutBoost: 0.3
cameraOrbit: {fileID: 0}
meshOffsetTarget: {fileID: 0}
--- !u!1 &1238479929
GameObject:
m_ObjectHideFlags: 0
@@ -3884,7 +3807,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::GameModeManager
player: {fileID: 1141039642}
cameraInput: {fileID: 172071431}
painter: {fileID: 682237521}
painter: {fileID: 0}
insect: {fileID: 0}
switchKey: 3
startModeIndex: 0
@@ -3903,6 +3826,69 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1610102371 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 3763709765074082564, guid: 554c0bdf86263754d862d7effd04045b, type: 3}
m_PrefabInstance: {fileID: 821516643}
m_PrefabAsset: {fileID: 0}
--- !u!114 &1610102374
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1610102371}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5fc799adb27d5ea45990b5522b75ddda, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MeshPainter
brushShader: {fileID: 0}
dilateShader: {fileID: 0}
packMsShader: {fileID: 0}
persistPaint: 1
saveId:
pipette: 0
spray: 0
sprayDots: 24
sprayDotSizeMin: 0.05
sprayDotSizeMax: 0.18
sprayDotAlphaMin: 0.25
sprayDotAlphaMax: 1
useGpu: 1
paintAlbedo: 1
paintMetallicSmoothness: 0
paintOcclusion: 0
paintEmission: 0
brushColor: {r: 0.6, g: 0.6, b: 1, a: 1}
metallic: 1
smoothness: 1
metallicSmoothnessOpacity: 1
occlusion: 1
occlusionOpacity: 1
emissionColor: {r: 1, g: 0.6, b: 0, a: 1}
emissionIntensity: 20
brushSize: 50
brushMasks:
- {fileID: 2800000, guid: d07c01c40cc7be54da0ff3ae52484cd2, type: 3}
- {fileID: 2800000, guid: ccc205272b051834eb39593f647c7bf1, type: 3}
- {fileID: 2800000, guid: 04bc55e2853356e4f999b995d0066b33, type: 3}
- {fileID: 2800000, guid: 25780adbe09da488ba079bc33c4bbf0f, type: 3}
- {fileID: 2800000, guid: 25780adbe09da488ba079bc33c4bbf0f, type: 3}
- {fileID: 2800000, guid: 25780adbe09da488ba079bc33c4bbf0f, type: 3}
activeBrushIndex: 0
brushAlignment: 0
brushRotation: 0
paintOnMoveOnly: 1
paintInterval: 0
previewMode: 2
previewOpacity: 1
textureSize: 1024
baseColor: {r: 0.8, g: 0.8, b: 0.8, a: 1}
paddingTexels: 2
paintCamera: {fileID: 0}
updateColliderEveryFrame: 1
previewShader: {fileID: 0}
--- !u!1001 &1673252827
PrefabInstance:
m_ObjectHideFlags: 0
@@ -4790,7 +4776,7 @@ MonoBehaviour:
limitFrameRate: 1
targetFps: 60
disableVSyncWhenLimiting: 1
vSyncCountWhenUnlimited: 0
vSyncCountWhenUnlimited: 2
--- !u!4 &2009475134
Transform:
m_ObjectHideFlags: 0
+95 -22
View File
@@ -9,10 +9,11 @@ using UnityEngine.InputSystem;
///
/// Wall-climb (entered by pushing the move input into a wall): W/S climb straight up/down the
/// wall at a constant speed, A/D strafe left/right relative to the camera, and the body always
/// faces the wall. Holding the left mouse button and dragging up/down leans out from / back to
/// the wall; holding the right mouse button and dragging left/right turns the body. Either pauses
/// the camera orbit; the lean-out offset eases back to zero while moving, the turn is held until
/// leaving the wall.
/// faces the wall. Holding the left mouse button and dragging up/down leans the visual mesh out
/// of or into the wall (only the model + its paint collider move; the capsule stays put, so the
/// lean can sink into the wall); holding the right mouse button and dragging left/right turns the
/// body. Either pauses the camera orbit; the lean offset eases back to zero while moving, the turn
/// is held until leaving the wall.
/// On leaving, the body eases back to its movement direction. Jumping detaches and works
/// normally; re-grab is blocked while rising and resumes once falling and pushing into a wall.
/// Reaching the top edge mantles the character over onto the surface.
@@ -33,7 +34,7 @@ public partial class PlayerCharacterController : MonoBehaviour
[Tooltip("Horizontal movement speed (units/second).")]
public float moveSpeed = 4f;
[Tooltip("Speed multiplier applied to ground movement while the sprint key (Left Shift) is held.")]
[Tooltip("Speed multiplier applied to ground movement and wall/ceiling climbing while the sprint key (Left Shift) is held.")]
public float sprintSpeedMultiplier = 1.8f;
[Tooltip("How quickly ground movement ramps up to the target speed (units/second²). Lower = more gradual start.")]
@@ -100,8 +101,15 @@ public partial class PlayerCharacterController : MonoBehaviour
[Range(0f, 1f)]
public float wallClimbSpeedMultiplier = 0.5f;
[Tooltip("Farthest the character can lean out from the wall via the mouse-drag offset (units).")]
public float wallMaxOffset = 1.2f;
[Tooltip("Speed multiplier for the mantle (pulling up over the top edge), independent of the climb speed. Multiplies moveSpeed; 1 = full walk speed, >1 = snappier pull-up.")]
[Min(0f)]
public float wallMantleSpeedMultiplier = 0.5f;
[Tooltip("Farthest the mesh can lean out from the wall via the mouse-drag offset (units).")]
public float wallMaxOffset = .2f;
[Tooltip("Farthest the mesh can sink INTO the wall via the mouse-drag offset (units). Only the visual model + its paint collider move; the CharacterController capsule stays put, so this isn't blocked by the wall collider.")]
public float wallMaxInset = .2f;
[Tooltip("Units the lean-out offset changes per pixel of vertical mouse drag (left button held).")]
public float wallOffsetSensitivity = 0.01f;
@@ -127,6 +135,9 @@ public partial class PlayerCharacterController : MonoBehaviour
[Tooltip("Camera orbit input; paused while dragging the wall-climb offset. Auto-found if empty.")]
[SerializeField] private ThirdPersonOrbitInput cameraOrbit;
[Tooltip("Visual model root moved by the wall-climb lean offset (into/out of the wall) while the capsule stays put. Must parent both the skinned mesh and its bones. Auto-resolved from the SkinnedMeshRenderer if empty.")]
[SerializeField] private Transform meshOffsetTarget;
/// <summary>
/// When false, movement/jump input is ignored but gravity and ground contact
/// keep running. Toggled by the GameModeManager.
@@ -158,11 +169,14 @@ public partial class PlayerCharacterController : MonoBehaviour
private Vector3 _wallNormalAccum; // summed wall normals during the latest Move
private bool _wallContactThisFrame;
private float _lostContactTimer;
private float _wallOffset; // current lean-out distance from the wall (mouse drag)
private float _wallOffset; // signed mesh lean (mouse drag): + = out from the wall, - = into it; moves only the model, not the capsule
private float _wallYaw; // body yaw offset from facing the wall (mouse drag); held until leaving
private int _wallStrafeSign; // latched sideways direction (camera picks it once per strafe); 0 = unlatched
private bool _offsetDragging; // true while the offset/rotation is being set (pauses camera orbit)
private bool _climbLeftGround; // true once the capsule has left the ground while climbing (enables ground-detach)
private Vector3 _meshBaseLocalPos; // meshOffsetTarget's authored local position; the lean offset is applied relative to this
private float _meshOffsetResidual; // leftover mesh lean still easing back to 0 after leaving the wall (no longer climbing)
private Vector3 _meshOffsetExitNormal; // wall normal latched at exit; the residual eases along it (live _wallNormal may shift on stray contact)
private readonly RaycastHit[] _wallProbe = new RaycastHit[8];
// Mantle (top-out) state.
@@ -181,6 +195,21 @@ public partial class PlayerCharacterController : MonoBehaviour
cameraTransform = Camera.main.transform;
if (!cameraOrbit)
cameraOrbit = FindFirstObjectByType<ThirdPersonOrbitInput>();
// Resolve the model root to offset: walk up from the skinned mesh to the topmost node still
// under this transform, so it parents BOTH the renderer and its bones. Offsetting only the
// renderer would move just the baked paint collider, not the bone-driven visible mesh.
if (!meshOffsetTarget)
{
var smr = GetComponentInChildren<SkinnedMeshRenderer>();
if (smr)
{
Transform t = smr.transform;
while (t.parent && t.parent != transform) t = t.parent;
meshOffsetTarget = t;
}
}
if (meshOffsetTarget) _meshBaseLocalPos = meshOffsetTarget.localPosition;
}
void Update()
@@ -247,7 +276,7 @@ public partial class PlayerCharacterController : MonoBehaviour
// Frozen on the wall while control is off (e.g. paint mode): keep the
// grip, no movement or gravity, so switching modes never drops us.
if (ControlEnabled)
ApplyWallClimbMovement(h, v, moveDir, jumpPressed, Time.deltaTime);
ApplyWallClimbMovement(h, v, moveDir, jumpPressed, sprinting, Time.deltaTime);
else
_offsetDragging = false;
if (cameraOrbit)
@@ -260,6 +289,9 @@ public partial class PlayerCharacterController : MonoBehaviour
if (cameraOrbit)
cameraOrbit.LookSuppressed = false;
// Glide the leftover wall lean back to the authored pose (set when leaving the wall).
EaseMeshOffsetToRest(Time.deltaTime);
// A ground normal steeper than the slope limit is too steep to stand on
// (also covers balancing on a sharp box edge).
float slopeAngle = Vector3.Angle(_groundNormal, Vector3.up);
@@ -365,6 +397,7 @@ public partial class PlayerCharacterController : MonoBehaviour
_verticalVelocity = 0f;
_slideSpeed = 0f;
_wallOffset = 0f;
_meshOffsetResidual = 0f; // fresh grab: the climb path owns the mesh, drop any leftover ease
_wallYaw = 0f;
_wallStrafeSign = 0;
_climbLeftGround = false;
@@ -375,14 +408,15 @@ public partial class PlayerCharacterController : MonoBehaviour
/// Movement while climbing, for both walls and ceilings (distinguished by the surface
/// normal). On a WALL: W/S climb straight up/down at a constant speed (camera pitch never
/// tilts them), A/D strafe left/right relative to the camera, the body faces the wall, the
/// left mouse button + vertical drag leans out via <see cref="_wallOffset"/>, and the right
/// left mouse button + vertical drag leans the mesh out of / into the wall via
/// <see cref="_wallOffset"/> (capsule stays put), and the right
/// mouse button + horizontal drag turns the body via <see cref="_wallYaw"/>. On a
/// CEILING: the body stays upright and moves WASD camera-relative in the horizontal plane
/// (like on the ground), facing the move direction; the lean-out drag pulls down off the
/// ceiling. Surface normal and gap are re-measured each frame; reaching a wall's top edge
/// mantles, climbing a wall up into an overhang hands off to the ceiling.
/// </summary>
private void ApplyWallClimbMovement(float h, float v, Vector3 moveDir, bool jumpPressed, float dt)
private void ApplyWallClimbMovement(float h, float v, Vector3 moveDir, bool jumpPressed, bool sprinting, float dt)
{
_offsetDragging = false;
@@ -495,10 +529,11 @@ public partial class PlayerCharacterController : MonoBehaviour
}
}
// Left button + vertical drag sets the lean-out offset (mouse down = away from the
// surface; down off a ceiling); right button + horizontal drag turns the body (wall
// only). The offset eases back to zero while moving and never detaches, the turn is
// held until leaving the wall. Either drag pauses the camera orbit.
// Left button + vertical drag sets the lean offset (mouse up = out from the surface, mouse
// down = into it; the offset is signed and moves only the visual mesh, so it can sink into
// the wall where the capsule can't); right button + horizontal drag turns the body (wall
// only). The offset eases back to zero while moving and never detaches, the turn is held
// until leaving the wall. Either drag pauses the camera orbit.
bool offsetDrag = found && IsLeftMouseHeld();
bool yawDrag = found && IsRightMouseHeld();
if (offsetDrag || yawDrag)
@@ -506,7 +541,7 @@ public partial class PlayerCharacterController : MonoBehaviour
_offsetDragging = true;
Vector2 drag = ReadMouseDelta();
if (offsetDrag)
_wallOffset = Mathf.Clamp(_wallOffset - drag.y * wallOffsetSensitivity, 0f, wallMaxOffset);
_wallOffset = Mathf.Clamp(_wallOffset - drag.y * wallOffsetSensitivity, -wallMaxInset, wallMaxOffset);
if (yawDrag)
_wallYaw += drag.x * wallRotateSensitivity;
}
@@ -514,19 +549,21 @@ public partial class PlayerCharacterController : MonoBehaviour
{
_wallOffset = Mathf.MoveTowards(_wallOffset, 0f, wallOffsetReturnSpeed * dt);
}
ApplyMeshOffset(_wallOffset);
float climbSpeed = moveSpeed * wallClimbSpeedMultiplier;
if (sprinting) climbSpeed *= sprintSpeedMultiplier;
Vector3 velocity = Vector3.zero;
if (alongSurface.sqrMagnitude > 1e-6f)
velocity += alongSurface.normalized * climbSpeed;
if (found)
{
// Smoothly approach the chosen standoff. Target one skin-width beyond the offset so
// the capsule rests just outside the surface (offset 0 = flush): the controller's
// depenetration never fights back, so there's no buzz and no quantizing deadzone is
// needed. Exponential follow keeps it framerate-stable; clamp guards probe spikes.
// Smoothly hold the capsule one skin-width off the surface (flush): the lean offset no
// longer moves the capsule (only the visual mesh), so it always rests against the wall.
// The controller's depenetration never fights back, so there's no buzz and no quantizing
// deadzone is needed. Exponential follow keeps it framerate-stable; clamp guards spikes.
const float maxPerpSpeed = 8f;
float gapError = (_wallOffset + _controller.skinWidth) - gap;
float gapError = _controller.skinWidth - gap;
float follow = 1f - Mathf.Exp(-wallOffsetFollow * dt);
velocity += _wallNormal * Mathf.Clamp(gapError * follow / dt, -maxPerpSpeed, maxPerpSpeed);
}
@@ -588,6 +625,38 @@ public partial class PlayerCharacterController : MonoBehaviour
}
}
/// <summary>
/// Offsets only the visual model (mesh + its baked paint collider) along the wall normal by the
/// given signed distance (+ = out from the wall, - = into it), relative to the model's authored
/// local position. The CharacterController capsule is untouched, so the lean can sink into the
/// wall where the capsule would be blocked. Applied in the player's local space so it tracks the
/// body yaw; offset 0 restores the authored pose.
/// </summary>
private void ApplyMeshOffset(float offset) => SetMeshLean(_wallNormal, offset);
/// <summary>
/// Places the visual model at the given signed lean along <paramref name="dir"/> (world space),
/// relative to its authored local pose. Local-space conversion tracks the live body yaw.
/// </summary>
private void SetMeshLean(Vector3 dir, float offset)
{
if (!meshOffsetTarget) return;
Vector3 worldOffset = dir * offset;
meshOffsetTarget.localPosition = _meshBaseLocalPos + transform.InverseTransformVector(worldOffset);
}
/// <summary>
/// Eases the leftover lean back to the authored pose after leaving the wall, so the model glides
/// home instead of snapping. Runs every non-climbing frame at the same rate as the in-climb
/// return; the direction is the wall normal latched at exit (a fresh grab clears the residual).
/// </summary>
private void EaseMeshOffsetToRest(float dt)
{
if (_meshOffsetResidual == 0f) return;
_meshOffsetResidual = Mathf.MoveTowards(_meshOffsetResidual, 0f, wallOffsetReturnSpeed * dt);
SetMeshLean(_meshOffsetExitNormal, _meshOffsetResidual);
}
/// <summary>
/// Raycasts from the character center toward the surface (along -_wallNormal) to find the
/// current normal and the gap (surface clearance) to it. The capsule's support distance
@@ -681,7 +750,7 @@ public partial class PlayerCharacterController : MonoBehaviour
private void MantleOverEdge(float dt)
{
_mantleTimer += dt;
float speed = moveSpeed * wallClimbSpeedMultiplier;
float speed = moveSpeed * wallMantleSpeedMultiplier;
Vector3 forward = -_wallNormal;
forward.y = 0f;
@@ -786,6 +855,10 @@ public partial class PlayerCharacterController : MonoBehaviour
_isWallClimbing = false;
_lostContactTimer = 0f;
_verticalVelocity = 0f;
// Hand the current lean off to the residual so it eases home (EaseMeshOffsetToRest)
// instead of snapping; latch the normal since the live one may shift after detaching.
_meshOffsetResidual = _wallOffset;
_meshOffsetExitNormal = _wallNormal;
_wallOffset = 0f;
_wallYaw = 0f;
_wallStrafeSign = 0;