142 lines
3.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|