2022-08-08 11:38:05 +03:00

86 lines
3.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
public abstract class MovingState : PlayerState
{
private float speed; //SO
private float laneSwitchSpeed; //SO
protected const float gravity = -9.8f;
private float invincibilityTime => playerSM.PlayerData.InvincibilityTime;
public MovingState(PlayerStateMachine playerStateMachine) : base(playerStateMachine)//, PlayerController controller
{
this.playerSM = playerStateMachine;
speed = playerData.Speed;
laneSwitchSpeed = playerData.LaneSwitchSpeed;
}
public override void OnStateEnter(){}
public override void OnStateExit() {}
public override void Tick()
{
HandleDirection();
playerSM.HorizontalDeltaPosition = speed * playerSM.PlayerTransform.forward * Time.deltaTime ;
playerSM.HorizontalDeltaPosition += playerSM.PlayerTransform.forward * speed * Time.deltaTime;
playerSM.UpdateDistance(playerSM.HorizontalDeltaPosition.z); //вынести в контроллер
SwitchLane();
ApplyGravity();
Vector3 deltaPosition = new Vector3(playerSM.HorizontalDeltaPosition.x,
playerSM.VerticalDeltaPosition,
playerSM.HorizontalDeltaPosition.z);
playerSM.Move(deltaPosition);
}
public void ApplyGravity()
{
playerSM.VerticalDeltaPosition += gravity * Time.deltaTime;
}
private void HandleDirection()
{
switch (playerSM.InputDirection)
{
case EInputDirection.RIGHT:
playerSM.IncreaseTargetLane();
break;
case EInputDirection.LEFT:
playerSM.DecreaseTargetLane();
break;
case EInputDirection.UP:
playerSM.SetState(playerSM.PlayerJumpState);
break;
case EInputDirection.DOWN:
playerSM.SetState(playerSM.PlayerSlideState);
break;
default:
break;
}
}
public void SwitchLane()
{
float sidewaysPos = playerTransform.localPosition.x;
Vector3 playerDirection = playerTransform.right;
float targetPos = playerSM.TargetPosition;
if (playerSM.IsOnTargetLane(sidewaysPos))
{
return;
}
Vector3 diffX = (targetPos - sidewaysPos) * playerDirection;
Debug.DrawLine(playerTransform.position, diffX, Color.green);
Vector3 deltaX = diffX.normalized * laneSwitchSpeed * Time.deltaTime;
Debug.DrawLine(playerTransform.position, deltaX, Color.red);
if (deltaX.sqrMagnitude < diffX.sqrMagnitude)
{
playerSM.HorizontalDeltaPosition += playerSM.PlayerTransform.right * deltaX.x;
}
else
{
playerSM.HorizontalDeltaPosition += playerSM.PlayerTransform.right * diffX.x;
}
}
}