
- Unity 教程
- Unity - 首頁
- Unity - 簡介
- Unity - 安裝和設定
- Unity - 建立精靈
- Unity - 修改精靈
- 變換和物件父子關係
- Unity - 內部資源
- Unity - 儲存和載入場景
- Unity - 基本移動指令碼
- Unity - 理解碰撞
- Unity - 剛體和物理
- Unity - 自定義碰撞邊界
- 理解預製件和例項化
- Unity - 遊戲物件銷燬
- Unity - 協程
- Unity - 控制檯
- Unity - 音訊入門
- Unity - UI入門
- Unity - 按鈕
- Unity - 文字元素
- Unity - 滑塊
- Unity - 材質和著色器
- Unity - 粒子系統
- Unity - 使用資源商店
- Unity 有用資源
- Unity 快速指南
- Unity - 有用資源
- Unity - 討論
Unity 快速指南
Unity - 簡介
Unity 是一個跨平臺遊戲引擎,最初於 2005 年由Unity Technologies釋出。Unity 的重點在於開發 2D 和 3D 遊戲以及互動式內容。Unity 目前支援超過20個不同的目標平臺進行部署,而其最受歡迎的平臺是 PC、Android 和 iOS 系統。
Unity 提供了一個完整的工具包,用於設計和構建遊戲,包括圖形、音訊和關卡構建工具的介面,只需很少使用外部程式即可處理專案。
在本系列中,我們將:
- 學習如何使用 Unity 的各種基礎知識
- 瞭解引擎的工作原理
- 理解遊戲設計的基本概念
- 建立和構建實際的示例遊戲
- 學習如何將您的專案部署到市場
現在讓我們開始吧。
Unity - 安裝和設定
要使用 Unity 建立內容,主要要求是下載 Unity 引擎和開發環境。除了核心引擎外,您還可以下載可選的模組以部署到各種不同的平臺,以及用於將 Unity 指令碼整合到 Visual Studio 的工具。

要安裝 Unity,請訪問此處訪問後,點選:
選擇您的 Unity + 下載。
在下一頁上,點選個人版下方的立即試用按鈕。這是 Unity 的免費版本,包含所有核心功能。在我們開始本系列時,最好先學習如何使用引擎,然後再考慮購買Plus版或Pro版。
在下一頁上,向下滾動並點選確認您或您的公司年收入不超過 100,000 美元。如果您超過此金額,則不允許試用 Unity 免費版,但您可以註冊免費試用 Pro 版 30 天。

接下來,點選您希望安裝 Unity 的平臺。在本系列中,我們將使用引擎的Windows版本。也可以在Ubuntu和一些其他 Linux 系統上安裝 Unity,更多資訊請參見此處
還強烈建議您安裝最新版本的Visual Studio,它比 Unity 附帶的標準 MonoDevelop IDE 提供了許多有用的工具。
下載安裝程式後,按照提示操作,直到您到達一個選單,可以選擇要與 Unity 一起安裝的元件。

在這裡,選擇您需要的元件。在本系列中,我們希望安裝影像中顯示的元件。此選擇包括引擎本身、引擎文件、一個 IDE;Android 的構建工具以及以後可以新增到專案中的一組資源。
點選下一步,按照說明和選項操作,讓 Unity 將自身下載並安裝到您的計算機上。
開啟 Unity,在下一課中,我們將建立我們的第一個專案。
建立您的第一個專案
Unity 同樣適用於 2D 和 3D 遊戲。所有在 Unity 中製作的遊戲都從啟動螢幕中的專案開始。
開啟您新安裝的 Unity 副本;將出現如下所示的螢幕:

您現有的專案將顯示在上述影像中的模糊區域中。

在視窗的右上角,您將看到新建圖示,如上所示。單擊該圖示後,您將看到專案設定螢幕。

在這裡,您可以為專案命名,設定儲存位置,設定專案型別並新增現有資源。
現在,讓我們將第一個專案命名為“Hello World!”並將其設定為2D模式。

單擊建立專案,讓 Unity 設定專案的核心檔案。這可能需要一些時間,具體取決於您的計算機速度、預新增的資源和專案型別。
瞭解引擎
建立新專案並開啟 Unity 後,將出現以下螢幕:

讓我們快速瀏覽一下此視窗中可見的內容。目前,我們關注四個主要區域:

在這個視窗中,我們將構建我們的場景。場景是遊戲發生的所有內容的關卡。如果您單擊小的遊戲選項卡,您可以看到遊戲對玩家的外觀預覽視窗。目前,它應該是一個簡單的藍色背景。

此區域是檢查器。目前它是空的,因為我們的場景中沒有任何物件。我們稍後將看到如何使用檢查器。

此視窗是場景層次結構。它列出了您當前開啟的場景中的所有物件,以及它們父子層次結構。

最後,此區域是專案資源視窗。當前專案中的所有資源都儲存並儲存在此處。所有外部匯入的資源,例如紋理、字型和聲音檔案,也儲存在此處,然後才能在場景中使用。
在下一課中,我們將討論 Unity 中游戲的工作流程和工作方式。
Unity 如何工作?
在 Unity 中,所有遊戲玩法都在場景中進行。場景是遊戲的所有方面(例如遊戲關卡、標題螢幕、選單和過場動畫)發生的位置。
預設情況下,Unity 中的新場景將包含場景中名為主攝像機的攝像機物件。可以向場景中新增多個攝像機,但目前我們只處理主攝像機。
主攝像機渲染它在稱為視口的特定區域中看到或“捕捉”的所有內容。進入此區域的所有內容都將對玩家可見。
您可以透過將滑鼠放在場景檢視內並向下滾動以縮小場景檢視來看到此視口作為灰色矩形。(您也可以透過按住 Alt 鍵並右鍵拖動來實現)。

場景本身是由稱為遊戲物件的物件組成的。遊戲物件可以是任何東西,從玩家模型到螢幕上的 GUI,從按鈕和敵人到無形的“管理器”,例如聲音源。
遊戲物件有一組附加在其上的元件,這些元件描述了它們在場景中的行為方式,以及它們如何對場景中的其他物件做出反應。
事實上,我們現在就可以探索這一點。單擊場景層次結構中的主攝像機,然後檢視檢查器。它現在不會為空;相反,它將包含一系列“模組”。

任何遊戲物件最重要的元件都是它的變換元件。場景中存在的任何物件都將有一個變換,它定義了它相對於遊戲世界或任何父物件的位置、旋轉和縮放。
可以透過單擊新增元件並選擇所需的元件來將其他元件附加到物件。在我們後續的課程中,我們還將向遊戲物件附加指令碼,以便我們可以賦予它們程式設計行為。
現在讓我們考慮一些元件的示例:
渲染器 - 負責渲染和使物件可見。
碰撞器 - 定義物件的物理碰撞邊界。
剛體 - 為物件提供即時物理屬性,例如重量和重力。
音訊源 - 為物件提供播放和儲存聲音的屬性。
音訊監聽器 - 實際“聽到”音訊並將其輸出到玩家揚聲器的元件。預設情況下,主攝像機中存在一個。
動畫器 - 為物件提供對動畫系統的訪問許可權。
燈光 - 使物件充當光源,具有各種不同的效果。

在此圖表中,我們可以看到 Unity 如何透過遊戲物件將自身組合成場景。
在下一課中,我們將建立我們的第一個遊戲物件並深入研究指令碼。
Unity - 建立精靈
精靈是簡單的 2D 物件,上面有圖形影像(稱為紋理)。當引擎處於 2D 模式時,Unity 預設使用精靈。在 3D 空間中檢視時,精靈看起來像薄紙一樣,因為它們沒有 Z 寬度。

除非在 3D 空間中旋轉,否則精靈始終以垂直角度面向攝像機。
每當 Unity 建立一個新的精靈時,它都會使用紋理。然後將此紋理應用於新的遊戲物件,並附加精靈渲染器元件。這使得我們的遊戲物件可以使用我們的紋理可見,併為其提供與螢幕上外觀相關的屬性。

要在 Unity 中建立精靈,我們必須為引擎提供紋理。
讓我們先建立紋理。獲取您想要使用的標準影像檔案(例如 PNG 或 JPG),將其儲存,然後將影像拖到 Unity 的資源區域。

接下來,將影像從資源拖到場景層次結構。您會注意到,一旦鬆開滑鼠按鈕,列表中就會出現一個帶有紋理名稱的新遊戲物件。您現在還將在場景檢視中看到螢幕中間的影像。

在建立精靈時,讓我們考慮以下幾點:
透過將外部資源拖到 Unity 中,我們正在新增一個資源。
此資源是一個影像,因此它變成了一個紋理。
透過將此紋理拖入場景層次結構中,我們建立了一個與紋理同名的新遊戲物件,並附加了一個Sprite Renderer。
此 Sprite Renderer 使用該紋理在遊戲中繪製圖像。
我們現在在場景中建立了一個精靈。
在下一課中,我們將瞭解我們擁有的精靈的一些修改器。
Unity - 修改精靈
我們剛剛匯入的精靈也可以透過各種方式進行操作以更改其外觀。
如果您檢視引擎介面的左上角,您會發現如下所示的工具欄:

讓我們討論一下這些按鈕的功能。
手型工具用於在場景中移動而不影響任何物件。


接下來,我們有移動工具。它用於在遊戲世界中移動物件。


在中央,我們有旋轉工具,用於沿遊戲世界(或父物件)的 Z 軸旋轉物件。


縮放工具位於上方。此工具允許您沿特定軸修改物件的尺寸(比例)。


最後,我們有矩形工具。此工具的行為類似於移動工具和縮放工具的組合,但容易損失精度。它在排列 UI 元素方面更有用。


隨著專案複雜性的增加,這些工具將證明其價值。
Unity - 變換和物件父子關係
在我們剛開始的時候,我們討論了 gameObject 的變換可以說是其最重要的元件。讓我們在本章中詳細討論這個元件。此外,我們還將學習物件父子關係的概念。
變換具有三個可見屬性:位置、旋轉和縮放。每個屬性都有三個值,分別對應三個軸。2D 遊戲在定位時通常不關注 Z 軸。Z 軸在 2D 遊戲中最常見的用途是建立視差。
旋轉屬性定義物件相對於遊戲世界或父物件圍繞該軸旋轉的角度(以度為單位)。
物件的縮放比例定義了它與原始大小或本機大小相比的大小。例如,讓我們取一個尺寸為 2x2 的正方形。如果這個正方形沿 X 軸縮放 3 倍,沿 Y 軸縮放 2 倍,我們將得到一個 6x4 的正方形。

在我們接下來的章節中,我們將討論物件父子關係是什麼。
什麼是物件父子關係?
在 Unity 中,物件遵循層次結構系統。使用此係統,遊戲物件可以成為其他遊戲物件的“父物件”。
當一個遊戲物件具有父物件時,它將相對於另一個遊戲物件而不是遊戲世界執行所有變換更改。
例如,一個沒有父物件的物件放置在 (10, 0, 0) 將距離遊戲世界的中心 10 個單位。

但是,一個具有父物件的遊戲物件放置在 (10, 0, 0) 將認為父物件的當前位置為中心。

遊戲物件可以透過簡單的拖放操作將其拖放到所需的父物件上進行父子關係設定。“子”物件在物件列表中用一個小縮排以及父物件旁邊的箭頭表示。

為遊戲物件設定父子關係有很多用途。例如,坦克的所有不同部件都可以是單獨的遊戲物件,並放在名為“tank”的單個遊戲物件下。這樣,當這個“tank”父遊戲物件移動時,所有部件都會隨之移動,因為它們的位置會根據其父物件不斷更新。

在我們接下來的課程中,我們將討論內部資源。我們還將學習如何在專案中建立和管理資源。
Unity - 內部資源
除了從其他程式匯入的外部資源(如音訊檔案、影像、3D 模型等)之外,Unity 還提供內部資源的建立。這些資源是在 Unity 本身建立的,因此不需要任何外部程式來建立或修改。
一些重要的內部資源示例如下所示:
場景 - 它們充當“關卡”。
動畫 - 它們包含 gameObject 動畫的資料。
材質 - 它們定義光照如何影響物件的外觀。
指令碼 - 為遊戲物件編寫的程式碼。
預製件 - 它們充當遊戲物件的“藍圖”,以便可以在執行時生成它們。
其他一些重要的資源是佔位符、精靈和模型。當您需要快速佔位符時使用它們,以便以後可以替換為合適的圖形和模型。
要建立內部資源,請右鍵單擊“資源”資料夾,然後轉到建立。

在此示例中,我們將建立一個三角形和一個正方形。
將滑鼠懸停在精靈選項上,然後單擊三角形。

對正方形重複此過程,您應該有兩個新的圖形資源。

隨著我們的學習進度,我們將探索更多這些內部資源,因為它們對於構建合適的遊戲至關重要。
Unity - 儲存和載入場景
在一天結束時,當您完成相當多的工作後,您需要儲存您的進度。在 Unity 中,按 Ctrl + S 不會直接儲存您的專案。
Unity 中的一切都發生在場景中。儲存和載入也是如此;您必須將當前工作儲存為場景(.unity 副檔名)到您的資源中。
讓我們試一試。如果我們按 Ctrl + S 併為我們的場景命名,我們將在我們的資源區域中看到一個新的資源。這就是場景檔案。
現在,讓我們嘗試建立一個新場景。為此,請右鍵單擊“資源”,然後轉到“建立”→“場景”。為您的新場景命名並按 Enter。
在編輯器模式下(遊戲未執行時),可以透過雙擊場景將其載入到編輯器中。載入當前場景有未儲存更改的場景會提示您儲存或放棄更改。
您的第一個指令碼
匯入影像並讓它們在遊戲中保持靜止並不會讓您有所成就。它可能可以做一個漂亮的相框,但不是遊戲。
指令碼編寫對於在 Unity 中製作遊戲至關重要。指令碼編寫是編寫程式碼塊的過程,這些程式碼塊像元件一樣附加到場景中的遊戲物件。指令碼編寫是您可以使用的最強大的工具之一,它可以成就或毀掉一個優秀的遊戲。
Unity 中的指令碼編寫是透過 C# 或 Unity 的 JavaScript 實現(稱為 UnityScript)完成的(但是,隨著 2018 週期的到來,UnityScript 現在正處於棄用階段,因此建議不要使用它)。在本系列中,我們將使用 C#。
要建立新指令碼,請右鍵單擊您的資源,然後轉到建立→C# 指令碼。您也可以使用引擎頂部工具欄中的資源選項卡。

建立新指令碼後,應該會顯示一個新的資源。目前,請保留其名稱不變,然後雙擊它。您的預設 IDE 應該會開啟連同指令碼一起開啟。讓我們看看它到底是什麼。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization void Start() { } // Update is called once per frame void Update() { } }
您將看到您的指令碼名稱作為從MonoBehaviour派生的類。什麼是 MonoBehaviour?它是一個龐大的類和方法庫。它幫助 Unity 中的所有指令碼以某種方式派生出來。您在 Unity 中編寫的指令碼越多,您就會越意識到 MonoBehaviour 的實際用途。
在繼續之前,我們有兩個沒有返回型別的私有指令碼,即Start和Update方法。Start方法在使用此方法的遊戲物件在場景中處於活動狀態的第一個幀中只執行一次。
Update方法在 Start 方法之後的遊戲的每一幀中執行。通常,Unity 中的遊戲以 60 FPS 或每秒幀數執行,這意味著在物件處於活動狀態時,Update方法每秒呼叫 60 次。
Unity 指令碼允許您利用 MonoBehaviour 類的全部功能,以及核心 C# 功能,例如泛型集合、lambda 表示式和 XML 解析,僅舉幾例。在下一課中,我們將編寫我們的第一段程式碼!
Unity - 基本移動指令碼
在本課中,我們將編寫使遊戲物件根據使用者的輸入向上、向下、向左和向右移動的程式碼。這應該有助於我們更容易地理解 Unity 指令碼的工作流程。
請記住,每個遊戲物件至少有一個元件:變換。特別之處在於,gameObject 的變換也顯示為 Unity 指令碼端的變數,因此我們可以透過程式碼修改它。這也不限於變換;Unity 中的所有元件都具有屬性,這些屬性可以透過指令碼中的變數訪問。
讓我們從我們的移動指令碼開始。建立一個新指令碼,並將其命名為“Movement”。
現在,開啟指令碼,您應該會看到上一課中看到的內容。
讓我們建立一個名為speed的公共浮點型變數。在 Unity 中將變數設為公共具有很大的優勢:
該變數顯示為編輯器內的可修改欄位,因此您不必手動調整程式碼中的值。
public class Movement : MonoBehaviour { public float speed; }
如果我們在不觸及其他方法的情況下儲存此指令碼,它應該會在 Unity 中編譯。
(您可以透過右下角的圖示看到它何時正在編譯。)
接下來,將指令碼從資源拖放到遊戲物件上。如果操作正確,您應該在遊戲物件的屬性中看到以下內容:

由於速度值是可調整的,並且不必一直更改程式碼,因此我們可以使用 update() 方法而不是 start()。
現在讓我們考慮 Update 方法的目標:
檢查使用者輸入。
如果有使用者輸入,請讀取輸入方向。
根據物件的速度和方向更改物件變換的位置值。為此,我們將新增以下程式碼:
void Update() { float h = Input.GetAxisRaw(“Horizontal”); float v = Input.GetAxisRaw(“Vertical”); gameObject.transform.position = new Vector2 (transform.position.x + (h * speed), transform.position.y + (v * speed));
現在讓我們簡要討論一下程式碼。
首先,我們建立一個名為h(水平)的浮點型變數,其值由Input.GetAxisRaw方法給出。此方法根據玩家在向上/向下/向左/向右箭頭鍵上按下的鍵返回 -1、0 或 1。
Input 類負責以按鍵、滑鼠輸入、控制器輸入等形式獲取使用者的輸入。GetAxisRaw 方法稍微難以理解,因此我們稍後再討論。
接下來,我們正在將 gameObject 的位置更新為一個新位置,該位置透過建立一個新的Vector2來定義。Vector2 接受 2 個引數,它們分別是x 和 y值。對於 x 值,我們提供物件當前位置及其速度的總和,有效地在按下鍵的每一幀向其位置新增一些數量。
儲存此指令碼並返回 Unity。Unity 將在成功編譯後自動更新所有指令碼,因此您不必一遍又一遍地重新附加指令碼。
現在您完成了,請將遊戲物件屬性中的speed值更改為 0.8。這很重要,因為較高的值會使玩家移動速度過快。

現在,單擊播放並檢視您的第一個小型遊戲!

嘗試按下箭頭鍵並四處移動。要停止遊戲,只需再次單擊播放。您甚至可以即時調整速度,因此不必一直停止和啟動它。
下一課我們將學習剛體和碰撞。
Unity - 理解碰撞
Unity中的碰撞與精靈本身是分開的,作為單獨的元件附加,並單獨計算。現在讓我們學習其背後的原因。
遊戲中的所有東西都是GameObject。即使構成關卡的單個瓦片本身也是GameObjects。
當我們將每個元件都視為一個GameObject時,我們會意識到場景中可能存在數千個GameObject,它們以某種方式相互作用。您可以想象,如果Unity為每個GameObject都新增碰撞,那麼引擎為每個GameObject計算碰撞將是不可行的。
我們將新增一個簡單的“牆壁”,我們的玩家角色可以與之碰撞。為此,建立一個另一個精靈並使用矩形工具將其放大。我們還將透過精靈渲染器元件中的顏色屬性為其賦予紅色。

現在,轉到檢查器中的新增元件,然後輸入“Box Collider 2D”。單擊顯示的第一個元件,應該會出現一個新元件。

您將在GameObject的周邊看到一條亮綠色的線。這就是碰撞邊界。它定義了可碰撞物件的實際形狀。
對我們的可移動GameObject也重複相同的操作。
當然,Unity中的碰撞不僅僅限於簡單的方框。它們可以具有各種形狀和大小,並且不一定是物件引數的複製品。

它們也可以採用多邊形形狀。

開發人員和設計師在碰撞邊界中使用近似形狀來簡化碰撞器並避免引擎進行不必要的計算的情況並不少見。我們很快就會學習如何建立不同形狀和大小的碰撞器。
現在我們已經設定了碰撞邊界,點選播放並檢視其執行效果。

你會注意到我們的可移動物體行為不正常。我們將在下一章討論物體的行為。
Unity - 剛體和物理
上一章碰撞的主要問題在於程式碼。我們現在將直接修改GameObject的位置值。如果玩家按下按鍵,我們只是向位置新增一個值。我們需要一種方法讓玩家以正確的方式移動,使其對邊界和其他GameObject做出正確的反應。
為此,我們需要了解什麼是剛體。剛體是可以對即時物理做出反應的GameObject的元件。這包括對力和重力、質量、阻力和動量的反應。
您可以透過單擊新增元件並在搜尋欄位中輸入Rigidbody2D來將Rigidbody附加到您的GameObject。

單擊Rigidbody2D會將元件附加到您的GameObject。附加後,您會注意到許多新欄位已開啟。

使用預設設定,由於重力,GameObject會垂直向下落下。為避免這種情況,請將重力縮放設定為0。
現在,遊戲播放不會顯示任何可見的差異,因為GameObject尚未與其物理元件有任何關聯。
為了解決我們的問題,讓我們再次開啟我們的程式碼並重寫它。
public class Movement : MonoBehaviour { public float speed; public Rigidbody2D body; // Update is called once per frame void Update() { float h = Input.GetAxisRaw(“Horizontal”); float v = Input.GetAxisRaw(“Vertical”); body.velocity = new Vector2(h * speed, v * speed); } }
我們可以看到我們在宣告中建立了對Rigidbody2D的引用,並且我們的更新程式碼作用於該引用而不是物件的變換。這意味著Rigidbody現在已被賦予移動的責任。
您可能期望body引用會丟擲NullReferenceException,因為我們沒有為其分配任何內容。如果您按原樣編譯並運行遊戲,您將在編輯器的左下方收到以下錯誤

為了解決這個問題,讓我們考慮一下指令碼建立的元件。請記住,公共屬性會在Unity中建立它們自己的欄位,就像我們對速度變數所做的那樣。

將速度調整到更高的值,大約5,然後播放遊戲。
您的碰撞現在將正常工作!
Unity - 自定義碰撞邊界
在本章中,讓我們學習自定義碰撞邊界。我們還將學習如何調整碰撞器的大小和形狀。
讓我們從Box Collider開始。Box Collider (2D) 有4個可調整的邊,形狀像矩形。在碰撞器的元件中,單擊此框 -
.jpg)
您將看到碰撞器上顯示4個“手柄”。您可以拖動這些手柄來調整它們的大小。

對於簡單的形狀,Unity也會檢測碰撞器形狀的最佳匹配,前提是您選擇了正確的形狀。例如,在圓形精靈上選擇圓形碰撞器會將其與半徑匹配。

對於更復雜的形狀,Unity將嘗試建立最簡單但最精細的碰撞器形狀。為此,您需要使用Polygon Collider 2D。

嘗試單擊“編輯碰撞器”按鈕並嘗試調整碰撞器。
理解預製件和例項化
在遊戲過程中,例項化和銷燬物件被認為非常重要。例項化僅僅意味著創造。物品出現在遊戲中或“生成”,敵人死亡,GUI元素消失,場景不斷載入。瞭解如何正確地擺脫不需要的物件以及如何引入您需要的物件變得更加重要。
讓我們首先了解什麼是預製件。預製件被認為是理解Unity中例項化工作方式的重要因素。
預製件就像GameObject的藍圖。預製件在某種程度上是GameObject的副本,即使在建立場景時不存在,也可以複製並放入場景中;換句話說,預製件可用於動態生成GameObject。
要建立預製件,您只需將所需的GameObject從場景層次結構拖動到專案資源中。

現在,要例項化一個GameObject,我們在指令碼中呼叫Instantiate()方法。此方法在MonoBehaviour中定義,它接受一個GameObject作為引數,因此它知道要建立/複製哪個GameObject。它還具有各種過載,用於更改新例項化物件的變換以及父物件。
讓我們嘗試在按下空格鍵時例項化一個新的六邊形。
建立一個名為Instantiator的新指令碼並開啟它。在Update方法中,鍵入下面給出的程式碼。
在這裡,我們使用Input類的GetKeyDown方法來檢查玩家在上一個幀期間是否按下了特定按鈕。由於我們希望它繼續檢查,因此我們將其放在Update中,該方法每秒執行60次。如果KeyCode列舉(列出了標準鍵盤上所有可能的鍵)指定的鍵在該幀中被按下,則GetKeyDown方法返回true。
public class Instantiator : MonoBehaviour { public GameObject Hexagon; // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.Space)) { Instantiate(Hexagon); } } }
頂部的公共GameObject宣告建立了一個類似於我們之前在Rigidbody2D中建立的插槽。但是,此插槽僅接受預製件(在編輯器時間)和遊戲物件(在執行時)。
儲存指令碼並讓它編譯。完成後,透過轉到物件層次結構右鍵單擊選單並選擇建立空物件來建立一個新的空GameObject。

將此物件命名為可識別的名稱,例如Instatiator Object,並將我們新建立的指令碼附加到它。在GameObject顯示的插槽中,拖入我們建立的預製件。

如果我們現在運行遊戲,按下空格鍵將建立一個與我們用來建立預製件的六邊形物件相同的新六邊形物件。您可以看到在物件層次結構中建立的每個六邊形。您看不到它們出現在遊戲中的原因是,目前,它們都是精確地一個疊加在一個之上。

在下一課中,我們將瞭解物件銷燬的概念。
Unity - 遊戲物件銷燬
GameObject的銷燬與例項化一樣重要。在本章中,我們將學習如何銷燬GameObject。
幸運的是,銷燬GameObject與建立它們一樣容易。您只需要對要銷燬的物件進行引用,並使用此引用作為引數呼叫Destroy()方法。
現在,讓我們嘗試製作5個六邊形,這些六邊形將在按下指定的鍵時自行銷燬。
讓我們建立一個名為HexagonDestroyer的新指令碼,並在Visual Studio中開啟它。我們將首先建立一個公共KeyCode變數。KeyCode用於指定標準鍵盤上的鍵,其方法中的Input類使用它。透過像之前對Rigidbody和預製件一樣將此變數設為公共變數,我們可以透過編輯器訪問它。當變數設為公共變數時,我們不需要將“KeyCode.A”等值硬編碼到程式碼中。程式碼可以根據我們的需要靈活地使用任意數量的物件。
public class HexagonDestroyer : MonoBehaviour { public KeyCode keyToDestroy; // Update is called once per frame void Update () { if (Input.GetKeyDown(keyToDestroy)) { Destroy (gameObject); } } }
觀察我們如何在方法中使用名為“gameObject”(小寫g,大寫O)的變數。這個新的gameObject變數(型別為GameObject)用於引用附加此指令碼的gameObject。如果您在多個物件上附加此指令碼,則每當涉及此變數時,它們都會以相同的方式做出反應。
但是,不要混淆兩者。
帶有大寫G和O的GameObject是一個類,它包含所有GameObject並提供標準方法,例如Instantiate、Destroy和獲取元件的方法。
帶有小寫g和大寫O的gameObject是GameObject的特定例項,用於引用當前附加此指令碼的gameObject。
現在讓我們編譯我們的程式碼,然後返回Unity。
現在,我們將建立一個新的六邊形精靈,並將我們的指令碼附加到它。接下來,右鍵單擊層次結構中的gameObject並選擇複製。一個新的精靈在層次結構中建立;您應該使用移動工具重新定位它。重複這些步驟以建立類似的六邊形。


單擊每個六邊形並檢視其指令碼元件。您現在可以設定各個鍵,以便在按下該鍵時GameObject自行銷燬。例如,讓我們建立5個六邊形,並設定它們在按下A、S、D、F和G鍵時銷燬。
您可以將相同的鍵設定為多個六邊形,它們都將在按下鍵時同時銷燬自身;這是使用gameObject引用的示例,您可以使用它來引用使用指令碼的單個物件,而無需單獨設定它們。
您可以將相同的鍵設定為多個六邊形,它們都將在按下鍵時同時銷燬自身;這是使用gameObject引用的示例,您可以使用它來引用使用指令碼的單個物件,而無需單獨設定它們。
重要的是要理解,銷燬一個GameObject並不意味著一個物件會破碎或爆炸。銷燬一個物件只會(並且立即)使其在遊戲(及其程式碼)中停止存在。到此物件的連結及其引用現在已斷開,嘗試訪問或使用它們中的任何一個通常會導致錯誤和崩潰。
Unity - 協程
協程是製作 Unity 遊戲時最有效的工具之一。讓我們來看下面的程式碼行,來了解協程到底是什麼。
IEnumerator MyCoroutineMethod() { // Your code here… yield return null; }
通常,如果你在 Unity(或者 C#)中呼叫一個函式,該函式將從頭到尾執行。就你的程式碼而言,這就是你認為的“正常”行為。但是,有時我們想故意減慢函式的速度,或者讓它等待的時間超過它執行的幾毫秒。協程可以做到這一點:協程是一個能夠等待和計時其程序,以及完全暫停其程序的函式。
讓我們來看一個例子來理解協程是如何工作的。假設我們想要製作一個正方形,使其顏色在 1 秒的間隔內在紅色和藍色之間變化。
首先,我們建立一個精靈。接下來,建立一個新的指令碼,並將其命名為ColorChanger。在這個指令碼中,我們獲取精靈的Sprite Renderer的引用。但是,我們將使用不同的方法來獲取元件。我們不再像以前那樣將元件拖放到插槽中,而是讓程式碼自行檢測元件。
這是透過GetComponent方法實現的,該方法返回它檢測到的第一個匹配元件。由於我們每個物件只使用一個 Sprite Renderer,因此我們可以使用此方法自動檢測並獲取每次渲染器的引用。
請記住,渲染器負責使精靈實際顯示在螢幕上。渲染器具有一個color屬性,該屬性影響精靈的全域性顏色;這是要修改的值。將Color值設定為公共值將允許我們透過作業系統預設的顏色拾取程式在編輯器中選擇它們。
private SpriteRenderer sr; public Color color1; public Color color2; void Start () { sr = GetComponent<SpriteRenderer>(); StartCoroutine(ChangeColor()); } IEnumerator ChangeColor() { while (true) { if (sr.color == color1) sr.color = color2; else sr.color = color1; yield return new WaitForSeconds(3); } }
現在,我們將協程函式放入 while 迴圈中。
要在 C# 中建立協程,我們只需建立一個返回IEnumerator的方法。它還需要一個yield return語句。yield return 語句是特殊的;它實際上告訴 Unity 暫停指令碼並在下一幀繼續。
有很多方法可以使用 yield return;其中一種是建立一個WaitForSeconds類的例項。這使得協程在繼續之前等待一定數量的真實世界秒數。
讓我們編譯程式碼並返回 Unity。我們將簡單地選擇交替顏色,然後點選播放。我們的物件現在應該以 3 秒的間隔在兩種顏色之間切換。你也可以將間隔設定為公共變數,並調整顏色變化的頻率。
協程廣泛用於計時方法,就像我們剛才做的那樣。各種WaitForX方法有其自身的用途。協程還用於執行“旁側”程序,這些程序在遊戲同時執行時自行執行。例如,這對於在玩家從一個點開始時載入大型關卡的螢幕外部分非常有用。

Unity - 控制檯
控制檯是我們讀取開發者輸出的地方。這些輸出可用於快速測試程式碼片段,而無需為測試新增額外功能。
預設控制檯中會出現三種類型的訊息。這些訊息可能與大多數編譯器標準相關——
- 錯誤
- 警告
- 訊息
錯誤
錯誤是會阻止程式碼完全執行的問題或異常。
警告
警告是不會阻止程式碼執行的問題,但可能會在執行時造成問題。
訊息
訊息是向用戶傳達資訊的輸出;它們通常不會突出顯示問題。
我們甚至可以讓控制檯輸出我們自己的訊息、警告和錯誤。為此,我們將使用 Debug 類。Debug類是 MonoBehaviour 的一部分,它為我們提供了向控制檯寫入訊息的方法,這與你在入門程式中建立普通輸出訊息的方式非常相似。
你可以在 Assets 區域上方的標籤頁中找到控制檯。

控制檯的輸出對程式設計師更有用,而不是終端使用者或玩家。
讓我們嘗試向控制檯寫入一條簡單的訊息。這將通知我們何時按下空格鍵。為此,我們將使用Log方法,該方法接收一個Object作為引數,我們將使用字串。
你可以從一個新的指令碼開始,或者修改現有的指令碼。
void Update() { if (Input.GetKeyDown(KeyCode.Space)) Debug.Log(“Space key was pressed!”); }
儲存、編譯並執行此程式碼(當然,將其附加到 GameObject),嘗試按下空格鍵。
注意——請注意,訊息顯示在編輯器的底部。

如果你單擊控制檯選項卡,你將看到打印出的訊息。
同樣,你也可以使用LogWarning方法輸出警告,使用LogError方法輸出錯誤。正如你稍後將看到的那樣,這將證明對測試小的程式碼片段非常有用,而無需實際實現它們。
Unity - 音訊入門
遊戲強調音訊是有原因的;它對於增加遊戲的審美價值至關重要。從最早的Pong開始,人們就能聽到球交替擊中球拍時發出的嗶嗶聲。當時這是一個非常簡單的短方波樣本,但是對於所有電子遊戲的鼻祖來說,你還想要什麼呢?
在現實生活中,許多因素會影響你感知聲音的方式;物體的速度、它所在的場景型別以及它來自哪個方向。
有很多因素會導致我們的引擎產生不必要的負載。相反,我們嘗試建立一個關於我們的聲音在遊戲中如何工作的想法,並圍繞它進行構建。這在 3D 遊戲中尤其突出,因為有 3 個軸需要處理。
在 Unity 中,我們有專門用於音訊感知和播放的元件。這些元件協同工作,建立了一個對遊戲來說感覺自然的可信的聲音系統。
Unity 為我們提供了一系列有用的工具和效果,例如混響、多普勒效應、即時混音和效果等等。我們將在後續章節中學習這些內容。
音訊元件
在本節中,我們將學習與 Unity 中的音訊相關的 3 個主要元件。
AudioSource
AudioSource 元件是主要元件,你將其附加到 GameObject 以使其播放聲音。當透過混音器、程式碼或預設情況下在它喚醒時觸發時,它將回放一個AudioClip。
AudioClip 只是一個載入到 AudioSource 中的音訊檔案。它可以是任何標準音頻檔案,例如 .mp3、.wav 等等。AudioClip 本身也是一個元件。

AudioListener
AudioListener 是監聽場景中所有正在播放的音訊並將其傳輸到計算機揚聲器的元件。它就像遊戲的耳朵。你聽到的所有音訊都基於此 AudioListener 的位置。場景中應該只有一個 AudioListener 才能正常工作。預設情況下,主攝像機已將 Listener 附加到它。Listener 沒有任何設計師需要關心的公開屬性。

音訊濾鏡
可以使用音訊濾鏡修改 AudioSource 的輸出或 AudioListener 的輸入。這些是特定元件,可以更改混響、合唱、濾波等等。每個特定濾鏡都作為其自身的元件出現,並具有可調整其聲音的公開值。

播放聲音
讓我們嘗試製作一個按鈕,當點選它時播放聲音。首先,我們將建立一個圓形精靈,並將其設定為紅色。

現在,讓我們將一個AudioSource附加到此精靈。

為了讓物件播放聲音,我們必須為它提供一個聲音。讓我們使用此音效來實現我們的目的。
http://www.orangefreesounds.com/ding-sfx/
下載音效,並將其拖到 Assets 中。

當 Unity 將此資源匯入為聲音檔案時,它會自動轉換為AudioClip。因此,你可以將此聲音剪輯直接從 Assets 拖到我們精靈的 AudioSource 中的 Audio Clip 插槽。

將聲音剪輯從 Assets 直接拖到我們精靈的 AudioSource 中的 Audio Clip 插槽後,請記住取消選中 AudioSource 屬性中的“Play on Awake”;否則,聲音將在遊戲開始時立即播放。

現在,讓我們進入我們的程式碼。建立一個名為“BellSound”的新指令碼並開啟它。

由於我們的 AudioSource 透過程式碼控制,因此我們首先要獲取對它的引用。我們將像以前一樣使用 GetComponent 方法。
public class BellSound : MonoBehaviour { AudioSource mySource; // Use this for initialization void Start () { mySource = GetComponent<AudioSource>(); }
現在,讓我們設定方法來檢測被點選的物件。MonoBehaviour 為我們提供了所需的方法,名為 OnMouseDown。每當滑鼠點選該 gameObject 的碰撞器範圍內時,都會呼叫此方法。
由於我們尚未將碰撞器附加到我們的按鈕,因此我們現在這樣做。

我們不需要為此使用 Rigidbody;我們也不需要透過程式碼訪問此碰撞器。它只需要存在才能使方法工作。
讓我們測試一下該方法,看看它是否有效。在你的指令碼中編寫以下程式碼,並將其附加到按鈕。
void OnMouseDown() { Debug.Log(“Clicked!”); }
儲存指令碼並附加後,播放遊戲。單擊按鈕應該會在控制檯中生成一條訊息。

你現在距離播放聲音只有一步之遙。你現在所要做的就是呼叫 AudioSource 例項中的Play方法。
void OnMouseDown() { mySource.Play(); }
儲存你的指令碼,並在遊戲中執行它。單擊按鈕,你應該會聽到聲音播放!
注意——考慮製作一個按鈕,每次單擊它時音調都會升高。(使用mySource.pitch和一個計數器,看看你是否能解決這個問題。)
Unity - UI入門
在本節中,我們將學習 Unity 中使用者介面或 UI 元素的設計過程。這包括基本設定,以及 Unity 附帶的常用元素概述。
在 Unity 中設計 UI 的工作流程與我們迄今為止一直在進行的工作流程略有不同。首先,UI 元素不是標準的 GameObject,不能作為 GameObject 使用。UI 元素的設計方式不同;如果設定不正確,在 4:3 解析度下看起來正確的選單按鈕在 16:9 解析度下可能會看起來拉伸或變形。
Unity 中的 UI 元素不會直接放置到場景中。它們始終作為名為Canvas的特殊 GameObject 的子項放置。Canvas 就像場景中 UI 的“繪圖紙”,所有 UI 元素都將在其中渲染。在沒有現有 Canvas 的情況下,從建立上下文選單建立 UI 元素將自動生成一個。

現在讓我們看看 Canvas GameObject,瞭解其他新元件——

頂部的Rect Transform似乎具有許多標準 GameObject 的 Transform 不具備的新屬性。
這是因為,雖然普通 GameObject 的 Transform 描述的是 3D 空間中的一個虛構點,但RectTransform定義的是一個虛構的矩形。這意味著我們需要其他屬性來精確定義矩形的位置、大小和方向。
我們可以看到矩形的某些標準屬性,例如高度和寬度,以及兩個名為Anchors的新屬性。錨點是其他實體可以在 Canvas 中“鎖定”的點。這意味著,如果 UI 元素(例如按鈕)錨定到 Canvas 的右側,調整 Canvas 的大小將確保按鈕始終位於 Canvas 的相對右側。
預設情況下,你將無法修改畫布區域的形狀,它將在你的場景周圍成為一個相對巨大的矩形。

接下來是Canvas元件。這是主元件,它包含一些關於如何繪製 UI 的通用選項。

我們看到的第一個選項是Render Mode。此屬性定義用於將 Canvas 繪製到遊戲檢視中的方法。
下拉列表中有三個選項。讓我們在後續章節中學習這些選項。
螢幕空間 - 疊加
此模式是選單、HUD 等最標準的模式。它在場景中的所有其他內容之上渲染 UI,完全按照其排列方式進行渲染,絕無例外。當螢幕或遊戲視窗大小改變時,它還會很好地縮放 UI。這是 Canvas 中的預設渲染模式。
螢幕空間 - 相機
“螢幕空間 - 相機”建立了一個假想的投影平面,該平面距離相機一定距離,並將所有 UI 投影到該平面。這意味著場景中 UI 的外觀很大程度上取決於相機使用的設定;這包括透視、視野等等。

世界空間
在世界空間模式下,UI 元素的行為就像放置在世界中的普通遊戲物件一樣。但是,它們類似於精靈,因此通常用作遊戲世界的一部分,而不是用於玩家,例如遊戲中的監視器和顯示器。由於這種性質,您可以在此模式下直接修改 Canvas RectTransform 的值。
畫布縮放器 (Canvas Scaler) 是一組選項,允許您更明確地調整 UI 元素的比例和外觀;它允許您定義當螢幕大小改變時 UI 元素如何調整大小。例如,UI 元素可以保持相同的大小,而不管螢幕大小如何,也可以按螢幕大小的比例進行縮放,或者可以根據參考解析度進行縮放。
圖形射線投射器 (Graphics Raycaster) 主要處理 UI 元素的射線投射([Unity 射線投射文件連結](假設此處應插入Unity射線投射文件連結)),並確保使用者發起的事件(如點選和拖動)能夠正常工作。
Unity - 按鈕
在本章中,我們將學習如何將 UI 元素插入到我們的場景中以及如何操作它們。
讓我們從一個按鈕開始。要插入按鈕,請在場景層次結構中右鍵單擊,然後轉到建立 → UI → 按鈕。如果您沒有現有的畫布和事件系統,Unity 將自動為您建立一個,並將按鈕也放置在畫布中。

請記住,在預設模式“疊加”渲染模式下,畫布的大小與相機的大小無關。您可以透過單擊遊戲選項卡來測試這一點。

如果您播放場景,您會注意到該按鈕已經具有一些標準功能,例如檢測滑鼠是否懸停在其上,以及在按下時更改顏色。
按鈕需要功能才能在 UI 中真正有用。此功能可以透過其屬性新增。
讓我們建立一個新的指令碼,並將其命名為ButtonBehaviour。
public class ButtonBehaviour : MonoBehaviour { int n; public void OnButtonPress(){ n++; Debug.Log("Button clicked " + n + " times."); } }
我們建立了一個簡單的的方法,記錄我們點選按鈕的次數。
注意 − 此方法必須是公共的;否則,按鈕的功能將不會注意到它。
讓我們建立一個空的 GameObject 並將此指令碼附加到它。我們這樣做是因為按鈕本身不會執行任何操作;它只調用其指令碼中指定的方法。

現在,進入按鈕的屬性,找到OnClick()屬性。
_property.jpg)
點選底部選項卡上的“+”圖示,列表中應該會顯示一個新的條目。

此條目定義按鈕按下作用於哪個物件,以及呼叫該物件指令碼的哪個函式。由於按鈕按下中使用的事件系統,您可以透過將多個函式新增到列表中來觸發它們。
將包含我們建立的ButtonManager指令碼的空 GameObject 拖放到無 (物件)槽中。
_slot.jpg)
導航無函式下拉列表,查詢我們的OnButtonPress方法。(請記住,它可以命名為任何您想要的名字,OnButtonPress只是一個標準化的命名約定。)您應該在ButtonBehaviour部分找到它。
如果您現在運行遊戲,您可以測試按鈕,並且控制檯會打印出您按下按鈕的次數。
Unity - 文字元素
Unity 內建的文字 UI 是學習者入門 UI 設計的一個很好的起點,即使它往往被更強大、更高效的社群構建的資源所掩蓋。
對於我們的目的,普通的文字元素已經足夠了。
文字作為自身的一個獨特的 UI 元素,主要是因為該元素的動態性。例如,將玩家的當前分數列印到螢幕上,需要將分數的數值轉換為字串,通常透過.toString()方法,然後才能顯示。
要插入文字 UI 元素,請轉到場景層次結構,建立 → UI → 文字。

一個新的文字元素應該出現在您的畫布區域。如果我們檢視其屬性,我們會看到一些非常有用的選項。

然而,最重要的是文字欄位。您可以在該欄位中鍵入您希望文字框顯示的內容,但我們希望更進一步。
要更改文字的字型,您必須首先將字型檔案從您的計算機匯入 Unity,作為資源。字型不需要主動附加到場景中的任何東西,可以直接從資源中引用。
文字元素也可以透過指令碼訪問;這就是動態 UI 的重要性所在。
不是像上一章那樣在控制檯中輸出按鈕被按下的次數;讓我們實際將其列印到遊戲螢幕上。為此,我們將開啟上一課中的 ButtonBehaviour 指令碼,並對其進行一些更改。
using UnityEngine; using UnityEngine.UI; public class ButtonBehaviour : MonoBehaviour { int n; public Text myText; public void OnButtonPress(){ n++; myText.text = "Button clicked " + n + " times."; } }
我們做的第一個更改是新增一個新的名稱空間引用。此引用用於處理 Unity 的 UI 元件,因此我們添加了 using UnityEngine.UI 行。
接下來,我們建立一個公共 Text 變數,我們可以在其中拖放我們的 Text UI 元素。
最後,我們使用myText.text訪問此 UI 元素包含的實際文字。

如果我們儲存指令碼,現在我們將在 ButtonManager 中看到 Text UI 元素的新插槽。只需將包含該 Text 元素的 gameObject 拖放到插槽上,然後點選播放按鈕。

Unity - 滑塊
在本章中,我們將學習本系列中的最後一個 UI 元素。滑塊通常用於設定某個值在最大值和最小值對之間的場景。最常見的用法之一是用於音訊音量或螢幕亮度。
要建立滑塊,請轉到建立 → UI → 滑塊。一個新的滑塊元素應該出現在您的場景中。

如果您轉到此滑塊的屬性,您會注意到一些用於自定義它的選項。

讓我們嘗試用這個滑塊建立一個音量滑塊。為此,開啟 ButtonBehaviour 指令碼(您可以重新命名 ButtonManager GameObject,因為它肯定不僅僅是管理一個按鈕了),並新增對滑塊的引用。我們還將再次更改程式碼。
public class ButtonBehaviour : MonoBehaviour { int n; public Text myText; public Slider mySlider; void Update() { myText.text = "Current Volume: " + mySlider.value; } }
瞭解我們如何使用 Update 方法不斷更新 myText.text 的值。
在滑塊屬性中,讓我們選中“整數”框,並將最大值設定為 100。
我們將透過其屬性設定文字的顏色,以獲得更醒目的顏色。
讓我們按照相同的步驟將滑塊 GameObject 拖放到新插槽上,然後點選播放。

強烈建議您也探索和試驗其他 UI 控制元件,以瞭解哪些控制元件以何種方式工作。
在我們接下來的部分中,我們將學習關於光照、材質和著色器的內容。
Unity - 材質和著色器
在本章中,我們將簡要了解材質和著色器。為了更好地理解,我們將建立一個新的3D 專案,而不是我們當前的 2D 專案。這將幫助我們看到各種變化。
建立新專案後,轉到層次結構並右鍵單擊,然後轉到3D 物件 → 立方體。這將在場景中間建立一個新的立方體。您可以透過按住右鍵並拖動場景檢視中的滑鼠來環繞立方體檢視。您還可以使用滾輪放大和縮小。
現在,單擊立方體,然後檢視其屬性。

最底部的屬性似乎具有預設材質和標準著色器。
什麼是材質?
在 Unity(以及許多 3D 建模方面),材質是一個包含有關使用該材質的物件的光照資訊的檔案。請注意,灰色的球體表示材質,上面有一些光線照射。
現在,不要混淆名稱;材質與質量、碰撞或一般的物理特性無關。材質用於定義光照如何影響具有該材質的物件。
讓我們嘗試建立我們自己的材質。在資源區域中右鍵單擊,轉到建立 → 材質,併為其命名,例如“我的材質”。

這些屬性不像我們目前為止學習過的任何屬性。這是因為這些屬性是在著色器中程式設計的,而不是在材質中。
材質首先使您的物件可見。事實上,即使在 2D 中,我們也使用不需要光照的特殊材質。當然,Unity 為我們生成並應用它到所有東西,所以我們甚至沒有注意到它在那裡。
什麼是著色器?
著色器是一個程式,它定義瞭如何在螢幕上繪製每個畫素。著色器不是用 C# 甚至面嚮物件語言程式設計的。它們是用一種稱為 GLSL 的類似 C 語言的語言程式設計的,它可以向 GPU 直接發出指令以進行快速處理。
Unity - 粒子系統
粒子系統有助於以高效的方式生成大量具有短生命週期的粒子。這些系統經歷一個單獨的渲染過程;即使有數百或數千個物件,它們也可以例項化粒子。
現在,粒子在粒子系統中是一個模糊的術語;粒子是粒子系統生成的任何單個紋理、材質例項或實體。它們不一定是漂浮在太空中的點(儘管它們可以是!),並且可以用於大量不同的場景。

一個 GameObject 透過附加的粒子系統元件來管理粒子系統;粒子系統不需要任何資源來設定,儘管它們可能需要不同的材質,具體取決於您想要的效果。
要建立粒子系統,可以透過“新增元件”設定新增粒子系統元件,或者進入層級結構,選擇建立 → 效果 → 粒子系統。這將生成一個附加了粒子系統的新的遊戲物件。

如果你檢視粒子系統的屬性,你會發現它包含許多模組。預設情況下,只有三個模組處於活動狀態:發射、形狀和渲染器。可以透過點選模組名稱旁邊的圓圈來啟用其他模組。


在某些值的右側,你可能會注意到一個小黑箭頭。這允許你更好地控制每個粒子的值。例如,你可以將起始大小設定為兩個常量之間的隨機值,以指示粒子系統渲染不同大小的隨機粒子,就像水管噴水一樣。

Unity - 使用資源商店
資源商店是Unity在遊戲引擎市場上最強大的功能之一;它包含大量的資源、工具、指令碼,甚至完整的現成專案供你下載。
要使用資源商店,你需要一個有效的Unity ID。如果你沒有,你可以在Unity網站上建立一個。
建立Unity ID後,點選與場景檢視位於同一行的資源商店選項卡。

登入後,你應該能夠在右上角看到你的使用者名稱。
在這個例子中,我們將匯入生存射擊教程專案。為此,我們將在選項卡中搜索它,然後點選Unity釋出的資源。

我們將點選下載,並等待其完成。完成後,“下載”按鈕將變為“匯入”;再次點選它以將你的新資源匯入當前開啟的專案。
(注意——在本例中,我們匯入的是一個完整的專案;如果Unity警告你,請建立一個新專案或覆蓋現有專案(如果你願意)。兩種方法都可以。)
將彈出一個新視窗,列出你剛剛匯入的新資源的所有內容。根據你下載的內容,這可能是一個檔案、一堆檔案或帶有資料夾和檔案層次結構的完整樹。預設情況下,當你點選匯入時,Unity 將匯入所有資源元件,這就是我們想要的。現在,讓我們點選匯入讓Unity 完成它的工作。
嘗試下載未付費的資源是非法的,並且始終可能存在病毒、錯誤或缺乏更新。