感兴趣的可以下载下来 跑一下(是下载源代码,不是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 漫游.
7 Evade 逃避;规避;逃脱
Evade 和 Flee 的区别,
首先 Evade 有使用到 Flee , 类似于 Pursue 使用 Seek 一样
真正的不同和意义是, 这个有预测的部分,根据目标的速度可以预测它的下一个位置在哪?
测试场景: 有意思,让 Seek 追着他, 然后 Evade 会逃脱
public class EvadeUnit : MonoBehaviour
{
public Rigidbody target;
private SteeringBasics steeringBasics;
private Evade evade;
void Start()
{
steeringBasics = GetComponent<SteeringBasics>();
evade = GetComponent<Evade>();
}
void Update()
{
Vector3 accel = evade.getSteering(target);
steeringBasics.steer(accel);
steeringBasics.lookWhereYoureGoing();
}
}
[RequireComponent(typeof(Flee))]
public class Evade : MonoBehaviour
{
/* // 未来预测的最大预测时间 */
public float maxPrediction = 1f;
private Flee flee;
// Use this for initialization
void Start()
{
flee = GetComponent<Flee>();
}
public Vector3 getSteering(Rigidbody target)
{
/* 计算到目标的距离 */
Vector3 displacement = target.position - transform.position;
float distance = displacement.magnitude;
/* 获得目标现在的速度 */
float speed = target.velocity.magnitude;
// 计算预测时间 (不能让预测时间能跑的距离 超过当前的距离)
float prediction;
if (speed <= distance / maxPrediction)
{
prediction = maxPrediction;
}
else
{
prediction = distance / speed;
// 目标到达角色前,将预测位置在往前一点
prediction *= 0.9f;
}
// 目标 : 在目标位置基础上添加预测的部分
Vector3 explicitTarget = target.position + target.velocity * prediction;
// 使用之前的逃离功能
return flee.getSteering(explicitTarget);
}
}
8 Interpose 干预;插入;调停
这个对象会想办法 走到两个 Wander 漫游对象中间 。
public class InterposeUnit2 : MonoBehaviour {
public Rigidbody target1;
public Rigidbody target2;
private SteeringBasics2 steeringBasics;
private void Start()
{
steeringBasics = GetComponent<SteeringBasics2>();
}