注: 这种使用Rigidbody组件的 方式 ,不适合MMO服务器控制逻辑了, 服务器又没有Rigidbody组件的概念。
感兴趣的可以下载下来 跑一下(是下载源代码,不是release )
地址: https://github.com/SunGuangdong/unity-movement-ai
这个库有以下Movement AI : Arrive 抵达, Cohesion 凝聚, Collision Avoidance 碰撞避免, Evade 逃避, Flee 逃离, Follow Path 跟踪路径, Hide 隐藏, Interpose 插入(干预,管闲事), Offset Pursuit 偏移追求, Pursue 追求, Seek 寻求, Separation 分离, Velocity Match 速度匹配, Wall Avoidance 墙壁避免, andWander 漫游.
有的意思都是一样的, 区别是 是否与预测目标的接下来一段时间的位置然后做出正确的决定。
1 Arrive 直达目的地
这是一个公共运动AI脚本库,被称为指导行为Steering Behaviors。你可以使用这些脚本帮助npc在你的游戏中移动。
目前,库只在x/y方向上移动游戏对象。
就是从当前位置移动到目标位置:
Cube对象命名: ArriveUnit2
添加 Rigidbody 组件 。
子对象 Cube 用于表示方向
public class ArriveUnit2: MonoBehaviour
{
public Vector3 targetPosition;
private SteeringBasics2 steeringBasics;
private void Start()
{
steeringBasics = GetComponent<SteeringBasics2>();
}
private void Update()
{
// 计算线性加速度
Vector3 accel = steeringBasics.Arrive(targetPosition);
// 得到速度
steeringBasics.Steer(accel);
// 使当前的游戏对象的朝向 ,他要去的地方
steeringBasics.LookWhereYoureGoing();
}
}
另一个主要的脚本:
[RequireComponent (typeof (Rigidbody))]
public class SteeringBasics2 : MonoBehaviour {
public float maxVelocity = 3.5f;
/* 最大加速度 */
public float maxAcceleration = 10f;
/* 目标的半径, 意味着我们已经到达了 */
public float targetRadius = 0.005f;
/* 到这个距离时,开始减速 */
public float slowRadius = 1f;
/* 我们想要达到目标速度 所需时间 */
public float timeToTarget = 0.1f;
public float turnSpeed = 20f;
private Rigidbody rb;
public bool smoothing = true;
public int numSamplesForSmoothing = 5;
private Queue<Vector2> velocitySamples = new Queue<Vector2>();
void Start () {
rb = GetComponent<Rigidbody> ();
}
internal Vector3 Arrive(Vector3 targetPosition)
{
/* 得到 正确方向*/
Vecto