通過創(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
- 保存場景

? 向幽靈添加碰撞體

添加Capsule Collider 組件:
- Center 屬性設(shè)置為 (0, 0.6, 0)
- 將 Radius 改為 0.25
- 將 Height 改為 1.2

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

- 啟用 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>

幽靈需要向前直視,選擇 PointOfView 游戲?qū)ο蟮?Transform。
- 將 Position 改為 (0, 0.75, 0.4)
- 將 Rotation 改為 (0, 0, 0)。

? 設(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á)。

? 創(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);
}
}
}

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

- 將 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)。

接下來需要?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 字段:

第一個(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ì)被抓住。
? 合并編組

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