1.Seek(靠近)与Flee(逃离)操控行为
- Seek
-
指定一个目标位置,根据当前的运动速度,返回一个操纵AI角色到达该目标位置的操控力,使得AI角色自动向该位置移动。
-
实现Seek的技术原理
-
-
使一个游戏对象靠近Target需要根据游戏当前的运动速度给它返回一个到达目标位置的操控力(Steering)
所以我需要按照上图来实现对Steering速度的实现- 由上图可知:
desiredVelocity=(target.position-this.transform.position).normalized * max-velocity(最大速度).
steering =desiredVelocity-currentVelocity.
- 由上图可知:
2.根据上图得出的公式,进行编程
- 首先先创建一个空物体然后把它改名为Target,为了使它能在场景中被看见给它指定一个红颜色的Icon。
- 接着在游戏对象Cube上添加Seek的脚本对Cube的行为进行控制。
- 脚本编写逻辑:
- 首先我们需要得到物体的最大速度,以及Seek的Target目标位置,以及物体的速度Vector3
- 接着我们进行SeekAI的实现:
- 首先根据原理图得到的公式来得到desiredVelocity以及Steering
- 这里的操控力以速度表示接着需要求出操控力速度的加速度,将物体的速度进行改变
- 接着设置偏转,进行插值运算
- 为能更好的看到Seek实现的效果,使用Debug.DrawLine来进行物体运动轨迹的绘制。
- 定义一个Vector3的List来保存物体运动的位置,以及一个timer来计时
- 接着在Update里实现
最后游戏运行效果如下图所示:红色为物体的运动轨迹:
Paste_Image.png3. Flee(逃离AI)的实现:
-
Flee和Seek相反,Flee产生一个操控智能体离开的力,而不是产品靠近的操控力
-
原理图:
-
原理转换为代码
desiredVelocity=this.transform.position-Target.position
FleeSteering=desiredVelocity-CurrentVelocity. -
可以看出只有desiredVelocity是之前Seek的负值其他实现都一样。
-
那就只需把Seek代码的desiredVelocity进行修改就可以得到Flee
Flee的实现效果.
- 物体对Target进行了逃离
源码来自蛮牛“寒江独钓9527”老师,谢谢。
网友评论