自动操控架构图
操控框架类职责
Steering类
public abstract class Steering : MonoBehaviour
{
//速度
public float speed;
//目标
public Transform target;
//运动体
[HideInInspector]
public Vehicle vehicle;
//期望操控力
[HideInInspector]
public Vector3 exceptForce;
//权重
public float weight=1;
private void Start()
{
Init();
}
//初始化
public virtual void Init()
{
vehicle = GetComponent<Vehicle>();
if (speed == 0)
speed = vehicle.maxSpeed;
}
public abstract Vector3 ComputerFinalForce();
}
Vehicle类
///<summary>
///运动体
///</summary>
public class Vehicle : MonoBehaviour
{
/// <summary>当前操控力</summary>
public Vector3 currentForce;
/// <summary>最大移动速度</summary>
public float maxSpeed=10;
/// <summary>质量</summary>
public float mass=1;
/// <summary>加速度</summary>
[HideInInspector]
public float AcceleratedSpeed;
/// <summary>转向速度</summary>
public float rotationSpeed=5;
/// <summary>合力</summary>
public Vector3 finalForce;
/// <summary>最大合力</summary>
public float maxForce=100;
/// <summary>操控对象</summary>
public Steering[] steerings;
/// <summary>是否是平面</summary>
public bool isPlane;
//计算合力的间隔事件
public float computerInterval=0.2f;
private void Start()
{
steerings = GetComponents<Steering>();
InvokeRepeating("CalculateFinalForce", 0, computerInterval);
}
public void CalculateFinalForce()
{
//合力清零
finalForce = Vector3.zero;
//遍历所有的操控对象
for (int i = 0; i < steerings.Length; i++)
{
//将每个操控对象计算的操控力叠加在一起形成合力
finalForce += steerings[i].ComputerFinalForce();
}
if (finalForce == Vector3.zero) currentForce = Vector3.zero;
if (isPlane)
{
finalForce.y = 0;
currentForce.y = 0;
}
//对合力做最大化的钳制
// if(finalForce.magnitude>maxForce)
// finalForce = finalForce.normalized * maxForce;
finalForce=Vector3.ClampMagnitude(finalForce, maxForce);
//合力除以质量得到最后的加速度(合力)
finalForce = finalForce / mass;
}
}
LocomotionController类
///<summary>
///操控控制器
///</summary>
public class LocomotionController : Vehicle
{
//移动
public void MoveMent()
{
currentForce += finalForce * Time.deltaTime;
//currentForce不能超过maxspeed
//if(currentForce.magnitude<maxSpeed)
currentForce = Vector3.ClampMagnitude(currentForce, maxSpeed);
transform.position += currentForce * Time.deltaTime;
//Vector3.MoveTowards(transform.position, currentForce, currentForce.magnitude);
}
//转向
public void Rotation()
{
if(currentForce!=Vector3.zero)
{
//转向当前操控li
var dir = Quaternion.LookRotation(currentForce);
transform.rotation = Quaternion.Lerp(transform.rotation, dir, rotationSpeed * Time.deltaTime);
}
}
public void PlayAnimation()
{
}
private void Update()
{
Rotation();
MoveMent();
PlayAnimation();
}
}