Add ceiling rotation drag and refine ground/wall pose offset controls
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
080b2a1c39
commit
f652cdeca0
6 files changed
+407
-203
No files matched your search
@@ -706,6 +706,66 @@ MonoBehaviour:
|
|||||||
m_Scale: 1
|
m_Scale: 1
|
||||||
m_AtlasIndex: 0
|
m_AtlasIndex: 0
|
||||||
m_ClassDefinitionType: 0
|
m_ClassDefinitionType: 0
|
||||||
|
- m_Index: 24
|
||||||
|
m_Metrics:
|
||||||
|
m_Width: 153.29688
|
||||||
|
m_Height: 219.59375
|
||||||
|
m_HorizontalBearingX: 9.296875
|
||||||
|
m_HorizontalBearingY: 216
|
||||||
|
m_HorizontalAdvance: 178.20312
|
||||||
|
m_GlyphRect:
|
||||||
|
m_X: 1270
|
||||||
|
m_Y: 763
|
||||||
|
m_Width: 154
|
||||||
|
m_Height: 220
|
||||||
|
m_Scale: 1
|
||||||
|
m_AtlasIndex: 0
|
||||||
|
m_ClassDefinitionType: 0
|
||||||
|
- m_Index: 18
|
||||||
|
m_Metrics:
|
||||||
|
m_Width: 149.39062
|
||||||
|
m_Height: 219.59375
|
||||||
|
m_HorizontalBearingX: 14.703125
|
||||||
|
m_HorizontalBearingY: 216
|
||||||
|
m_HorizontalAdvance: 178.20312
|
||||||
|
m_GlyphRect:
|
||||||
|
m_X: 656
|
||||||
|
m_Y: 751
|
||||||
|
m_Width: 151
|
||||||
|
m_Height: 220
|
||||||
|
m_Scale: 1
|
||||||
|
m_AtlasIndex: 0
|
||||||
|
m_ClassDefinitionType: 0
|
||||||
|
- m_Index: 22
|
||||||
|
m_Metrics:
|
||||||
|
m_Width: 148.79688
|
||||||
|
m_Height: 216.29688
|
||||||
|
m_HorizontalBearingX: 22.203125
|
||||||
|
m_HorizontalBearingY: 212.70312
|
||||||
|
m_HorizontalAdvance: 178.20312
|
||||||
|
m_GlyphRect:
|
||||||
|
m_X: 1026
|
||||||
|
m_Y: 895
|
||||||
|
m_Width: 149
|
||||||
|
m_Height: 217
|
||||||
|
m_Scale: 1
|
||||||
|
m_AtlasIndex: 0
|
||||||
|
m_ClassDefinitionType: 0
|
||||||
|
- m_Index: 21
|
||||||
|
m_Metrics:
|
||||||
|
m_Width: 153.29688
|
||||||
|
m_Height: 219.59375
|
||||||
|
m_HorizontalBearingX: 13.796875
|
||||||
|
m_HorizontalBearingY: 216
|
||||||
|
m_HorizontalAdvance: 178.20312
|
||||||
|
m_GlyphRect:
|
||||||
|
m_X: 836
|
||||||
|
m_Y: 900
|
||||||
|
m_Width: 155
|
||||||
|
m_Height: 220
|
||||||
|
m_Scale: 1
|
||||||
|
m_AtlasIndex: 0
|
||||||
|
m_ClassDefinitionType: 0
|
||||||
m_CharacterTable:
|
m_CharacterTable:
|
||||||
- m_ElementType: 1
|
- m_ElementType: 1
|
||||||
m_Unicode: 8230
|
m_Unicode: 8230
|
||||||
@@ -879,6 +939,22 @@ MonoBehaviour:
|
|||||||
m_Unicode: 73
|
m_Unicode: 73
|
||||||
m_GlyphIndex: 40
|
m_GlyphIndex: 40
|
||||||
m_Scale: 1
|
m_Scale: 1
|
||||||
|
- m_ElementType: 1
|
||||||
|
m_Unicode: 57
|
||||||
|
m_GlyphIndex: 24
|
||||||
|
m_Scale: 1
|
||||||
|
- m_ElementType: 1
|
||||||
|
m_Unicode: 51
|
||||||
|
m_GlyphIndex: 18
|
||||||
|
m_Scale: 1
|
||||||
|
- m_ElementType: 1
|
||||||
|
m_Unicode: 55
|
||||||
|
m_GlyphIndex: 22
|
||||||
|
m_Scale: 1
|
||||||
|
- m_ElementType: 1
|
||||||
|
m_Unicode: 54
|
||||||
|
m_GlyphIndex: 21
|
||||||
|
m_Scale: 1
|
||||||
m_AtlasTextures:
|
m_AtlasTextures:
|
||||||
- {fileID: 2664084111089754775}
|
- {fileID: 2664084111089754775}
|
||||||
m_AtlasTextureIndex: 0
|
m_AtlasTextureIndex: 0
|
||||||
@@ -1058,6 +1134,22 @@ MonoBehaviour:
|
|||||||
m_Y: 192
|
m_Y: 192
|
||||||
m_Width: 74
|
m_Width: 74
|
||||||
m_Height: 252
|
m_Height: 252
|
||||||
|
- m_X: 1255
|
||||||
|
m_Y: 748
|
||||||
|
m_Width: 183
|
||||||
|
m_Height: 249
|
||||||
|
- m_X: 641
|
||||||
|
m_Y: 736
|
||||||
|
m_Width: 180
|
||||||
|
m_Height: 249
|
||||||
|
- m_X: 1011
|
||||||
|
m_Y: 880
|
||||||
|
m_Width: 178
|
||||||
|
m_Height: 246
|
||||||
|
- m_X: 821
|
||||||
|
m_Y: 885
|
||||||
|
m_Width: 184
|
||||||
|
m_Height: 249
|
||||||
m_FreeGlyphRects:
|
m_FreeGlyphRects:
|
||||||
- m_X: 189
|
- m_X: 189
|
||||||
m_Y: 74
|
m_Y: 74
|
||||||
@@ -1103,10 +1195,6 @@ MonoBehaviour:
|
|||||||
m_Y: 1139
|
m_Y: 1139
|
||||||
m_Width: 2047
|
m_Width: 2047
|
||||||
m_Height: 908
|
m_Height: 908
|
||||||
- m_X: 229
|
|
||||||
m_Y: 944
|
|
||||||
m_Width: 1818
|
|
||||||
m_Height: 1103
|
|
||||||
- m_X: 103
|
- m_X: 103
|
||||||
m_Y: 864
|
m_Y: 864
|
||||||
m_Width: 214
|
m_Width: 214
|
||||||
@@ -1151,14 +1239,6 @@ MonoBehaviour:
|
|||||||
m_Y: 500
|
m_Y: 500
|
||||||
m_Width: 48
|
m_Width: 48
|
||||||
m_Height: 136
|
m_Height: 136
|
||||||
- m_X: 498
|
|
||||||
m_Y: 940
|
|
||||||
m_Width: 1549
|
|
||||||
m_Height: 1107
|
|
||||||
- m_X: 498
|
|
||||||
m_Y: 888
|
|
||||||
m_Width: 1288
|
|
||||||
m_Height: 1159
|
|
||||||
- m_X: 1982
|
- m_X: 1982
|
||||||
m_Y: 696
|
m_Y: 696
|
||||||
m_Width: 65
|
m_Width: 65
|
||||||
@@ -1175,38 +1255,10 @@ MonoBehaviour:
|
|||||||
m_Y: 558
|
m_Y: 558
|
||||||
m_Width: 123
|
m_Width: 123
|
||||||
m_Height: 70
|
m_Height: 70
|
||||||
- m_X: 1255
|
|
||||||
m_Y: 628
|
|
||||||
m_Width: 97
|
|
||||||
m_Height: 1419
|
|
||||||
- m_X: 1255
|
|
||||||
m_Y: 748
|
|
||||||
m_Width: 291
|
|
||||||
m_Height: 1299
|
|
||||||
- m_X: 822
|
- m_X: 822
|
||||||
m_Y: 490
|
m_Y: 490
|
||||||
m_Width: 17
|
m_Width: 17
|
||||||
m_Height: 143
|
m_Height: 143
|
||||||
- m_X: 641
|
|
||||||
m_Y: 736
|
|
||||||
m_Width: 181
|
|
||||||
m_Height: 1311
|
|
||||||
- m_X: 1011
|
|
||||||
m_Y: 633
|
|
||||||
m_Width: 9
|
|
||||||
m_Height: 1414
|
|
||||||
- m_X: 498
|
|
||||||
m_Y: 885
|
|
||||||
m_Width: 1048
|
|
||||||
m_Height: 1162
|
|
||||||
- m_X: 1011
|
|
||||||
m_Y: 880
|
|
||||||
m_Width: 535
|
|
||||||
m_Height: 1167
|
|
||||||
- m_X: 498
|
|
||||||
m_Y: 754
|
|
||||||
m_Width: 324
|
|
||||||
m_Height: 1293
|
|
||||||
- m_X: 1965
|
- m_X: 1965
|
||||||
m_Y: 0
|
m_Y: 0
|
||||||
m_Width: 82
|
m_Width: 82
|
||||||
@@ -1215,6 +1267,62 @@ MonoBehaviour:
|
|||||||
m_Y: 0
|
m_Y: 0
|
||||||
m_Width: 34
|
m_Width: 34
|
||||||
m_Height: 444
|
m_Height: 444
|
||||||
|
- m_X: 1438
|
||||||
|
m_Y: 940
|
||||||
|
m_Width: 609
|
||||||
|
m_Height: 1107
|
||||||
|
- m_X: 1438
|
||||||
|
m_Y: 888
|
||||||
|
m_Width: 348
|
||||||
|
m_Height: 1159
|
||||||
|
- m_X: 1255
|
||||||
|
m_Y: 628
|
||||||
|
m_Width: 97
|
||||||
|
m_Height: 120
|
||||||
|
- m_X: 1438
|
||||||
|
m_Y: 748
|
||||||
|
m_Width: 108
|
||||||
|
m_Height: 1299
|
||||||
|
- m_X: 498
|
||||||
|
m_Y: 754
|
||||||
|
m_Width: 143
|
||||||
|
m_Height: 1293
|
||||||
|
- m_X: 229
|
||||||
|
m_Y: 944
|
||||||
|
m_Width: 412
|
||||||
|
m_Height: 1103
|
||||||
|
- m_X: 1011
|
||||||
|
m_Y: 633
|
||||||
|
m_Width: 9
|
||||||
|
m_Height: 247
|
||||||
|
- m_X: 1189
|
||||||
|
m_Y: 997
|
||||||
|
m_Width: 858
|
||||||
|
m_Height: 1050
|
||||||
|
- m_X: 1189
|
||||||
|
m_Y: 880
|
||||||
|
m_Width: 66
|
||||||
|
m_Height: 1167
|
||||||
|
- m_X: 821
|
||||||
|
m_Y: 736
|
||||||
|
m_Width: 1
|
||||||
|
m_Height: 149
|
||||||
|
- m_X: 229
|
||||||
|
m_Y: 1134
|
||||||
|
m_Width: 1818
|
||||||
|
m_Height: 913
|
||||||
|
- m_X: 1005
|
||||||
|
m_Y: 1126
|
||||||
|
m_Width: 1042
|
||||||
|
m_Height: 921
|
||||||
|
- m_X: 229
|
||||||
|
m_Y: 985
|
||||||
|
m_Width: 592
|
||||||
|
m_Height: 1062
|
||||||
|
- m_X: 1005
|
||||||
|
m_Y: 885
|
||||||
|
m_Width: 6
|
||||||
|
m_Height: 1162
|
||||||
m_FontFeatureTable:
|
m_FontFeatureTable:
|
||||||
m_MultipleSubstitutionRecords: []
|
m_MultipleSubstitutionRecords: []
|
||||||
m_LigatureSubstitutionRecords:
|
m_LigatureSubstitutionRecords:
|
||||||
@@ -13852,7 +13960,7 @@ Texture2D:
|
|||||||
m_ColorSpace: 1
|
m_ColorSpace: 1
|
||||||
m_PlatformBlob:
|
m_PlatformBlob:
|
||||||
image data: 4194304
|
image data: 4194304
|
||||||
_typelessdata: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204050506070809090807060505040301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103040505060708090908070605050402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020405050607080909080706050504030100000000000000000000000000000000000000000000000000000000000000000000000000000003050607080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808Line truncated
|
_typelessdata: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204050506070809090807060505040301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103040505060708090908070605050402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020405050607080909080706050504030100000000000000000000000000000000000000000000000000000000000000000000000000000003050607080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808Line truncated
|
||||||
m_StreamData:
|
m_StreamData:
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
offset: 0
|
offset: 0
|
||||||
|
|||||||
Binary file not shown.
@@ -18,4 +18,4 @@ MonoBehaviour:
|
|||||||
walkClipSpeed: 1
|
walkClipSpeed: 1
|
||||||
runClip: {fileID: 0}
|
runClip: {fileID: 0}
|
||||||
runClipSpeed: 1
|
runClipSpeed: 1
|
||||||
ceilingYOffset: 1
|
ceilingYOffset: 0.84
|
||||||
+133
-119
@@ -352,7 +352,7 @@ Transform:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 172071430}
|
m_GameObject: {fileID: 172071430}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_LocalRotation: {x: 0.1305262, y: 5.7946933e-12, z: -2.6404215e-12, w: 0.9914449}
|
m_LocalRotation: {x: 0.13052616, y: 0.000000029547364, z: -0.000000003889983, w: 0.9914449}
|
||||||
m_LocalPosition: {x: 0, y: 1.9146858, z: -4.3466663}
|
m_LocalPosition: {x: 0, y: 1.9146858, z: -4.3466663}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
@@ -754,6 +754,118 @@ Transform:
|
|||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 347639557}
|
m_Father: {fileID: 347639557}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1 &286369291
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 286369292}
|
||||||
|
- component: {fileID: 286369295}
|
||||||
|
- component: {fileID: 286369294}
|
||||||
|
- component: {fileID: 286369293}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Ground
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 2147483647
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &286369292
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 286369291}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: -0.5, z: 11.5}
|
||||||
|
m_LocalScale: {x: 50, y: 1, z: 50}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 686187287}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!65 &286369293
|
||||||
|
BoxCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 286369291}
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 0
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_Size: {x: 1, y: 1, z: 1}
|
||||||
|
m_Center: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!23 &286369294
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 286369291}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 1
|
||||||
|
m_ReceiveShadows: 1
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RayTracingMode: 2
|
||||||
|
m_RayTraceProcedural: 0
|
||||||
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_RendererPriority: 0
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_ReceiveGI: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 1
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_MaskInteraction: 0
|
||||||
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
|
--- !u!33 &286369295
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 286369291}
|
||||||
|
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
--- !u!1 &330585543
|
--- !u!1 &330585543
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -841,7 +953,7 @@ Transform:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 330585543}
|
m_GameObject: {fileID: 330585543}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_LocalRotation: {x: 0.1305262, y: 5.543152e-12, z: -7.2976987e-13, w: 0.9914449}
|
m_LocalRotation: {x: 0.13052616, y: 0.000000029547365, z: -0.000000003889983, w: 0.9914449}
|
||||||
m_LocalPosition: {x: 0, y: 1.9146858, z: -4.3466663}
|
m_LocalPosition: {x: 0, y: 1.9146858, z: -4.3466663}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
@@ -1492,7 +1604,7 @@ Transform:
|
|||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 721670973}
|
- {fileID: 286369292}
|
||||||
- {fileID: 963088882}
|
- {fileID: 963088882}
|
||||||
- {fileID: 1680244260}
|
- {fileID: 1680244260}
|
||||||
- {fileID: 1981625995}
|
- {fileID: 1981625995}
|
||||||
@@ -1598,119 +1710,6 @@ PhysicsMaterial:
|
|||||||
m_Bounciness: 0
|
m_Bounciness: 0
|
||||||
m_FrictionCombine: 0
|
m_FrictionCombine: 0
|
||||||
m_BounceCombine: 0
|
m_BounceCombine: 0
|
||||||
--- !u!1 &721670969
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 721670973}
|
|
||||||
- component: {fileID: 721670972}
|
|
||||||
- component: {fileID: 721670971}
|
|
||||||
- component: {fileID: 721670970}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Plane
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 2147483647
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!64 &721670970
|
|
||||||
MeshCollider:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 721670969}
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_IncludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_ExcludeLayers:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 0
|
|
||||||
m_LayerOverridePriority: 0
|
|
||||||
m_IsTrigger: 0
|
|
||||||
m_ProvidesContacts: 0
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 5
|
|
||||||
m_Convex: 0
|
|
||||||
m_CookingOptions: 30
|
|
||||||
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!23 &721670971
|
|
||||||
MeshRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 721670969}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 1
|
|
||||||
m_ReceiveShadows: 1
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 2
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
|
||||||
m_SmallMeshCulling: 1
|
|
||||||
m_ForceMeshLod: -1
|
|
||||||
m_MeshLodSelectionBias: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 3
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_GlobalIlluminationMeshLod: 0
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 0
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
|
||||||
--- !u!33 &721670972
|
|
||||||
MeshFilter:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 721670969}
|
|
||||||
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
|
|
||||||
--- !u!4 &721670973
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 721670969}
|
|
||||||
serializedVersion: 2
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 11.5}
|
|
||||||
m_LocalScale: {x: 5, y: 5, z: 5}
|
|
||||||
m_ConstrainProportionsScale: 1
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 686187287}
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &829281440
|
--- !u!1 &829281440
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -2171,9 +2170,8 @@ MonoBehaviour:
|
|||||||
deceleration: 45
|
deceleration: 45
|
||||||
cameraRelative: 1
|
cameraRelative: 1
|
||||||
cameraTransform: {fileID: 0}
|
cameraTransform: {fileID: 0}
|
||||||
runningParameter: Running
|
|
||||||
rotateTowardMovement: 1
|
rotateTowardMovement: 1
|
||||||
rotationSpeed: 360
|
rotationSpeed: 540
|
||||||
jumpHeight: 1.2
|
jumpHeight: 1.2
|
||||||
gravity: -14.715
|
gravity: -14.715
|
||||||
groundedStickVelocity: -2
|
groundedStickVelocity: -2
|
||||||
@@ -2235,7 +2233,7 @@ MonoBehaviour:
|
|||||||
m_EditorClassIdentifier: Assembly-CSharp::ConcealmentMeter
|
m_EditorClassIdentifier: Assembly-CSharp::ConcealmentMeter
|
||||||
targetRenderer: {fileID: 0}
|
targetRenderer: {fileID: 0}
|
||||||
characterRoot: {fileID: 0}
|
characterRoot: {fileID: 0}
|
||||||
voxelResolution: 24
|
voxelResolution: 48
|
||||||
environmentMask:
|
environmentMask:
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_Bits: 4294967295
|
m_Bits: 4294967295
|
||||||
@@ -3210,6 +3208,22 @@ PrefabInstance:
|
|||||||
propertyPath: m_ApplyRootMotion
|
propertyPath: m_ApplyRootMotion
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6701818411356282361, guid: c2044ff1352a6bb4586d6d04b59012b7, type: 3}
|
||||||
|
propertyPath: m_LocalScale.x
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6701818411356282361, guid: c2044ff1352a6bb4586d6d04b59012b7, type: 3}
|
||||||
|
propertyPath: m_LocalScale.y
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6701818411356282361, guid: c2044ff1352a6bb4586d6d04b59012b7, type: 3}
|
||||||
|
propertyPath: m_LocalScale.z
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6701818411356282361, guid: c2044ff1352a6bb4586d6d04b59012b7, type: 3}
|
||||||
|
propertyPath: m_ConstrainProportionsScale
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
|
|||||||
@@ -23,6 +23,11 @@ using UnityEngine.InputSystem;
|
|||||||
/// horizontal plane camera-relative (like on the ground). Jump (or reaching a ceiling edge)
|
/// horizontal plane camera-relative (like on the ground). Jump (or reaching a ceiling edge)
|
||||||
/// lets go and drops.
|
/// lets go and drops.
|
||||||
///
|
///
|
||||||
|
/// On the ground the same mouse scheme fine-tunes a pose without moving the capsule: holding the
|
||||||
|
/// left mouse button and dragging up/down raises/lowers the visual mesh, holding the right mouse
|
||||||
|
/// button and dragging left/right turns the body. The raise eases back while walking and holds while
|
||||||
|
/// standing; the turn holds until movement re-aims the body. Both pause the camera orbit while held.
|
||||||
|
///
|
||||||
/// Named PlayerCharacterController to avoid a clash with Unity.VisualScripting's
|
/// Named PlayerCharacterController to avoid a clash with Unity.VisualScripting's
|
||||||
/// example "PlayerController".
|
/// example "PlayerController".
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -32,10 +37,10 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
{
|
{
|
||||||
[Header("Movement")]
|
[Header("Movement")]
|
||||||
[Tooltip("Horizontal movement speed (units/second).")]
|
[Tooltip("Horizontal movement speed (units/second).")]
|
||||||
public float moveSpeed = 4f;
|
public float moveSpeed = 2f;
|
||||||
|
|
||||||
[Tooltip("Speed multiplier applied to ground movement and wall/ceiling climbing 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;
|
public float sprintSpeedMultiplier = 3.2f;
|
||||||
|
|
||||||
[Tooltip("How quickly ground movement ramps up to the target speed (units/second²). Lower = more gradual start.")]
|
[Tooltip("How quickly ground movement ramps up to the target speed (units/second²). Lower = more gradual start.")]
|
||||||
public float acceleration = 30f;
|
public float acceleration = 30f;
|
||||||
@@ -49,22 +54,19 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
[Tooltip("Camera used for camera-relative movement. Empty = Camera.main.")]
|
[Tooltip("Camera used for camera-relative movement. Empty = Camera.main.")]
|
||||||
public Transform cameraTransform;
|
public Transform cameraTransform;
|
||||||
|
|
||||||
[Tooltip("Animator bool parameter driven true while running on the ground (false in air and while wall/ceiling-climbing).")]
|
|
||||||
public string runningParameter = "Running";
|
|
||||||
|
|
||||||
[Header("Rotation")]
|
[Header("Rotation")]
|
||||||
[Tooltip("Smoothly turn the character to face its movement direction.")]
|
[Tooltip("Smoothly turn the character to face its movement direction.")]
|
||||||
public bool rotateTowardMovement = true;
|
public bool rotateTowardMovement = true;
|
||||||
|
|
||||||
[Tooltip("Turn speed in degrees per second.")]
|
[Tooltip("Turn speed in degrees per second.")]
|
||||||
public float rotationSpeed = 720f;
|
public float rotationSpeed = 540f;
|
||||||
|
|
||||||
[Header("Jump & Gravity")]
|
[Header("Jump & Gravity")]
|
||||||
[Tooltip("Peak jump height in units.")]
|
[Tooltip("Peak jump height in units.")]
|
||||||
public float jumpHeight = 1.2f;
|
public float jumpHeight = 1.2f;
|
||||||
|
|
||||||
[Tooltip("Gravity in units per second squared (negative = downward).")]
|
[Tooltip("Gravity in units per second squared (negative = downward).")]
|
||||||
public float gravity = -19.62f;
|
public float gravity = -14.715f;
|
||||||
|
|
||||||
[Tooltip("Small downward velocity kept while grounded for reliable ground contact.")]
|
[Tooltip("Small downward velocity kept while grounded for reliable ground contact.")]
|
||||||
public float groundedStickVelocity = -2f;
|
public float groundedStickVelocity = -2f;
|
||||||
@@ -89,7 +91,7 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
|
|
||||||
[Tooltip("Minimum surface angle from 'up' (degrees) that counts as a climbable wall/ceiling rather than a slope.")]
|
[Tooltip("Minimum surface angle from 'up' (degrees) that counts as a climbable wall/ceiling rather than a slope.")]
|
||||||
[Range(50f, 180f)]
|
[Range(50f, 180f)]
|
||||||
public float wallMinAngle = 80f;
|
public float wallMinAngle = 60f;
|
||||||
|
|
||||||
[Tooltip("How directly the move input must point into a wall to grab it (0 = any inward nudge, 1 = head-on only). Stops mere contact (e.g. standing at a wall's base) from grabbing.")]
|
[Tooltip("How directly the move input must point into a wall to grab it (0 = any inward nudge, 1 = head-on only). Stops mere contact (e.g. standing at a wall's base) from grabbing.")]
|
||||||
[Range(0f, 1f)]
|
[Range(0f, 1f)]
|
||||||
@@ -101,16 +103,16 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
|
|
||||||
[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.")]
|
[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)]
|
[Min(0f)]
|
||||||
public float wallMantleSpeedMultiplier = 0.5f;
|
public float wallMantleSpeedMultiplier = 1.5f;
|
||||||
|
|
||||||
[Tooltip("Farthest the mesh can lean out from the wall via the mouse-drag offset (units).")]
|
[Tooltip("Farthest the mesh can lean out from the wall via the mouse-drag offset (units).")]
|
||||||
public float wallMaxOffset = .2f;
|
public float wallMaxOffset = 0.1f;
|
||||||
|
|
||||||
[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.")]
|
[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;
|
public float wallMaxInset = 0.2f;
|
||||||
|
|
||||||
[Tooltip("Units the lean-out offset changes per pixel of vertical mouse drag (left button held).")]
|
[Tooltip("Units the lean-out offset changes per pixel of vertical mouse drag (left button held).")]
|
||||||
public float wallOffsetSensitivity = 0.01f;
|
public float wallOffsetSensitivity = 0.001f;
|
||||||
|
|
||||||
[Tooltip("Degrees the body turns per pixel of horizontal mouse drag (left button held) while climbing.")]
|
[Tooltip("Degrees the body turns per pixel of horizontal mouse drag (left button held) while climbing.")]
|
||||||
public float wallRotateSensitivity = 0.2f;
|
public float wallRotateSensitivity = 0.2f;
|
||||||
@@ -128,7 +130,7 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
public float ceilingGrabDistance = 0.3f;
|
public float ceilingGrabDistance = 0.3f;
|
||||||
|
|
||||||
[Tooltip("Upward hop when topping out over a wall/slope edge, so holding W carries you onto the ledge instead of dropping back onto the face and re-grabbing. In meters of jump height; 0 = no hop.")]
|
[Tooltip("Upward hop when topping out over a wall/slope edge, so holding W carries you onto the ledge instead of dropping back onto the face and re-grabbing. In meters of jump height; 0 = no hop.")]
|
||||||
public float wallTopOutBoost = 1.2f;
|
public float wallTopOutBoost = 0.3f;
|
||||||
|
|
||||||
[Tooltip("Camera orbit input; paused while dragging the wall-climb offset. Auto-found if empty.")]
|
[Tooltip("Camera orbit input; paused while dragging the wall-climb offset. Auto-found if empty.")]
|
||||||
[SerializeField] private ThirdPersonOrbitInput cameraOrbit;
|
[SerializeField] private ThirdPersonOrbitInput cameraOrbit;
|
||||||
@@ -172,17 +174,25 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool AnimatorOverridden { get; set; }
|
public bool AnimatorOverridden { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The visual-model transform moved by the wall-lean / ceiling offset; its localPosition is owned
|
||||||
|
/// solely by <see cref="SetMeshLean"/>. Exposed so <see cref="PlayerPoseController"/> can exclude it
|
||||||
|
/// from its per-frame rest reset — with the humanoid rig the Animator sits on this same node, so it
|
||||||
|
/// lands in the reset subtree and would otherwise be snapped back to base every frame, wiping the offset.
|
||||||
|
/// </summary>
|
||||||
|
public Transform MeshOffsetTarget => meshOffsetTarget;
|
||||||
|
|
||||||
// Below this horizontal speed (m/s, squared) the character counts as idle for the run animation.
|
// Below this horizontal speed (m/s, squared) the character counts as idle for the run animation.
|
||||||
private const float RunningSpeedThresholdSqr = 0.04f; // (0.2 m/s)^2
|
private const float RunningSpeedThresholdSqr = 0.04f; // (0.2 m/s)^2
|
||||||
|
|
||||||
private CharacterController _controller;
|
private CharacterController _controller;
|
||||||
private int _runningHash;
|
|
||||||
private float _verticalVelocity;
|
private float _verticalVelocity;
|
||||||
private Vector3 _horizontalVelocity; // smoothed horizontal move velocity (accel/decel ramp)
|
private Vector3 _horizontalVelocity; // smoothed horizontal move velocity (accel/decel ramp)
|
||||||
private bool _sprinting; // sprint key state this frame (exposed via IsSprinting)
|
private bool _sprinting; // sprint key state this frame (exposed via IsSprinting)
|
||||||
private bool _isIdle; // snapshot: player essentially still this frame (exposed via IsIdle)
|
private bool _isIdle; // snapshot: player essentially still this frame (exposed via IsIdle)
|
||||||
private bool _movingOnGround; // snapshot: grounded & moving above the run threshold (exposed via IsMovingOnGround)
|
private bool _movingOnGround; // snapshot: grounded & moving above the run threshold (exposed via IsMovingOnGround)
|
||||||
private float _poseYOffset; // local-up model offset from the active pose (ceiling only); folded into SetMeshLean
|
private float _poseYOffset; // local-up model offset from the active pose (ceiling only); folded into SetMeshLean
|
||||||
|
private float _groundOffset; // signed vertical mesh raise from the ground mouse pose-adjust (+ up / - down); folded into SetMeshLean
|
||||||
|
|
||||||
// Ground contact normal from the latest Move (for slope sliding).
|
// Ground contact normal from the latest Move (for slope sliding).
|
||||||
private Vector3 _groundNormal = Vector3.up;
|
private Vector3 _groundNormal = Vector3.up;
|
||||||
@@ -219,7 +229,6 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
void Awake()
|
void Awake()
|
||||||
{
|
{
|
||||||
_controller = GetComponent<CharacterController>();
|
_controller = GetComponent<CharacterController>();
|
||||||
_runningHash = Animator.StringToHash(runningParameter);
|
|
||||||
if (!cameraTransform && Camera.main)
|
if (!cameraTransform && Camera.main)
|
||||||
cameraTransform = Camera.main.transform;
|
cameraTransform = Camera.main.transform;
|
||||||
if (!cameraOrbit)
|
if (!cameraOrbit)
|
||||||
@@ -318,10 +327,20 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ground pose-adjust (mouse): left button + vertical drag raises/lowers the mesh, right
|
||||||
|
// button + horizontal drag turns the body -- the wall scheme mirrored to the ground. Either
|
||||||
|
// pauses the camera orbit so the same drag isn't also spent orbiting. Gated to player control
|
||||||
|
// so it never fights painting (paint mode owns the left button).
|
||||||
|
bool groundYawDrag = false;
|
||||||
|
if (ControlEnabled)
|
||||||
|
groundYawDrag = HandleGroundPoseAdjust(h, v, Time.deltaTime);
|
||||||
|
else
|
||||||
|
_offsetDragging = false;
|
||||||
if (cameraOrbit)
|
if (cameraOrbit)
|
||||||
cameraOrbit.LookSuppressed = false;
|
cameraOrbit.LookSuppressed = _offsetDragging;
|
||||||
|
|
||||||
// Glide the leftover wall lean back to the authored pose (set when leaving the wall).
|
// Glide the leftover wall lean home and re-apply the composed mesh offset (residual lean +
|
||||||
|
// ground raise + pose y-offset) in this frame's single write of meshOffsetTarget.
|
||||||
EaseMeshOffsetToRest(Time.deltaTime);
|
EaseMeshOffsetToRest(Time.deltaTime);
|
||||||
|
|
||||||
// A ground normal steeper than the slope limit is too steep to stand on
|
// A ground normal steeper than the slope limit is too steep to stand on
|
||||||
@@ -371,7 +390,8 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
if (!_groundNormalUpdated)
|
if (!_groundNormalUpdated)
|
||||||
_groundNormal = Vector3.up;
|
_groundNormal = Vector3.up;
|
||||||
|
|
||||||
if (rotateTowardMovement && moveDir.sqrMagnitude > 0.0001f)
|
// Face the movement direction, unless the right-button turn is actively steering the body.
|
||||||
|
if (rotateTowardMovement && !groundYawDrag && moveDir.sqrMagnitude > 0.0001f)
|
||||||
{
|
{
|
||||||
Quaternion target = Quaternion.LookRotation(moveDir, Vector3.up);
|
Quaternion target = Quaternion.LookRotation(moveDir, Vector3.up);
|
||||||
transform.rotation = Quaternion.RotateTowards(
|
transform.rotation = Quaternion.RotateTowards(
|
||||||
@@ -431,6 +451,7 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
_verticalVelocity = 0f;
|
_verticalVelocity = 0f;
|
||||||
_slideSpeed = 0f;
|
_slideSpeed = 0f;
|
||||||
_wallOffset = 0f;
|
_wallOffset = 0f;
|
||||||
|
_groundOffset = 0f; // drop any ground pose-adjust raise so it doesn't ride onto the wall
|
||||||
_meshOffsetResidual = 0f; // fresh grab: the climb path owns the mesh, drop any leftover ease
|
_meshOffsetResidual = 0f; // fresh grab: the climb path owns the mesh, drop any leftover ease
|
||||||
_wallYaw = 0f;
|
_wallYaw = 0f;
|
||||||
_wallStrafeSign = 0;
|
_wallStrafeSign = 0;
|
||||||
@@ -446,8 +467,9 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
/// <see cref="_wallOffset"/> (capsule stays put), and the right
|
/// <see cref="_wallOffset"/> (capsule stays put), and the right
|
||||||
/// mouse button + horizontal drag turns the body via <see cref="_wallYaw"/>. On a
|
/// 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
|
/// 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
|
/// (like on the ground), facing the move direction unless the right mouse button + horizontal
|
||||||
/// ceiling. Surface normal and gap are re-measured each frame; reaching a wall's top edge
|
/// drag turns it; 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.
|
/// mantles, climbing a wall up into an overhang hands off to the ceiling.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void ApplyWallClimbMovement(float h, float v, Vector3 moveDir, bool jumpPressed, bool sprinting, float dt)
|
private void ApplyWallClimbMovement(float h, float v, Vector3 moveDir, bool jumpPressed, bool sprinting, float dt)
|
||||||
@@ -565,9 +587,10 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
|
|
||||||
// Left button + vertical drag sets the lean offset (mouse up = out from the surface, mouse
|
// 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
|
// 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
|
// the wall where the capsule can't); right button + horizontal drag turns the body. The
|
||||||
// only). The offset eases back to zero while moving and never detaches, the turn is held
|
// offset eases back to zero while moving and never detaches. On a WALL the turn is a held
|
||||||
// until leaving the wall. Either drag pauses the camera orbit.
|
// yaw offset from the wall normal (kept until leaving); on a CEILING the body is free like
|
||||||
|
// on the ground, so the drag rotates the transform directly. Either drag pauses the orbit.
|
||||||
bool offsetDrag = found && IsLeftMouseHeld();
|
bool offsetDrag = found && IsLeftMouseHeld();
|
||||||
bool yawDrag = found && IsRightMouseHeld();
|
bool yawDrag = found && IsRightMouseHeld();
|
||||||
if (offsetDrag || yawDrag)
|
if (offsetDrag || yawDrag)
|
||||||
@@ -577,7 +600,12 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
if (offsetDrag)
|
if (offsetDrag)
|
||||||
_wallOffset = Mathf.Clamp(_wallOffset - drag.y * wallOffsetSensitivity, -wallMaxInset, wallMaxOffset);
|
_wallOffset = Mathf.Clamp(_wallOffset - drag.y * wallOffsetSensitivity, -wallMaxInset, wallMaxOffset);
|
||||||
if (yawDrag)
|
if (yawDrag)
|
||||||
_wallYaw += drag.x * wallRotateSensitivity;
|
{
|
||||||
|
if (onCeiling)
|
||||||
|
transform.Rotate(0f, drag.x * wallRotateSensitivity, 0f, Space.World);
|
||||||
|
else
|
||||||
|
_wallYaw += drag.x * wallRotateSensitivity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!offsetDrag && hasMoveInput)
|
if (!offsetDrag && hasMoveInput)
|
||||||
{
|
{
|
||||||
@@ -632,14 +660,18 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
{
|
{
|
||||||
if (onCeiling)
|
if (onCeiling)
|
||||||
{
|
{
|
||||||
// Stay upright and face the horizontal move direction, like on the ground.
|
// Stay upright and face the horizontal move direction, like on the ground -- unless
|
||||||
Vector3 dir = alongSurface;
|
// the right-button turn is actively steering the body (then the manual yaw holds).
|
||||||
dir.y = 0f;
|
if (!yawDrag)
|
||||||
if (dir.sqrMagnitude > 1e-4f)
|
|
||||||
{
|
{
|
||||||
Quaternion target = Quaternion.LookRotation(dir.normalized, Vector3.up);
|
Vector3 dir = alongSurface;
|
||||||
transform.rotation = Quaternion.RotateTowards(
|
dir.y = 0f;
|
||||||
transform.rotation, target, rotationSpeed * dt);
|
if (dir.sqrMagnitude > 1e-4f)
|
||||||
|
{
|
||||||
|
Quaternion target = Quaternion.LookRotation(dir.normalized, Vector3.up);
|
||||||
|
transform.rotation = Quaternion.RotateTowards(
|
||||||
|
transform.rotation, target, rotationSpeed * dt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -651,9 +683,7 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
if (faceWall.sqrMagnitude > 0.0001f)
|
if (faceWall.sqrMagnitude > 0.0001f)
|
||||||
{
|
{
|
||||||
Vector3 dir = Quaternion.AngleAxis(_wallYaw, Vector3.up) * faceWall.normalized;
|
Vector3 dir = Quaternion.AngleAxis(_wallYaw, Vector3.up) * faceWall.normalized;
|
||||||
Quaternion target = Quaternion.LookRotation(dir, Vector3.up);
|
transform.rotation = Quaternion.LookRotation(dir, Vector3.up);
|
||||||
transform.rotation = Quaternion.RotateTowards(
|
|
||||||
transform.rotation, target, rotationSpeed * dt);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -678,21 +708,58 @@ public partial class PlayerCharacterController : MonoBehaviour
|
|||||||
Vector3 worldOffset = dir * offset;
|
Vector3 worldOffset = dir * offset;
|
||||||
meshOffsetTarget.localPosition = _meshBaseLocalPos
|
meshOffsetTarget.localPosition = _meshBaseLocalPos
|
||||||
+ transform.InverseTransformVector(worldOffset)
|
+ transform.InverseTransformVector(worldOffset)
|
||||||
+ Vector3.up * _poseYOffset; // active pose's ceiling y-offset (0 except while hanging on a ceiling)
|
+ Vector3.up * (_poseYOffset + _groundOffset); // ceiling pose y-offset + ground mouse raise (both 0 unless in use)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Eases the leftover lean back to the authored pose after leaving the wall, so the model glides
|
/// Re-applies the resting mesh offset every non-climbing frame in a single write of
|
||||||
/// home instead of snapping. Runs every non-climbing frame at the same rate as the in-climb
|
/// <see cref="meshOffsetTarget"/>: eases the leftover wall lean back toward the authored pose
|
||||||
/// return; the direction is the wall normal latched at exit (a fresh grab clears the residual).
|
/// (latched exit normal) while composing in the ground mouse raise and any pose y-offset. Writing
|
||||||
|
/// unconditionally (even at rest) keeps this the sole owner of the offset transform, so a held
|
||||||
|
/// ground raise stays applied after the residual has reached zero. Offset 0 restores the pose.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void EaseMeshOffsetToRest(float dt)
|
private void EaseMeshOffsetToRest(float dt)
|
||||||
{
|
{
|
||||||
if (_meshOffsetResidual == 0f) return;
|
if (_meshOffsetResidual != 0f)
|
||||||
_meshOffsetResidual = Mathf.MoveTowards(_meshOffsetResidual, 0f, wallOffsetReturnSpeed * dt);
|
_meshOffsetResidual = Mathf.MoveTowards(_meshOffsetResidual, 0f, wallOffsetReturnSpeed * dt);
|
||||||
SetMeshLean(_meshOffsetExitNormal, _meshOffsetResidual);
|
SetMeshLean(_meshOffsetExitNormal, _meshOffsetResidual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ground pose-adjust via the mouse, mirroring the wall-climb scheme: holding the LEFT button and
|
||||||
|
/// dragging up/down raises/lowers the visual mesh vertically (<see cref="_groundOffset"/>, capsule
|
||||||
|
/// untouched), holding the RIGHT button and dragging left/right turns the body (world-up yaw). The
|
||||||
|
/// raise eases back to the authored height while moving and holds while standing or dragging; the
|
||||||
|
/// turn persists until movement re-aims the body. Returns true while a right-button turn is active
|
||||||
|
/// so the caller skips auto-rotate-toward-movement that frame. Call site gates on ControlEnabled so
|
||||||
|
/// paint mode keeps the left button for painting.
|
||||||
|
/// </summary>
|
||||||
|
private bool HandleGroundPoseAdjust(float h, float v, float dt)
|
||||||
|
{
|
||||||
|
_offsetDragging = false;
|
||||||
|
|
||||||
|
bool offsetDrag = IsLeftMouseHeld();
|
||||||
|
bool yawDrag = IsRightMouseHeld();
|
||||||
|
bool hasMoveInput = (h * h + v * v) > 1e-4f;
|
||||||
|
|
||||||
|
if (offsetDrag || yawDrag)
|
||||||
|
{
|
||||||
|
_offsetDragging = true;
|
||||||
|
Vector2 drag = ReadMouseDelta();
|
||||||
|
if (offsetDrag)
|
||||||
|
_groundOffset = Mathf.Clamp(
|
||||||
|
_groundOffset + drag.y * wallOffsetSensitivity, -wallMaxInset, wallMaxOffset);
|
||||||
|
if (yawDrag)
|
||||||
|
transform.Rotate(0f, drag.x * wallRotateSensitivity, 0f, Space.World);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The raise eases home only while actually moving; standing still holds it for posing.
|
||||||
|
if (!offsetDrag && hasMoveInput)
|
||||||
|
_groundOffset = Mathf.MoveTowards(_groundOffset, 0f, wallOffsetReturnSpeed * dt);
|
||||||
|
|
||||||
|
return yawDrag;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets a local-up offset applied to the visual model only, composed into the wall-lean's single
|
/// Sets a local-up offset applied to the visual model only, composed into the wall-lean's single
|
||||||
/// write of <see cref="meshOffsetTarget"/>. Used by <see cref="PlayerPoseController"/> to hang a
|
/// write of <see cref="meshOffsetTarget"/>. Used by <see cref="PlayerPoseController"/> to hang a
|
||||||
|
|||||||
@@ -89,8 +89,9 @@ public partial class PlayerPoseController : MonoBehaviour
|
|||||||
// evaluates. An AnimationClipPlayable only writes the bones its curves cover, so a clip that
|
// evaluates. An AnimationClipPlayable only writes the bones its curves cover, so a clip that
|
||||||
// doesn't key a bone (an empty clip like the T-pose, or a partial one) would otherwise leave that
|
// doesn't key a bone (an empty clip like the T-pose, or a partial one) would otherwise leave that
|
||||||
// bone frozen on the previous animation. Restoring this before each pose start makes every pose
|
// bone frozen on the previous animation. Restoring this before each pose start makes every pose
|
||||||
// define the full body. meshOffsetTarget is an ancestor of the Animator, so it is never in this
|
// define the full body. The controller's model-offset transform (meshOffsetTarget) is explicitly
|
||||||
// set and the controller's lean/ceiling offset stays untouched.
|
// dropped from this set in CaptureRestPose — with the humanoid rig the Animator sits on that node,
|
||||||
|
// so it is the root of this subtree, and resetting it would wipe the wall-lean / ceiling offset.
|
||||||
private Transform[] _restBones;
|
private Transform[] _restBones;
|
||||||
private Vector3[] _restPos;
|
private Vector3[] _restPos;
|
||||||
private Quaternion[] _restRot;
|
private Quaternion[] _restRot;
|
||||||
@@ -336,6 +337,20 @@ public partial class PlayerPoseController : MonoBehaviour
|
|||||||
_restRot[i] = t.localRotation;
|
_restRot[i] = t.localRotation;
|
||||||
_restScale[i] = t.localScale;
|
_restScale[i] = t.localScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Drop the model-offset transform from the reset set so the per-frame ResetToRestPose never
|
||||||
|
// touches it: the wall-lean / ceiling offset (PlayerCharacterController.SetMeshLean) is its sole
|
||||||
|
// writer. With the humanoid rig the Animator shares this node, putting it in the captured subtree;
|
||||||
|
// resetting it each frame is exactly what was wiping the offsets. Nulling the slot makes
|
||||||
|
// ResetToRestPose's null-guard skip it. _player is resolved (and meshOffsetTarget too, since the
|
||||||
|
// controller's Awake runs first at its lower execution order) before this runs.
|
||||||
|
Transform offsetTarget = _player ? _player.MeshOffsetTarget : null;
|
||||||
|
if (offsetTarget)
|
||||||
|
{
|
||||||
|
int idx = System.Array.IndexOf(_restBones, offsetTarget);
|
||||||
|
if (idx >= 0)
|
||||||
|
_restBones[idx] = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Restores the captured rest pose so an empty or partial pose clip fully defines the body.</summary>
|
/// <summary>Restores the captured rest pose so an empty or partial pose clip fully defines the body.</summary>
|
||||||
|
|||||||
Reference in new issue
Block a user