using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 同屏镜像玩家移动控制器
/// </summary>
public class ActorMoveController : MonoBehaviour
{
//是否激活状态
public bool isActive = false;
//加速度
public float acceleration = 0.1f;
//最大速度值
public float maxSpeed = 1;
//当前速度值
public float speed = 0f;
//方向矢量
public Vector3 direction = Vector3.forward;
//移动状态
public MoveState state;
//移动状态
public enum MoveState
{
//静止
Static,
//加速
Accelerate,
//匀速
Constant,
//减速
Decelerate
}
private Transform cacheTransform;
private void Awake()
{
cacheTransform = transform;
}
void Update()
{
if (!isActive)
return;
Vector3 nextPosition = cacheTransform.position;
switch(state)
{
case MoveState.Accelerate:
nextPosition = AccelerateMove();
if (Mathf.Approximately(speed, maxSpeed))
state = MoveState.Constant;
break;
case MoveState.Constant:
nextPosition = ConstantMove();
break;
case MoveState.Decelerate:
nextPosition = DecelerateMove();
if (Mathf.Approximately(speed, 0))
state = MoveState.Static;
break;
}
cacheTransform.position = nextPosition;
}
// 加速移动
private Vector3 AccelerateMove()
{
speed = Mathf.Min(speed, maxSpeed);
if (Mathf.Approximately(speed, maxSpeed))
return cacheTransform.position;
float a = speed < maxSpeed ? acceleration : 0;
float t = Time.deltaTime;
//初速度
float v0 = speed;
//末速度
float vt = v0 + a * t;
//位移
float s = v0 * t + 0.5f * a * t * t;
//重新设置当前速度值
speed = Mathf.Min(vt, maxSpeed);
//Next Position
Vector3 nextPosition = cacheTransform.position + direction * s;
return nextPosition;
}
// 减速移动
private Vector3 DecelerateMove()
{
speed = Mathf.Max(speed, 0);
if (Mathf.Approximately(speed, 0))
return cacheTransform.position;
float t = Time.deltaTime;
//加速度
float a = -acceleration;
//初速度
float v0 = speed;
//末速度
float vt = v0 + a * t;
//位移
float s = v0 * t + 0.5f * a * t * t;
//重新设置当前速度值
speed = Mathf.Max(vt, 0);
//Next Position
Vector3 nextPosition = cacheTransform.position + direction * s;
return nextPosition;
}
// 匀速移动
private Vector3 ConstantMove()
{
float s = speed * Time.deltaTime;
//Next Position
Vector3 nextPosition = cacheTransform.position + direction * s;
return nextPosition;
}
}