PlayerVisual Customization

This commit is contained in:
2026-03-18 09:51:27 +01:00
parent 7058396d8e
commit 9d9d9ecb80
6 changed files with 195 additions and 126 deletions

View File

@@ -10,7 +10,7 @@ PrefabInstance:
m_Modifications: m_Modifications:
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: -0.8480131
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
@@ -18,23 +18,23 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
value: 0 value: 0.0050586592
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalRotation.w propertyPath: m_LocalRotation.w
value: 1 value: 0.9627553
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalRotation.x propertyPath: m_LocalRotation.x
value: 0 value: -0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
value: 0 value: 0.2703743
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: 0 value: -0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalEulerAnglesHint.x propertyPath: m_LocalEulerAnglesHint.x
@@ -42,7 +42,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalEulerAnglesHint.y propertyPath: m_LocalEulerAnglesHint.y
value: 0 value: 31.373
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - target: {fileID: -8679921383154817045, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
propertyPath: m_LocalEulerAnglesHint.z propertyPath: m_LocalEulerAnglesHint.z
@@ -59,7 +59,15 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 6268899434028451206} addedObject: {fileID: 6268899434028451206}
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
insertIndex: -1
addedObject: {fileID: 6551637819182465063}
m_SourcePrefab: {fileID: 100100000, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} m_SourcePrefab: {fileID: 100100000, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
--- !u!137 &4078132247542626195 stripped
SkinnedMeshRenderer:
m_CorrespondingSourceObject: {fileID: 6799780747793633427, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
m_PrefabInstance: {fileID: 7405539825535706880}
m_PrefabAsset: {fileID: 0}
--- !u!1 &7639418806218873425 stripped --- !u!1 &7639418806218873425 stripped
GameObject: GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3} m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 2b8eab5f9e0c5c649a40b323ec6d99db, type: 3}
@@ -87,3 +95,59 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1 m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0 m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0 m_WriteDefaultValuesOnDisable: 0
--- !u!114 &6551637819182465063
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7639418806218873425}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 93c4f218e1a930f4f86c5a26eb731a70, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::PlayerVisual
_customization:
Colors: []
_references:
Player: {fileID: 0}
Anim: {fileID: 6268899434028451206}
Renderers:
- {fileID: 4078132247542626195}
Materials:
- {fileID: 2100000, guid: b44589781f5e0e04c8ca5f190db42ada, type: 2}
- {fileID: 2100000, guid: 0c8bf99957763684b9f83d1f8b070549, type: 2}
- {fileID: 2100000, guid: 27e2a9836de184e4b9ac07a0099ff283, type: 2}
_playerAnimationStateMapper:
- PlayerState: 0
AnimatorState: move
BlockingState:
Trigger: trigger_move
- PlayerState: 1
AnimatorState: move
BlockingState:
Trigger: trigger_move
- PlayerState: 2
AnimatorState: jump
BlockingState: fall
Trigger: trigger_jump
- PlayerState: 3
AnimatorState: fall
BlockingState: jump
Trigger: trigger_fall
- PlayerState: 4
AnimatorState: stunned
BlockingState:
Trigger: trigger_stun
- PlayerState: 5
AnimatorState: die
BlockingState:
Trigger: trigger_die
- PlayerState: 6
AnimatorState: loose
BlockingState:
Trigger: trigger_loose
- PlayerState: 7
AnimatorState: win
BlockingState:
Trigger: trigger_win

View File

@@ -72,7 +72,6 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Player m_EditorClassIdentifier: Assembly-CSharp::Player
_settings: _settings:
Type: 0
Speed: 18 Speed: 18
JumpForce: 8 JumpForce: 8
RotationSpeed: 10 RotationSpeed: 10
@@ -80,6 +79,7 @@ MonoBehaviour:
GroundLayer: GroundLayer:
serializedVersion: 2 serializedVersion: 2
m_Bits: 64 m_Bits: 64
ExtraForcesDrag: 8
StateLogs: 0 StateLogs: 0
_references: _references:
Controller: {fileID: 2782052458842062556} Controller: {fileID: 2782052458842062556}
@@ -88,12 +88,8 @@ MonoBehaviour:
CurrentState: 0 CurrentState: 0
IsPaused: 0 IsPaused: 0
IsGrounded: 0 IsGrounded: 0
IsGravitySuspended: 0 Velocity: {x: 0, y: 0, z: 0}
VerticalVelocity: 0 Ground: {fileID: 0}
HorizontalVelocity: {x: 0, y: 0}
ExtraVelocity: {x: 0, y: 0, z: 0}
GroundVelocity: {x: 0, y: 0, z: 0}
GroundTransform: {fileID: 0}
--- !u!1001 &3220452639741296132 --- !u!1001 &3220452639741296132
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -102,6 +98,10 @@ PrefabInstance:
serializedVersion: 3 serializedVersion: 3
m_TransformParent: {fileID: 3550202301939281011} m_TransformParent: {fileID: 3550202301939281011}
m_Modifications: m_Modifications:
- target: {fileID: 6551637819182465063, guid: dce89e082ea7b9c48ab0fe0f0d38f147, type: 3}
propertyPath: _references.Player
value:
objectReference: {fileID: 4344386118898155814}
- target: {fileID: 7011957565800906987, guid: dce89e082ea7b9c48ab0fe0f0d38f147, type: 3} - target: {fileID: 7011957565800906987, guid: dce89e082ea7b9c48ab0fe0f0d38f147, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: 0

View File

@@ -1466,32 +1466,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: effa7acb4388bcf4381294d9134d23f6, type: 3} m_Script: {fileID: 11500000, guid: effa7acb4388bcf4381294d9134d23f6, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Springboqrd m_EditorClassIdentifier: Assembly-CSharp::Springboqrd
_force: 50 _force: 30
_duration: 0.8
_curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: -1.4231426
outSlope: -1.4231426
tangentMode: 0
weightedMode: 3
inWeight: 0
outWeight: 0.58424336
- serializedVersion: 3
time: 1
value: 0
inSlope: 0.0060086255
outSlope: 0.0060086255
tangentMode: 0
weightedMode: 3
inWeight: 0.39625585
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
_onJump: _onJump:
m_PersistentCalls: m_PersistentCalls:
m_Calls: m_Calls:
@@ -1506,7 +1481,7 @@ MonoBehaviour:
m_FloatArgument: 0 m_FloatArgument: 0
m_StringArgument: m_StringArgument:
m_BoolArgument: 0 m_BoolArgument: 0
m_CallState: 2 m_CallState: 0
--- !u!4 &388514092 stripped --- !u!4 &388514092 stripped
Transform: Transform:
m_CorrespondingSourceObject: {fileID: 3389128502618183018, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3} m_CorrespondingSourceObject: {fileID: 3389128502618183018, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3}
@@ -2625,64 +2600,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 553282937401526563, guid: b5c21a868c96fd847b25cfd6700dcab9, type: 3} m_CorrespondingSourceObject: {fileID: 553282937401526563, guid: b5c21a868c96fd847b25cfd6700dcab9, type: 3}
m_PrefabInstance: {fileID: 1002917971} m_PrefabInstance: {fileID: 1002917971}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &1058476794 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 5095245121602118741, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3}
m_PrefabInstance: {fileID: 8321447544296836963}
m_PrefabAsset: {fileID: 0}
--- !u!95 &1058476796 stripped
Animator:
m_CorrespondingSourceObject: {fileID: 8813195164535651202, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3}
m_PrefabInstance: {fileID: 8321447544296836963}
m_PrefabAsset: {fileID: 0}
--- !u!114 &1058476797
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1058476794}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 93c4f218e1a930f4f86c5a26eb731a70, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::PlayerVisual
_references:
Player: {fileID: 3488783991102291675}
Anim: {fileID: 1058476796}
_playerAnimationStateMapper:
- PlayerState: 0
AnimatorState: move
BlockingState:
Trigger: trigger_move
- PlayerState: 1
AnimatorState: move
BlockingState:
Trigger: trigger_move
- PlayerState: 2
AnimatorState: jump
BlockingState: fall
Trigger: trigger_jump
- PlayerState: 3
AnimatorState: fall
BlockingState: jump
Trigger: trigger_fall
- PlayerState: 4
AnimatorState: stunned
BlockingState:
Trigger: trigger_stun
- PlayerState: 5
AnimatorState: die
BlockingState:
Trigger: trigger_die
- PlayerState: 6
AnimatorState: loose
BlockingState:
Trigger: trigger_loose
- PlayerState: 7
AnimatorState: win
BlockingState:
Trigger: trigger_win
--- !u!1 &1080756049 --- !u!1 &1080756049
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -5985,17 +5902,6 @@ PrefabInstance:
m_AddedGameObjects: [] m_AddedGameObjects: []
m_AddedComponents: [] m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: dfb5576e46653d9419747f6c7e441ee4, type: 3} m_SourcePrefab: {fileID: 100100000, guid: dfb5576e46653d9419747f6c7e441ee4, type: 3}
--- !u!114 &3488783991102291675 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 4344386118898155814, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3}
m_PrefabInstance: {fileID: 8321447544296836963}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e2481070b28cbc44e84c75778af5844f, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Player
--- !u!1001 &5497189567890878294 --- !u!1001 &5497189567890878294
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -6279,10 +6185,7 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: 3389128502618183018, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3} - targetCorrespondingSourceObject: {fileID: 3389128502618183018, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 1080756050} addedObject: {fileID: 1080756050}
m_AddedComponents: m_AddedComponents: []
- targetCorrespondingSourceObject: {fileID: 5095245121602118741, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3}
insertIndex: -1
addedObject: {fileID: 1058476797}
m_SourcePrefab: {fileID: 100100000, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3} m_SourcePrefab: {fileID: 100100000, guid: 6c5886a0ad4a20042ad31e7317391355, type: 3}
--- !u!1660057539 &9223372036854775807 --- !u!1660057539 &9223372036854775807
SceneRoots: SceneRoots:

View File

@@ -302,6 +302,9 @@ public class Player : MonoBehaviour
_state.Ground = currentGround; _state.Ground = currentGround;
_lastPlatformPosition = _state.Ground.position; _lastPlatformPosition = _state.Ground.position;
_lastPlatformRotation = _state.Ground.rotation; _lastPlatformRotation = _state.Ground.rotation;
_impulseForce.y = _platformVelocity.y = 0;
return; return;
} }
@@ -342,9 +345,32 @@ public class Player : MonoBehaviour
private void SetGravity(float deltaTime) private void SetGravity(float deltaTime)
{ {
if (_state.IsGrounded && _state.Velocity.y < 0) if (_state.IsGrounded && _state.Velocity.y < 0)
{
_state.Velocity.y = STICK_FORCE; _state.Velocity.y = STICK_FORCE;
}
else if (_persistentForce.y <= 0) else if (_persistentForce.y <= 0)
_state.Velocity.y = Mathf.Max(_state.Velocity.y + GRAVITY * deltaTime, MAX_GRAVITY); {
if (_platformVelocity.y > 0)
{
_platformVelocity.y += GRAVITY * deltaTime;
if (_platformVelocity.y < 0)
_state.Velocity.y += _platformVelocity.y;
}
else if (_impulseForce.y > 0)
{
_impulseForce.y += GRAVITY * deltaTime;
if (_impulseForce.y < 0)
_state.Velocity.y += _impulseForce.y;
}
else
{
_state.Velocity.y += GRAVITY * deltaTime;
}
_state.Velocity.y = Mathf.Max(_state.Velocity.y, MAX_GRAVITY);
}
} }
private void SetVelocity(float deltaTime) private void SetVelocity(float deltaTime)
@@ -398,19 +424,25 @@ public class Player : MonoBehaviour
private void SetMovement(float deltaTime) private void SetMovement(float deltaTime)
{ {
Vector3 totalVelocity = _state.Velocity + _impulseForce + _persistentForce + _platformVelocity; Vector3 velocity = _state.Velocity + _impulseForce + _persistentForce + _platformVelocity;
_references.Controller.Move(totalVelocity * deltaTime); _references.Controller.Move(velocity * deltaTime);
// Decay impulse force // Decay impulse force
_impulseForce = Vector3.MoveTowards(_impulseForce, Vector3.zero, Vector3 impulseForce = Vector3.MoveTowards(_impulseForce, Vector3.zero, _settings.ExtraForcesDrag * deltaTime);
_settings.ExtraForcesDrag * deltaTime); impulseForce.y = _impulseForce.y;
_impulseForce = impulseForce;
// Decay inherited platform velocity — reset when back on ground // Decay inherited platform velocity — reset when back on ground
if (_state.IsGrounded) if (_state.IsGrounded)
{
_platformVelocity = Vector3.zero; _platformVelocity = Vector3.zero;
}
else else
_platformVelocity = Vector3.MoveTowards(_platformVelocity, Vector3.zero, {
_settings.ExtraForcesDrag * deltaTime); Vector3 platformVelocity = Vector3.MoveTowards(_platformVelocity, Vector3.zero, _settings.ExtraForcesDrag * deltaTime);
platformVelocity.y = _platformVelocity.y;
_platformVelocity = platformVelocity;
}
} }
private void SetState() private void SetState()

View File

@@ -3,11 +3,19 @@ using UnityEngine;
public class PlayerVisual : MonoBehaviour public class PlayerVisual : MonoBehaviour
{ {
[System.Serializable]
private class Customization
{
[ColorUsage(false, true)] public Color[] Colors;
}
[System.Serializable] [System.Serializable]
private class References private class References
{ {
public Player Player; public Player Player;
public Animator Anim; public Animator Anim;
public Renderer[] Renderers;
public Material[] Materials;
} }
[System.Serializable] [System.Serializable]
@@ -19,15 +27,20 @@ public class PlayerVisual : MonoBehaviour
public string Trigger; public string Trigger;
} }
[SerializeField]
private Customization _customization;
[SerializeField] [SerializeField]
private References _references; private References _references;
[SerializeField] [SerializeField]
private PlayerAnimationStateMapper[] _playerAnimationStateMapper; private PlayerAnimationStateMapper[] _playerAnimationStateMapper;
private const string PP_CUSTOM = "CustomPlayer";
void Start() void Start()
{ {
LoadCustom();
} }
void Update() void Update()
@@ -35,8 +48,54 @@ public class PlayerVisual : MonoBehaviour
UpdateAnimation(); UpdateAnimation();
} }
public void RandomizeCustom()
{
Debug.Log("randomize");
}
private void SetCustom()
{
foreach (Renderer rend in _references.Renderers)
{
foreach (Material mat in rend.materials)
{
Material sourceMat = _references.Materials.FirstOrDefault(m => mat.name.StartsWith(m.name));
if (sourceMat)
{
Color col = _customization.Colors[System.Array.IndexOf(_references.Materials, sourceMat)];
if (!mat.IsKeywordEnabled("_EMISSION"))
mat.color = col;
else
mat.SetColor("_EmissionColor", col);
}
}
}
}
private void LoadCustom()
{
if (!PlayerPrefs.HasKey(PP_CUSTOM))
return;
string json = PlayerPrefs.GetString(PP_CUSTOM);
_customization = JsonUtility.FromJson<Customization>(json);
SetCustom();
}
private void SaveCustom()
{
string json = JsonUtility.ToJson(_customization);
PlayerPrefs.SetString(PP_CUSTOM, json);
}
private void UpdateAnimation() private void UpdateAnimation()
{ {
if (!_references.Player)
return;
if (_references.Anim.IsInTransition(0)) if (_references.Anim.IsInTransition(0))
return; return;
@@ -61,4 +120,17 @@ public class PlayerVisual : MonoBehaviour
break; break;
} }
} }
public static Color ShiftHue(Color color, float hueShift)
{
Color.RGBToHSV(color, out float h, out float s, out float v);
h += hueShift / 360f;
h = Mathf.Repeat(h, 1f);
Color result = Color.HSVToRGB(h, s, v);
result.a = color.a;
return result;
}
} }

View File

@@ -3,9 +3,7 @@ using UnityEngine.Events;
public class Springboard : MonoBehaviour public class Springboard : MonoBehaviour
{ {
[SerializeField] private float _force = 60; [SerializeField] private float _force = 20;
[SerializeField] private float _duration = .4f;
[SerializeField] private AnimationCurve _curve = AnimationCurve.EaseInOut(0, 1, 1, 0);
[SerializeField] private UnityEvent _onJump; [SerializeField] private UnityEvent _onJump;
void OnTriggerEnter(Collider col) void OnTriggerEnter(Collider col)
@@ -13,7 +11,7 @@ public class Springboard : MonoBehaviour
if (Player.Instance && col.gameObject == Player.Instance.gameObject) if (Player.Instance && col.gameObject == Player.Instance.gameObject)
{ {
Debug.Log("Player triggered springboard"); Debug.Log("Player triggered springboard");
//Player.Instance.AddExtraForce(transform.up * _force, true, _duration, _curve); Player.Instance.AddForce(transform.up * _force);
_onJump?.Invoke(); _onJump?.Invoke();
} }
} }