2019年3月13日 星期三

Unity教程--塔防模板--在塔防模板中設置舞台

確認過的版本:2017.2
難度:中級



介紹
現在我們已經創建了具有各種效果的塔和敵方代理,下一步是建立一個舞台,讓玩家可以建造塔以保護基地對抗這些敵人。



原形階段





在創建遊戲時,創建佔位符美術資產以進行早期設計工作通常是值得的。這使我們能夠確保系統和關卡設計按預期工作,然後投入時間和精力來製作在設計需要更改時的高質量美術作品。

為了展示開發過程的這個階段,入門套件包括第 1 關的原型版本。原型關卡與第 1 關大致相同,但環境藝術比在遊戲中可玩的最終版本簡單得多。原型完全由 Unity 編輯器中提供的3D基元素組成,而不是最終階段的複雜幾何世界。

從原型進入最後階段時,需要進行以下技術考慮以產生發布等級關卡:

模型擴展

舞台模型被擴展,以確保玩家永遠無法看到遊戲區域的邊界。

世界模型組合

關卡模型被分解成塊以確保它不會太大。比攝影機可看的範圍大得多的模型效率低,因為許多頂點都是在屏幕外繪製的。最好盡量避免這種情況,同時盡可能多地將世界組合成較少的模型,以最大限度地減少繪製和截圖成本。

碰撞模型

創建了單個近似碰撞模型。這樣,射彈將擊中世界物體,並在放置塔時將指標顯示到世界中。

刪除不可見的面

刪除了從世界物件中的不可見面。在大多數情況下,這包括物件底部的面。去除這些面可以減少過度繪製,從而降低性能,尤其是在低端設備上。

在從原型藝術資源過渡到最終的高保真資源時,應考慮上述步驟。遵循它們將導致一個高效且易於管理的關卡。使用這些步驟製作的舞台將包含所有必需的物件和元件,以確保舞台正常工作。

本教程的其餘部分重點介紹從空白Unity場景逐步創建舞台,並未廣泛涵蓋創建高質量藝術資源的過程。

關卡列表

如果我們希望玩家可以通過選單系統訪問我們的舞台,我們需要創建一個關卡列表並為其添加舞台。我們可以通過以下步驟實現此目的:
  • 從 Project 視窗中選擇 Create> Starter Kit> Level List
  • 將階段的詳細信息添加到 LevelList 可程式物件
舞台現在將出現在遊戲中的 Level Select 選單中。

了解 LevelList 可程式物件



關卡列表允許我們設置主選單中要顯示的關卡數,我們可以為每個階段設置以下信息:

ID

舞台在選單中的顯示順序。

Name

舞台的標題。

Description

一個簡短的字串,讓玩家了解舞台的內容。

場景名稱

包含舞台的場景的名稱。

設置幾何
  • 將大平面添加到先前創建的空白場景中。從 Hierarchy 視窗中,選擇 Create > 3D Object > Plane
  • 確保平面的 transform 位置設置為(0,0,0)
  • 將 3D 物件添加到舞台以建立草稿。立方體和圓柱體最適合這種情況。在 Hierarchy 視窗中,選擇Create> 3D Object> Cube / Cylinder
如果我們已經創建了更複雜的模型,我們可以繞過此步驟並使用它。

導航設置

為了使舞台幾何體可導航,我們需要建立導航。
  • 選擇平面或舞台模型
  • 在 Navigation 視窗中打開物件選項
  • 檢查 Navigation Static 選項
  • 將 Navigation Area 設置為 Walkable
  • 選擇代理不應通過的 3D 物件
  • 在 Navigation 視窗中打開物件選項
  • 檢查 Navigation Static 選項
  • 將 Navigation Area 設置為 Non-Walkable
  • 選擇 Bake NavMesh
Select



導航節點



為了讓敵人在舞台上移動,我們需要為他們設置節點,以便能夠從一個點到另一個點。如果代理人到達,節點還用於定義代理走到要傷害玩家基地的點和生成點。

我們可以通過向空遊戲物件添加 Node 元件來創建節點。讓我們創建一個模型,定義代理將在哪裡生成,並為代理提供一條路導航到的節點區域內的隨機點。能夠選擇隨機點有助於確保代理不會聚集到單個點。
  • 創建一個空的遊戲物件並將其命名為 Navigation Nodes 或類似的東西
  • 創建一個空的遊戲物件並使其成為 Navigation Nodes 的子物件,將其命名為 StartNode
  • 將 Node 元件添加到 Start 遊戲物件 (需要  Collider 所以執行第 6 步)
  • 點擊 Select/Add Mesh 按鈕
  • 將子遊戲物件模型調整為所需的形狀
  • 將 Sphere 或 Capsule Collider 元件添加到 StartNode 遊戲物件 
  • 勾選 Is Collider ( Trigger )選項
  • 確保 Collider 封裝節點模型
Node 元件允許我們添加一個新的模型,它會創建一個帶有 Area Mesh Creator 元件的子物件,我們可以在其中定義預設形狀或通過在舞台視圖中的角點之間單擊來為模型添加點。可以通過按住 shift 並點擊來移除點。




為了定義序列中的下一個節點,我們需要添加一個節點選擇器元件,一個固定節點選擇器,它將敵人發送到特定節點,或者一個隨機節點選擇器,它將從加權列表中選擇可能的節點。
  • 使用上面列出的步驟創建另一個節點
  • 在 StartNode 遊戲物件上,添加 FixedNodeSelector 元件
  • 向 Linked Nodes 添加元素並將新節點拖動到新增欄位中


可以根據需要重複上述步驟,按照代理應該前往的順序鏈接節點,以確保它們將遵循通過該關卡的所需路徑。

塔樓安置區

入門套件中的塔需要 IPlacementAreas 才能讓玩家將它們放置在舞台中。將 IPlacementArea 的實現添加到空遊戲物件之中,我們將能夠定義可以放置塔的位置。

入門套件包含兩個 IPlacementArea 實現:

SingleTowerPlacementArea




SingleTowerPlacementArea 是一個只能包含一個塔的 IPlacementArea。
  • 創建一個新的遊戲物件並將其命名為 TowerPlacementArea
  • 將 Sphere Collider 添加到 TowerPlacementArea 物件
  • 將 SingleTowerPlacementArea 元件添加到 TowerPlacementArea 物件
  • 將 SinglePlacementTile 預製體從 Prefabs / UI 拖動到Placement Tile Prefab 欄位
  • 將 TowerPlacementArea 的 layer 設置為 PlacementLayer
TowerPlacementGrid




TowerPlacementGrid 表示玩家可以放置多個塔的網格區域。
  • 創建一個空的遊戲物件並將其命名為 PlacementGrid
  • 添加 TowerPlacementGrid 元件
  • 設置網格的所需尺寸
  • 將 PlacementTile 預製體從Prefabs / UI拖動到 Placement Tile Prefab 欄位
  • 將 TowerPlacementGrid 的 layer 設置為 PlacementLayer
與 SingleTowerPlacementArea 不同的輸入處理,TowerPlacementGrid 會自動創建一個設置為正確大小的對撞機。

添加基地



到達最終節點時,敵人不會傷害玩家的生命值。為了解決這個問題,我們需要對最終的導航節點進行一些修改。
  • 將 PlayerHomeBase 元件添加到最終節點遊戲物件
  • 設置基地的的 Max 和 Starting Health
  • 將 Player SimpleAlignment 可程式物件拖到 Alignment 欄位
Player Home Base 具有分配粒子系統的欄位。一個用於充電效果,另一個用於攻擊效果。這些不是必需的。

了解PlayerHomeBase組件

Configuration

Max Health

玩家基地的最大生命值。

Starting Health

玩家基地的起始生命值。

Alignment

引用可程式物件,它定義哪些對象可以定位並損​傷害基地。

Charge Pfx

粒子系統將在代理準備對基地進行攻擊時播放。

Charge Sound

當代理準備對基地進行攻擊時播放,聲音將播放。

Attack Pfx

粒子系統將在代理完成充電並攻擊基地時播放。

Attack Sound
當代理完成充電並攻擊基地時,聲音將播放。

如果指定攻擊效果,則會在充電完成後,傷害基地時播放。

添加塔庫

現在我們已經創建了可以放置塔的區域,我們需要在我們的舞台上設置哪些塔可用。
  • 從 Project 視窗:Create > Tower Defense > Tower Library
  • 拖進在此關可供玩家使用塔預製體


設置進攻波



對於產生的敵人,我們需要設置進攻波才能讓它們出現。
  • 創建一個空的遊戲物件並將其命名為Wave Manager
  • 將 WaveManager 元件添加到 Wave Manager 物件
  • 將 Size 欄位設置為我們計劃的進攻波數量。


為了創造進攻波:
  • 創建一個空的遊戲物件並將其命名為 Wave1(根據需要替換該數字)
  • 將 Wave 元件添加到 Wave1
  • 將 Spawn Instructions下的 Size 字段設置為應該出現在進攻波中的代理數量
  • 對於每個代理:
-將針對敵人類型的 AgentConfiguration 可程式物件拖到 Agent Configuration 欄位中
  -將 Delay To Spawn 欄位設置為在生成前次後代理應該等待多少秒才生成這次代理
  -將代理應該生成的節點拖到 Starting Node 欄位中

所有代理被銷毀後,常規 Wave 元件將僅完成進攻波。我們還可以使用 TimedWave 元件,它提供 Time To Next Wave 欄位,我們可以在下一個波開始產生代理之前設置一個固定的時間。

創建進攻波後,將它們添加到 WaveManager 中 Waves 下的元素。

添加遊戲管理器



舞台需要帶有 GameManager 元件的遊戲物件,以便在玩家摧毀所有敵人或其基礎生命值耗盡時結束舞台。
  • 將預設的 Starter Kit GameManager 預製體從 Prefabs / Managers 中拖動到 Hierarchy 視窗中。
  • 將 LevelList 可程式物件拖到 Level List 欄位中
了解 GameManager 元件

Game Mixer

涵蓋對遊戲使用的音頻混音器的參照。

Master Volume Parameter

GameMixer 中控制遊戲整體音量的參數名稱。

Sfx Volume Parameter

GameMixer 中的參數名稱,用於控制遊戲中音效的音量。

Music Volume Parameter

GameMixer 中參數的名稱,用於控制遊戲中音樂的音量。

Level List

在這裡,我們可以設置對遊戲中個關卡列表的參照。

添加級別管理器



LevelManager 管理遊戲的狀態,我們可以在這裡設置我們舞台的其他一些重要功能,例如玩家在開始時獲得多少貨幣註一。添加一個級別管理器:
  • 將 LevelManager 元件添加到之前製作的 Wave Manager 遊戲物件中
  • 設置起始貨幣欄位
  • 將 TowerLibrary 可程式物件拖到Tower Library 欄位
了解 LevelManager 元件

Intro

LevelManager 可以選擇在遊戲開始前進入特殊狀態。例如,這可以用於顯示舞台的建立過場動畫。

入門套件包括 TimedLevelIntro,這是一個非常簡單的定時前奏,在開始遊戲之前等待一段時間。

要實現自定義行為,請創建一個從 Intro 擴展並在 Start 中執行我們邏輯的新腳本。例如,我們可能會啟動使用時間軸創建的過場動畫。完成前奏後,我們可以調用SafelyCallIntroCompleted 來指示 LevelManager 繼續。

Tower Library

在這裡,我們可以將之前製作的 TowerLibrary 可程式物件分配給舞台。這樣做將為舞台設置可用的塔。

Starting Currency

起始貨幣欄位定義玩家開始時要花費在購買塔的遊戲內貨幣數量。

Currency Gainer

我們可能希望玩家在玩遊戲時能夠隨時間賺錢。Currency Gainer 中的欄位是我們可以設置它的地方。

Constant Currency Gain Addition

固定貨幣增益增加是每次添加時將向玩家的總數添加多少貨幣。

Constant Currency Gain Rate

固定貨幣增益率是貨幣增加每秒發生的次數。

Home Bases

該欄位定義玩家基地。如果到達這裡,敵人會降低玩家的生命值。這需要設置為對最終導航節點的參照用,該節點上有一個 PlayerHomeBase 元件。以下有更多關於此的信息。

Environment Colliders

這裡設置的任何碰撞器都會被彈道射彈短暫地忽略。這可以用於確保它們不會與塔和代理之間的環境的小部分發生碰撞並且在不擊中敵人的情況下爆炸。

資源管理



不斷創造和摧毀敵人,射彈和被動效果的實例是一項昂貴的操作。我們可以使用 Starter Kit 的資源管理器來避免。資源管理器是一個類,它將創建和存儲物件的重複部分,以便可以重複用它們。
  • 將 Poolable 元件添加到 Projectiles,Particle Systems 和 Agents 中
  • 創建一個空的遊戲物件並將其命名為 Pool Manager
  • 將 PoolManager 元件添加到 Pool Manager 遊戲物件
  • 會出現在舞台上的 Projectiles,Particle Systems 和 Agents 的預製體拖入 Poolables 欄位
  • 確保 Pool Manager 的 Transform scale 設置為(1,1,1)
請注意,衍生的敵人是使用 PoolManager 的遊戲物件的子物件,這意味著它們將繼承其變換值。我們可能希望比例保持(1,1,1),但如果我們希望增加所有敵人的大小,就可以使用它。

註一:起始貨幣至少要比一座塔的價格多。

沒有留言:

張貼留言