Unity GameAI-(3)Seek And Flee

作者: Levi_Wan | 来源:发表于2016-12-06 14:28 被阅读164次

    1.Seek(靠近)与Flee(逃离)操控行为

    • Seek
      • 指定一个目标位置,根据当前的运动速度,返回一个操纵AI角色到达该目标位置的操控力,使得AI角色自动向该位置移动。

      • 实现Seek的技术原理

    Paste_Image.png
    • 使一个游戏对象靠近Target需要根据游戏当前的运动速度给它返回一个到达目标位置的操控力(Steering)
      所以我需要按照上图来实现对Steering速度的实现

      • 由上图可知:
        desiredVelocity=(target.position-this.transform.position).normalized * max-velocity(最大速度).
        steering =desiredVelocity-currentVelocity.

    2.根据上图得出的公式,进行编程

    • 首先先创建一个空物体然后把它改名为Target,为了使它能在场景中被看见给它指定一个红颜色的Icon。
    Paste_Image.png
    • 接着在游戏对象Cube上添加Seek的脚本对Cube的行为进行控制。
    Paste_Image.png
    • 脚本编写逻辑:
      • 首先我们需要得到物体的最大速度,以及Seek的Target目标位置,以及物体的速度Vector3
    Paste_Image.png
    • 接着我们进行SeekAI的实现:
    • 首先根据原理图得到的公式来得到desiredVelocity以及Steering
    Paste_Image.png
    • 这里的操控力以速度表示接着需要求出操控力速度的加速度,将物体的速度进行改变
    Paste_Image.png
    • 接着设置偏转,进行插值运算
    Paste_Image.png
    • 为能更好的看到Seek实现的效果,使用Debug.DrawLine来进行物体运动轨迹的绘制。
      • 定义一个Vector3的List来保存物体运动的位置,以及一个timer来计时
    Paste_Image.png
    • 接着在Update里实现
    Paste_Image.png Paste_Image.png

    最后游戏运行效果如下图所示:红色为物体的运动轨迹:

    Paste_Image.png

    3. Flee(逃离AI)的实现:

    • Flee和Seek相反,Flee产生一个操控智能体离开的力,而不是产品靠近的操控力

    • 原理图:

    Paste_Image.png
    • 原理转换为代码
      desiredVelocity=this.transform.position-Target.position
      FleeSteering=desiredVelocity-CurrentVelocity.

    • 可以看出只有desiredVelocity是之前Seek的负值其他实现都一样。

    • 那就只需把Seek代码的desiredVelocity进行修改就可以得到Flee

    Paste_Image.png

    Flee的实现效果.

    • 物体对Target进行了逃离
    Paste_Image.png

    源码来自蛮牛“寒江独钓9527”老师,谢谢。

    相关文章

      网友评论

      本文标题:Unity GameAI-(3)Seek And Flee

      本文链接:https://www.haomeiwen.com/subject/cnkrmttx.html