Unity Movement AI (二)

本文介绍了一个Unity运动AI库,包括Arrive、Cohesion、Collision Avoidance等多种行为。重点讨论了Evade、Interpose、Wall Avoidance、Offset Pursuit等策略,并提供了WanderAvoidUnit和CollisionAvoidance.cs脚本示例,用于在漫步中避免碰撞。此外,还涵盖了Flocking集群行为的实现。
摘要由CSDN通过智能技术生成


         感兴趣的可以下载下来  跑一下(是下载源代码,不是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>();
    }

    private void Update()
    {
        Vector3 accel = steeringBasics.Interpose(target1, target2);

        steeringBasics.Steer(accel);

        steeringBasics.LookWhereYoureGoing();
    }
}

SteeringBasics2 .c
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值