Unity GameAI-(3)Seek And Flee

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容