Unity練習(xí)2 - 《John Lemon's Haunted Jaunt》-6- 敵人動(dòng)態(tài) Observer

通過創(chuàng)建動(dòng)態(tài)(移動(dòng))的幽靈 (Ghost)來提高關(guān)卡的挑戰(zhàn)難度。幽靈將在鬼屋大廳內(nèi)游蕩以搜尋 JohnLemon。

首先,創(chuàng)建Ghost預(yù)制體。

? 給Ghost添加動(dòng)畫

  • Create > Animator Controller 命名為“Ghost”。
  • 展開 Ghost@Walk 模型資源,拖入Walk 動(dòng)畫
  • Ghost 游戲?qū)ο蟮腁nimator組件配置好Controller
  • 保存場景
image.png

? 向幽靈添加碰撞體

image.png

添加Capsule Collider 組件:

  • Center 屬性設(shè)置為 (0, 0.6, 0)
  • 將 Radius 改為 0.25
  • 將 Height 改為 1.2
image.png

? 添加 Rigidbody 組件

需要設(shè)置:與 JohnLemon 的碰撞不應(yīng)引起幽靈的任何移動(dòng)

image.png
  • 啟用 Is Kinematic (運(yùn)動(dòng)剛體不再受外力影響,但仍會(huì)與其他游戲?qū)ο笈鲎?

打磚塊 (Breakout) 游戲中的擋板便是運(yùn)動(dòng)剛體的完美示例:球從擋板上彈起,但擋板不受反彈的影響。

? 將幽靈 (Ghost) 設(shè)置為 Observer

首先,找到 Gargoyle 子項(xiàng)的 PointOfView ,將其做成一個(gè)預(yù)制件,以便石像鬼 (Gargoyle) 和幽靈 (Ghost) 預(yù)制件都可以引用它。

重新保存石像鬼 (Gargoyle) 預(yù)制件。

然后將 PointOfView 預(yù)制件拖到 Ghost 游戲?qū)ο笊希?/p>

image.png

幽靈需要向前直視,選擇 PointOfView 游戲?qū)ο蟮?Transform。

  • 將 Position 改為 (0, 0.75, 0.4)
  • 將 Rotation 改為 (0, 0, 0)。
image.png

? 設(shè)置 Nav Mesh Agent 組件

給 Ghost 游戲?qū)ο筇砑?Nav Mesh Agent 組件, Radius 改為 0.25。

該代理 (agent) 的高度也比幽靈高很多,但是由于環(huán)境中沒有天花板,所以這無關(guān)緊要,當(dāng)然你也把Height可以調(diào)低一點(diǎn),但這要新建Agent Type,還有新建 NavMesh Surface...。

Speed 改為 1.5米/秒, 3.5 米/秒的默認(rèn)速度非常快,因此會(huì)使游戲的難度有點(diǎn)過高。
Stopping Distance 改為 0.2。對(duì)于幽靈與路徑點(diǎn)的接近程度,您不需要太高的精確度,因此可以增加 Nav Mesh Agent 距其目標(biāo)的距離,并且仍然可以認(rèn)為自己已到達(dá)。

image.png

? 創(chuàng)建 WaypointPatrol 腳本

游戲中的幽靈將通過在一系列路徑點(diǎn)之間循環(huán)巡邏來實(shí)現(xiàn)移動(dòng),腳本命名為 WaypointPatrol,添加到 Ghost 游戲?qū)ο?。

需要設(shè)置幽靈應(yīng)該巡邏的路徑點(diǎn)。合理的做法是采用一組空游戲?qū)ο蟛⑺鼈兊奈恢糜米髀窂近c(diǎn)。

public Transform[] waypoints;

您想知道 Nav Mesh Agent 是否已到達(dá)其目標(biāo)。一種簡單的檢查方法是查看到目標(biāo)的剩余距離是否小于您先前在 Inspector 窗口中設(shè)置的停止距離。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class WaypointPatrol : MonoBehaviour
{
    public NavMeshAgent navMeshAgent;
    public Transform[] waypoints;

    int m_CurrentWaypointIndex;
    void Start()
    {
        //設(shè)置 Nav Mesh Agent 的初始目標(biāo)
        navMeshAgent.SetDestination(waypoints[0].position);
    }

    void Update()
    {
        if (navMeshAgent.remainingDistance < navMeshAgent.stoppingDistance)
        {
            m_CurrentWaypointIndex = (m_CurrentWaypointIndex + 1) % waypoints.Length;
            navMeshAgent.SetDestination(waypoints[m_CurrentWaypointIndex].position);
        }
    }
}
image.png

展開 Ghost 游戲?qū)ο蟛⑦x擇 PointOfView 子游戲?qū)ο?

image.png
  • 將 JohnLemon 拖到Player 字段上以便分配其 Transform 組件
  • GameEnding 拖到GameEnding 字段

您的敵人現(xiàn)在快完成了!您只需要添加更多的幽靈并分配它們的路徑點(diǎn),然后再添加幾個(gè)靜態(tài)的石像鬼。

? 場景中放置更多幽靈

創(chuàng)建四個(gè)重復(fù)的幽靈 (Ghost),并在關(guān)卡中填充移動(dòng)的敵人。

選擇 Ghost 游戲?qū)ο蟆?Ctrl + D (Windows) 或 CMD + D (macOS) 復(fù)制四個(gè)。

  • 第一個(gè)幽靈應(yīng)該在 JohnLemon 開始進(jìn)入的房間附近來回移動(dòng)。Position設(shè)置為 (-5.3, 0, -3.1)。
  • 第二個(gè)幽靈將會(huì)沿著一條長走廊來回移動(dòng),因此 JohnLemon 必須躲進(jìn)兩側(cè)房間才能通過。Position設(shè)置為 (1.5, 0, 4)。
  • 第三個(gè)幽靈將圍繞其中一間餐廳中的餐桌移動(dòng)。Position為 (3.2, 0, 6.5)。
  • 最后一個(gè)幽靈將在出口附近的臥室里四處走動(dòng),因此,如果 JohnLemon 走錯(cuò)了路,就會(huì)被抓住。 Position設(shè)置為(7.4, 0, -3)。
image.png

接下來需要?jiǎng)?chuàng)建并定位它們的路徑點(diǎn)。

? 創(chuàng)建和定位幽靈路徑點(diǎn)

路徑點(diǎn)只需要是空游戲?qū)ο蠹纯?。Create Empty,命名為“Waypoint”,總共創(chuàng)建十個(gè)路徑點(diǎn):Waypoint 到 Waypoint (9)

拖到Ghost 游戲?qū)ο蟮?Waypoints 字段:

image.png

第一個(gè)幽靈在其數(shù)組中有【兩個(gè)路徑點(diǎn)】,對(duì)這些路徑點(diǎn)進(jìn)行定位。該幽靈將在起始房間中來回移動(dòng)。

  • Waypoint 的Position為 (-5.3, 0, 6.7)。
  • Waypoint (1) 的Position為 (-5.5, 0, -4.5)。

第二個(gè)幽靈將在兩側(cè)有房間的走廊上來回移動(dòng)。

  • Waypoint (2) 的位置設(shè)置為 (1.2, 0, 7.7)。
  • Waypoint (3) 的位置設(shè)置為 (0.9, 0, -3.5)。

第三個(gè)幽靈將圍繞餐廳中的餐桌移動(dòng),并需要更多路徑點(diǎn)。

  • 將 Waypoint (4) 的位置設(shè)置為 (3.2, 0, 5.6)。
  • 將 Waypoint (5) 的位置設(shè)置為 (3.2, 0, 12.3)。
  • 將 Waypoint (6) 的位置設(shè)置為 (6.5, 0, 12.3)。
  • 將 Waypoint (7) 的位置設(shè)置為 (6.5, 0, 5.6)。

最后一個(gè)幽靈在右下方的臥室中。

  • 將 Waypoint (8) 的位置設(shè)置為 (3.2, 0, -5)。
  • 將 Waypoint (9) 的位置設(shè)置為 (7.4, 0, -2)

? 場景中放置更多石像鬼

復(fù)制兩個(gè) Gargoyle。

  • Gargoyle (1) 的Position為 (-2.6, 0, -8.5),在長走廊的最下端。
  • Gargoyle (1) 的Rotation為 (0, 30, 0)。
  • Gargoyle (2) 的Position為 (-4.8, 0, 10.6),位于餐廳旁邊走廊的拐角處,所以如果 JohnLemon 走錯(cuò)了路,就會(huì)被抓住。

? 合并編組

image.png

保存場景,運(yùn)行測試。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容