BITFALL/Assets/Artists/Scripts/Entity/KinematicMovement/KinematicMovementStates/Climb.cs

89 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BITKit;
using BITFALL.Entites;
using KinematicCharacterController;
using BITKit.StateMachine;
using UnityEngine.InputSystem;
using BITKit.Animations;
using BITKit.Sensors;
namespace BITFALL.Entites.KinematicMovementStates
{
[System.Serializable]
public class ClimbBox : KinematicMovementState
{
public UnityAnimator animator;
[SerializeReference, SubclassSelector] public References _vault;
bool isEntied;
Vector3 startPos;
public override void OnStateEnter(IState old)
{
isEntied = false;
motor.ForceUnground();
motor.SetCapsuleCollisionsActivation(false);
motor.SetGroundSolvingActivation(false);
motor.SetMovementCollisionsSolvingActivation(false);
controller.groundState.shouldBe = true;
controller.groundState.Release();
startPos = motor.TransientPosition;
}
public override void OnStateExit(IState old, IState newState)
{
base.OnStateExit(old, newState);
motor.SetCapsuleCollisionsActivation(true);
motor.SetGroundSolvingActivation(true);
motor.SetMovementCollisionsSolvingActivation(true);
}
public override void BeforeCharacterUpdate(float deltaTime)
{
if (animator[0].fullStateName != _vault)
{
controller.entity.Invoke(Constant.Animation.Play, _vault.Get());
}
//if (animator.animator.IsInTransition(0) is false)
/* animator.animator.MatchTarget(
controller.matchTargetPosition,
motor.TransientRotation,
AvatarTarget.LeftFoot,
new MatchTargetWeightMask(Vector3.one, 1)
, 0.4f, 0.6f); */
}
public override void AfterCharacterUpdate(float deltaTime)
{
base.AfterCharacterUpdate(deltaTime);
//if (animator.animator.IsInTransition(0) is false)
{
if (animator[0].fullStateName == _vault)
{
if (isEntied && animator[0].currentState.normalizedTime > 1f)
{
TransitionState<Movement>();
}
isEntied = true;
}
}
controller.jumpState.shouldBe=false;
}
public override void UpdateVelocity(ref Vector3 currentVelocity, float deltaTime)
{
//if (animator.animator.IsInTransition(0) is false)
// currentVelocity = animator.GetRootVelocity();
//currentVelocity=animator.animator.velocity;
if (animator[0].fullStateName == _vault)
if (animator.animator.IsInTransition(0) is false)
{
var normalizedTime = animator[0].currentState.normalizedTime;
var direction = Vector3.Lerp(startPos, controller.matchTargetPosition, normalizedTime);
var linear = currentVelocity = (direction - motor.TransientPosition) / deltaTime;
var rootVelocity = animator.GetRootVelocity();
currentVelocity = Vector3 .Lerp(rootVelocity, linear, normalizedTime);
}
}
}
}