128 lines
4.5 KiB
C#
128 lines
4.5 KiB
C#
using UnityEngine;
|
|
|
|
namespace Invector.vCharacterController
|
|
{
|
|
public class vThirdPersonController : vThirdPersonAnimator
|
|
{
|
|
public virtual void ControlAnimatorRootMotion()
|
|
{
|
|
if (!this.enabled) return;
|
|
|
|
if (inputSmooth == Vector3.zero)
|
|
{
|
|
transform.position = animator.rootPosition;
|
|
transform.rotation = animator.rootRotation;
|
|
}
|
|
|
|
if (useRootMotion)
|
|
MoveCharacter(moveDirection);
|
|
}
|
|
|
|
public virtual void ControlLocomotionType()
|
|
{
|
|
if (lockMovement) return;
|
|
|
|
if (locomotionType.Equals(LocomotionType.FreeWithStrafe) && !isStrafing || locomotionType.Equals(LocomotionType.OnlyFree))
|
|
{
|
|
SetControllerMoveSpeed(freeSpeed);
|
|
SetAnimatorMoveSpeed(freeSpeed);
|
|
}
|
|
else if (locomotionType.Equals(LocomotionType.OnlyStrafe) || locomotionType.Equals(LocomotionType.FreeWithStrafe) && isStrafing)
|
|
{
|
|
isStrafing = true;
|
|
SetControllerMoveSpeed(strafeSpeed);
|
|
SetAnimatorMoveSpeed(strafeSpeed);
|
|
}
|
|
|
|
if (!useRootMotion)
|
|
MoveCharacter(moveDirection);
|
|
}
|
|
|
|
public virtual void ControlRotationType()
|
|
{
|
|
if (lockRotation) return;
|
|
|
|
bool validInput = input != Vector3.zero || (isStrafing ? strafeSpeed.rotateWithCamera : freeSpeed.rotateWithCamera);
|
|
|
|
if (validInput)
|
|
{
|
|
// calculate input smooth
|
|
inputSmooth = Vector3.Lerp(inputSmooth, input, (isStrafing ? strafeSpeed.movementSmooth : freeSpeed.movementSmooth) * Time.deltaTime);
|
|
|
|
Vector3 dir = (isStrafing && (!isSprinting || sprintOnlyFree == false) || (freeSpeed.rotateWithCamera && input == Vector3.zero)) && rotateTarget ? rotateTarget.forward : moveDirection;
|
|
RotateToDirection(dir);
|
|
}
|
|
}
|
|
|
|
public virtual void UpdateMoveDirection(Transform referenceTransform = null)
|
|
{
|
|
if (input.magnitude <= 0.01)
|
|
{
|
|
moveDirection = Vector3.Lerp(moveDirection, Vector3.zero, (isStrafing ? strafeSpeed.movementSmooth : freeSpeed.movementSmooth) * Time.deltaTime);
|
|
return;
|
|
}
|
|
|
|
if (referenceTransform && !rotateByWorld)
|
|
{
|
|
//get the right-facing direction of the referenceTransform
|
|
var right = referenceTransform.right;
|
|
right.y = 0;
|
|
//get the forward direction relative to referenceTransform Right
|
|
var forward = Quaternion.AngleAxis(-90, Vector3.up) * right;
|
|
// determine the direction the player will face based on input and the referenceTransform's right and forward directions
|
|
moveDirection = (inputSmooth.x * right) + (inputSmooth.z * forward);
|
|
}
|
|
else
|
|
{
|
|
moveDirection = new Vector3(inputSmooth.x, 0, inputSmooth.z);
|
|
}
|
|
}
|
|
|
|
public virtual void Sprint(bool value)
|
|
{
|
|
var sprintConditions = (input.sqrMagnitude > 0.1f && isGrounded &&
|
|
!(isStrafing && !strafeSpeed.walkByDefault && (horizontalSpeed >= 0.5 || horizontalSpeed <= -0.5 || verticalSpeed <= 0.1f)));
|
|
|
|
if (value && sprintConditions)
|
|
{
|
|
if (input.sqrMagnitude > 0.1f)
|
|
{
|
|
if (isGrounded && useContinuousSprint)
|
|
{
|
|
isSprinting = !isSprinting;
|
|
}
|
|
else if (!isSprinting)
|
|
{
|
|
isSprinting = true;
|
|
}
|
|
}
|
|
else if (!useContinuousSprint && isSprinting)
|
|
{
|
|
isSprinting = false;
|
|
}
|
|
}
|
|
else if (isSprinting)
|
|
{
|
|
isSprinting = false;
|
|
}
|
|
}
|
|
|
|
public virtual void Strafe()
|
|
{
|
|
isStrafing = !isStrafing;
|
|
}
|
|
|
|
public virtual void Jump()
|
|
{
|
|
// trigger jump behaviour
|
|
jumpCounter = jumpTimer;
|
|
isJumping = true;
|
|
|
|
// trigger jump animations
|
|
if (input.sqrMagnitude < 0.1f)
|
|
animator.CrossFadeInFixedTime("Jump", 0.1f);
|
|
else
|
|
animator.CrossFadeInFixedTime("JumpMove", .2f);
|
|
}
|
|
}
|
|
} |