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”老師,謝謝。