Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/ECM2/Examples/Slide/PlayerCharacter.cs
2026-03-04 09:37:33 +08:00

142 lines
3.3 KiB
C#

using UnityEngine;
namespace ECM2.Examples.Slide
{
public class PlayerCharacter : Character
{
private enum ECustomMovementMode
{
Sliding = 1
}
[Space(15f)]
public float slideImpulse = 20f;
public float slideDownAcceleration = 20f;
public override float GetMaxSpeed()
{
if (!IsSliding())
{
return base.GetMaxSpeed();
}
return base.maxWalkSpeed;
}
public override float GetMaxAcceleration()
{
if (!IsSliding())
{
return base.GetMaxAcceleration();
}
return base.maxAcceleration * 0.1f;
}
public override bool IsWalking()
{
if (!IsSliding())
{
return base.IsWalking();
}
return true;
}
public bool IsSliding()
{
if (base.movementMode == MovementMode.Custom)
{
return base.customMovementMode == 1;
}
return false;
}
protected virtual bool CanSlide()
{
if (!IsGrounded())
{
return false;
}
float sqrMagnitude = base.velocity.sqrMagnitude;
float num = base.maxWalkSpeedCrouched * base.maxWalkSpeedCrouched;
return sqrMagnitude >= num * 1.02f;
}
protected virtual Vector3 CalcSlideDirection()
{
Vector3 vector = GetMovementDirection();
if (vector.isZero())
{
vector = GetVelocity();
}
else if (vector.isZero())
{
vector = GetForwardVector();
}
return ConstrainInputVector(vector).normalized;
}
protected virtual void CheckSlideInput()
{
bool flag = IsSliding();
bool flag2 = base.crouchInputPressed;
if (!flag && flag2 && CanSlide())
{
SetMovementMode(MovementMode.Custom, 1);
}
else if (flag && (!flag2 || !CanSlide()))
{
SetMovementMode(MovementMode.Walking);
}
}
protected override void OnMovementModeChanged(MovementMode prevMovementMode, int prevCustomMode)
{
base.OnMovementModeChanged(prevMovementMode, prevCustomMode);
if (IsSliding())
{
Vector3 vector = CalcSlideDirection();
base.characterMovement.velocity += vector * slideImpulse;
SetRotationMode(RotationMode.None);
}
if (prevMovementMode == MovementMode.Custom && prevCustomMode == 1)
{
SetRotationMode(RotationMode.OrientRotationToMovement);
if (IsFalling())
{
Vector3 onNormal = -GetGravityDirection();
Vector3 vector2 = Vector3.Project(base.velocity, onNormal);
Vector3 vector3 = Vector3.ClampMagnitude(base.velocity - vector2, base.maxWalkSpeed);
base.characterMovement.velocity = vector3 + vector2;
}
}
}
protected override void OnBeforeSimulationUpdate(float deltaTime)
{
base.OnBeforeSimulationUpdate(deltaTime);
CheckSlideInput();
}
protected virtual void SlidingMovementMode(float deltaTime)
{
Vector3 desiredVelocity = Vector3.Project(GetDesiredVelocity(), GetRightVector());
base.characterMovement.velocity = CalcVelocity(base.characterMovement.velocity, desiredVelocity, base.groundFriction * 0.2f, isFluid: false, deltaTime);
Vector3 normalized = Vector3.ProjectOnPlane(GetGravityDirection(), base.characterMovement.groundNormal).normalized;
base.characterMovement.velocity += slideDownAcceleration * deltaTime * normalized;
if (base.applyStandingDownwardForce)
{
ApplyDownwardsForce();
}
}
protected override void CustomMovementMode(float deltaTime)
{
base.CustomMovementMode(deltaTime);
if (base.customMovementMode == 1)
{
SlidingMovementMode(deltaTime);
}
}
}
}