使用 Unity 和 C 開發您的首個遊戲



做爲一名軟件架構師,我已經編寫了不少系統,反向工程本機代碼惡意軟件,而且一般會搞清楚代碼方面的事情。 可是當提及製做遊戲,我還有點搞不清楚從哪裏開始講起。 我曾早期在 Windows 工做時,作了一些本機代碼圖形編程,但那不是什麼有趣的經歷。 後來,我開始專研 DirectX 開發,但我意識到,雖然它很是強大,但彷佛我要作的事所需的代碼很是多。ios

而後,有一天,我決定嘗試使用 Unity,我也看到了它確實能夠作一些使人驚訝的事情。 這篇文章在四部分系列當中做爲首篇,內容囊括了 Unity 的基礎及架構方面的知識。 我將演示如何建立 2D 和 3D 遊戲,最後演示如何構建 Windows 平臺。數據庫

Unity 是什麼

Unity 是一個 2D/3D 引擎和框架,爲您提供設計 2D、2.5D 和 3D 遊戲或應用場景的系統。 我之因此說是遊戲和應用程序,是由於我看到的不僅有遊戲,還有訓練模擬器、第一響應者應用程序,以及使用 Unity 開發須要與 2D/3D 空間交互的其餘以業務爲核心的應用程序。 Unity 憑藉的不只有代碼,還有可視化組件,讓您可以與它們進行交互,並將它們導出到各個主要的移動平臺,其中不少都是免費的。 (還有一個專業版很是不錯,但它不是免費的。 您可使用免費版原本實現大部分功能。)Unity 支持全部主要的 3D 應用程序和多種音頻格式,它甚至瞭解 Photoshop 的 .PSD 格式,以便您能將 .psd 文件導入到一個 Unity 項目中。 Unity 容許您導入和組裝資產,編寫代碼與您的對象進行交互,建立或導入動畫以便在高級的動畫系統中使用,等等。編程

圖 1 所示,Unity 已完成了用於確保跨平臺支持的工做,理論上您能夠經過單擊來更改平臺,雖然說如此,但一般至少還須要作少許努力,好比爲應用內購買與各商店集成。windows

Unity 支持的平臺 
圖 1 Unity 支持的平臺緩存

也許 Unity 最強大的部分在於「Unity 資產商店」,它能夠說是在遊戲市場上最好的資產市場。 在這裏,您能夠知足對全部遊戲組件的需求,如用於 3D 模型的藝術品、3D 模型、動畫文件(參見商店內超過 10,000 個動畫的 Mixamo 內容)、音頻效果和全曲目、插件(包括那些能夠提供多平臺支持的多平臺工具包)、可視化腳本系統(如 PlayMaker 和 Behave)、先進的着色器、紋理、粒子特效等等。 Unity 界面是徹底腳本化的,容許不少第三方插件經過適當的集成來加入到 Unity GUI 中。 若是不是所有的話,至少也是大多數的專業遊戲開發人員會使用資源商店中的大量軟件包,若是您有不錯的資源,也能夠將它發佈在那裏。架構

人們對 Unity 的誤解

我猶豫地解釋,Unity 並不像人們一直質疑的那樣。 然而,默認狀況下 Unity 並非一個用來設計您的 2D 資產和 3D 模型(地形除外)的系統。 您能夠把一堆殭屍帶入到場景中,對它們進行控制,但您不能在 Unity 的默認工具中建立殭屍。 從這個意義上來講,Unity 並非相似於 Autodesk Maya 或 3DSMax、Blender 甚至 Adobe Photoshop 那樣的資產建立型工具。 可是,至少有一個第三方建模插件 (ProBuilder) 可讓您在 Unity 的內部建立一些 3D 組件模型;有 2D 環境生成器插件(如用於建立 2D 平鋪環境的 2D 地形編輯器),您還能夠在 Unity 中設計地形——使用地形工具建立出有樹木、草地、高山等使人歎爲觀止的景觀。 因此,我再一次猶豫地指出 Unity 可實現事項存在的一些侷限。框架

Microsoft 如何能融入進來? Microsoft 與 Unity 的緊密合做可以確保整個 Microsoft 堆棧能夠獲得平臺的強大支持。 Unity 支持 Windows 的獨立可執行性、Windows Phone,Windows 應用商店應用程序、Xbox 360 和 Xbox One。編輯器

開始使用

下載 Unity 的最新版本,手邊準備好一個帶有雙按鍵和可單擊滾輪的鼠標。 還有一個用於免費版模式或專業版模式下得到許可的單個下載。 您可訪問 unity3d.com/unity/licenses 查看兩種版本之間的區別。 編輯器是主要的 Unity 界面,它運行在 Windows(包括 Surface Pro)、Linux 和 OS X 上。函數

我將在接下來的文章中使用 Unity 進入真正的遊戲開發,可是,首先,我將探索 Unity 界面、項目結構和體系結構。

體系結構和編譯

Unity 是一個基於 C++ 的本機遊戲引擎。 使用 C#、JavaScript (UnityScript) 或較少使用的 Boo 編寫代碼。 您的代碼,而不是 Unity 引擎代碼,運行在 Mono 上或 Microsoft.NET Framework 上,這是實時 (JIT) 編譯的(iOS 除外,由於它不容許使用 JIT 代碼,而且它是由 Mono 使用預先 [AOT] 編譯將其編譯到本地代碼)。

Unity 讓您可以在 IDE 中測試遊戲,而無需執行任何種類的導出或生成。 當您在 Unity 中運行代碼時,您使用的是 Mono 的 3.5 版本,它的 API 兼容性基本上與 .NET Framework 3.5/CLR 2.0 的 API 至關。

在項目視圖中雙擊代碼文件,能夠打開默認的跨平臺編輯器 Mono­Develop,這樣就能夠在 Unity 中編輯您的代碼了。 若是您願意,您能夠配置 Visual Studio 做爲您的編輯器。

使用 MonoDevelop 進行調試,或使用 Visual Studio、UnityVS 的第三方插件。 在沒有 UnityVS 的狀況下,您不能將 Visual Studio 用做調試器,由於當您調試遊戲時,您不是在調試 Unity.exe,而是經過使用一個做爲發出命令並執行相關操做的軟件調試器在調試 Unity 內部的虛擬環境。

若要進行調試,就須要從 Unity 啓動 MonoDevelop。 MonoDevelop 有一個插件,您在 MonoDevelop 中調試 | 附加到進程以後,這個插件能夠打開返回到 Unity 調試器的鏈接,並向其發出命令。 UnityVS 使您可以將 Visual Studio 調試器鏈接回 Unity。

當您第一次打開 Unity 時,您會看到如圖 2 中所示的項目對話框。

Unity 項目嚮導 
圖 2 Unity 項目嚮導

在項目對話框中,您爲您的項目 (1) 指定了名稱和位置。 您能夠將任何程序包導入到您的項目 (2) 中,但此處您沒必要覈對全部事項;列表僅爲方便使用而提供。 您也能夠稍後導入一個程序包。 程序包是一個包含預先打包的資源(模型、代碼、場景、插件,可在 Unity 中打包的一切)的 .unitypackage 文件,且您能夠重複使用或輕鬆地分發它們。 但若是您不知道它是什麼,就不要在此處進行覈對;您的項目規模逐漸變大,有時會顯著增加。 最終,您能夠選擇 2D 或 3D (3)。 這個下拉列表是 Unity 中的新增項,它以前並無強大的 2D 遊戲工具,直到最近纔剛剛出現。 當設置爲 3D 時,默認首選 3D 項目,一直以來它都做爲 Unity 的經典行爲,因此它並不須要任何特別說起。 當選擇 2D 時,Unity 改變了一些看似小,而實則很重要的東西,我將在本系列的後續 2D 文章中對此進行介紹。

此列表的填充內容來自您系統上的特定位置的 .unitypackage 文件;Unity 提供了有關安裝的一些內容。 您從 Unity 資產商店下載的全部內容也做爲 .unitypackage 文件而出現,本地緩存在您的系統的 C:\Users\<you>\AppData\­Roaming\Unity\Asset Store 中。 所以,當它存在於您的系統上時,它就會顯示在這個列表中。 您能夠簡單地雙擊一個 .unitypackage 文件,該文件就會導入到您的項目中。

經過繼續使用 Unity 界面,我會從單擊圖 2 中的對話框中的「建立」開始,以便建立一個新的項目。 默認的 Unity 窗口布局如圖 3 所示。

默認的 Unity 窗口 
圖 3 默認的 Unity 窗口

在此,您能夠看到:

  1. 項目:您項目中的全部文件。 您能夠經過從資源管理器拖放到 Unity 中,將文件添加到您的項目中。
  2. 場景:當前打開的場景。
  3. 層次結構:場景中的全部遊戲對象。 注意,使用術語 GameObjects 和 GameObjects 下拉菜單。
  4. 檢查器:場景中選定對象的組件(屬性)。
  5. 工具欄:最左邊是平移、移動、旋轉、縮放,中央是播放、暫停、前進幀。 單擊「播放」可當即播放遊戲,而沒必要執行單獨的生成。 「暫停」可暫停遊戲,「前進幀」運行一次前進一幀,爲您提供很是緊湊的調試控制。
  6. 控制檯:此窗口能夠隱藏,但它顯示的輸出來自您的編譯、錯誤、警告等。 它還顯示來自代碼的調試信息;例如,Debug.Log 會在此處顯示它的輸出。

值得一提的是,「遊戲」選項卡緊挨着「場景」選項卡。 當您單擊「播放」時,此選項卡激活,您的遊戲開始在這個窗口中運行。 這就是所謂的播放模式,它爲您提供一個用來測試遊戲的場地,甚至可讓您切換回「場景」選項卡進行實時修改遊戲。 但此處要很是當心。 當播放按鈕高亮顯示時,您處在播放模式下,當您離開它時,您在播放模式下所作的任何更改都將丟失。 我,以及我曾交談過的幾乎全部的 Unity 開發人員,都曾由於這種方式而丟失了工做,因此我在播放模式下,經過編輯 | 首選項 | 顏色 | 播放模式色彩更改了個人編輯器顏色,使它更加明顯。

關於場景

您的遊戲中運行的一切都存在於一個場景中。 當您針對某個平臺打包您的遊戲時,由此產生的遊戲是一個或多個場景的集合,包括您添加的全部依賴於平臺的代碼。 在一個項目中您能夠有足夠多您須要的場景。 一個場景能夠看做是遊戲中的一個基準,但您在一個場景文件中能夠有多個基準,只要將玩家/照相機移動到場景中不一樣的地點便可。 當您下載第三方程序包,或從資產商店中下載示例遊戲時,一般您必須在項目中查找可打開的場景文件。 場景文件是一個單個文件,它包含各類關於項目中用於當前場景的資源的元數據及其屬性。 重要的是,和任何其餘工具同樣,要在開發過程當中常常按下 Ctrl+S 組合鍵保存場景。

雖然 Unity 有時在打開一個項目時,會建立一個新的空場景,這時您必須在項目資源管理器中查找場景,但一般狀況下,Unity 會打開您最後操做的那個場景。 這會讓新用戶感到很困惑,可是若是您碰巧打開本身的最後一個項目,而且想知道您所完成的工做都去了哪裏,那麼記住這一點很重要! 請放輕鬆,您將在項目中保存的場景文件中找到工做。 經過單擊圖 4 中顯示的圖標並對場景進行篩選,您能夠搜索您項目中的全部場景。

篩選項目中的場景 
圖 4 篩選項目中的場景

在一個場景中,若是沒有照相機,您就看不到任何東西,若是沒有附加到 GameObject 的音頻偵聽器組件,您就什麼都聽不到。 可是請注意,在任何新的場景中,Unity 老是建立一個照相機,上面已經配備有音頻偵聽器組件。

項目結構和導入資產

Unity 項目和 Visual Studio 項目不一樣。 您不打開項目文件或解決方案文件,由於它不存在。 您將 Unity 指向一個文件夾結構,它將該文件夾打開爲一個項目。 項目中包含「Assets」、「Library」、「ProjectSettings」和「Temp」文件夾,但顯示在界面中的只有「Assets」文件夾,如圖 4 所示。

「Assets」文件夾包含您全部的資產(藝術做品、代碼、音頻);您放入項目中的每個文件都放在這裏。 這始終是 Unity 編輯器中的頂層文件夾。 但只能在 Unity 界面中進行更改,決不能經過文件系統。

「Library」文件夾是導入資產的本地緩存;它爲資產保留全部元數據。 「ProjectSettings」文件夾存儲您經過「編輯 | 項目設置」而配置的設置。 「Temp」文件夾用於生成過程當中來自 Mono 和 Unity 的臨時文件。

我想強調的是隻經過 Unity 界面(而不是直接經過文件系統)進行更改的重要性。 這甚至包括簡單的複製和粘貼。 Unity 經過編輯器跟蹤您的對象的元數據,因此使用編輯器來進行更改(幾個附加案例以外)。 您能夠從您的文件系統拖放到 Unity;這種效果很好。

相當重要的 GameObject

您的場景中全部的一切實際上都是一個 GameObject。 思考 .NET Framework 中的 System.Object。 幾乎全部類型都是從它派生出來的。 一樣的概念也適用於 GameObject。 它是 Unity 場景中的全部對象的基類。 圖 5 中顯示的全部(以及更多)對象都是從 GameObject 中派生出來的。

Unity 中的 GameObjects 
圖 5 Unity 中的 GameObjects

GameObject 很是簡單,由於它從屬於「檢查器」窗口。 您能夠在圖 6 中看到一個空的 GameObject 已被添加到場景中;請注意它在檢查器中的屬性。 GameObjects 在默認狀況下沒有可視屬性,當您突出對象時會顯示小部件 Unity 的狀況除外。 從這一點上來講,它只是一個空對象。

簡單的 GameObject 
圖 6 簡單的 GameObject

GameObject 有一個「名稱」、一個「標籤」(相似於您經過 XAML 中的 FrameworkElement.Tag 分配的文本標籤或在 Windows 窗體中的標籤)、一個「層」和「變換」(有多是最重要的屬性)。

「Transform」(變換)屬性只不過是 GameObject 的位置、旋轉以及縮放的信息。 Unity 使用左手座標系,所以您能夠將您的計算機屏幕的座標視爲 X(水平)、Y(垂直)和 Z(深度,也就是進出屏幕的方向)。

在遊戲開發中,使用矢量很是廣泛,我將在之後的文章對此詳細介紹。 就目前而言,知道 Transform.Position 和 Transform.Scale 都是 Vector3 對象就能夠了。 Vector3 是一個簡單的三維矢量;換句話說,它只不過就是三個點:X、Y 和 Z。 經過使用這三個簡單的值,您能夠設置一個對象位置,甚至沿着某個矢量的方向移動一個對象。

組件

您能夠經過添加組件,向 GameObjects 添加功能。 您所添加的是一個組件,它們都會顯示在「檢查器」窗口中。 有 MeshRender 和 SpriteRender 組件;音頻和照相機功能組件;物理學相關的組件(對撞機和剛體)、粒子系統、路徑查找系統、第三方自定義組件等。 您可使用腳本組件將代碼分配給對象。 經過添加功能,組件可以爲您的 GameObjects 帶來勃勃生機,這相似於軟件開發中的裝飾器模式,甚至比這更好些。

我會將一些代碼分配給新的 GameObject,在這種狀況下,您能夠經過「GameObject | 建立其餘 | 多維數據集」方式建立一個簡單的多維數據集。 我將該多維數據集從新命名爲「Enemy」,而後又建立了一個,這下就有兩個多維數據集了。 在圖 7 中您會看到我將一個多維數據集移開另外一個多維數據集 15 個單位距離,這隻須要您在突出顯示某個對象時,使用工具欄上的移動工具或 W 鍵就可以作到。

包含兩個多維數據集的當前項目 
圖 7 包含兩個多維數據集的當前項目

該代碼是一個簡單類,它可以查找玩家和並讓它的全部者朝向它移動。 一般,如下兩種方法均可以執行移動操做:要麼經過改變 Transform.Position 屬性在每一幀都將對象移動到一個新位置,或者能夠對該對象應用一個滯阻力,讓 Unity 執行其他的工做。

每一幀都作些處理與「移動到這一點」相比,在思惟方式上略有不一樣。在這個示例中,我打算每一幀都對該對象移動一點點,因此我對將其移動到什麼地方有着精確的控制。 若是您不肯每一幀都作調整,那麼有些庫能夠執行單個函數調用移動操做,好比免費開放的 iTween 庫。

我作的第一件事就是在「項目」窗口中用鼠標右鍵單擊,建立名爲 EnemyAI 的一個新 C# 腳本。 若要將此腳本分配給對象,只需將腳本文件從項目視圖拖動到場景視圖或層次結構中的對象,同時代碼也會分配給該對象。 Unity 將執行其他的工做。 就是這麼簡單。

圖 8 顯示已分配有腳本的 Enemy 多維數據庫。

已分配有腳本的 Enemy 
圖 8 已分配有腳本的 Enemy

查看圖 9 中的代碼,並注意公共變量。 在編輯器中,您能夠看到個人公共變量出現的同時,有一個選項能夠在運行時覆蓋默認值。 這實在太棒了。 您能夠在 GUI 中對基元類型更改默認設置,也能夠顯示許多不一樣對象類型的公共變量(而不是屬性)。 若是我拖放此代碼到另外一個 GameObject,則該代碼組件的徹底獨立的實例被實例化。 這是一個基本的示例,它能夠變得更有效,比方說,添加一個 RigidBody 組件到這個對象,但這裏我會將它保持簡單的樣子。

圖 9 EnemyAI 腳本

 
public class EnemyAI : MonoBehavior
{
  // 這些值將出如今編輯器中,而完整的屬性則不會出現。
  public float Speed = 50;
  private Transform _playerTransform;
  private Transform _ myTransform;
  // 在分配到的 GameObject 啓動時調用。
  void Start()
  {
     // 查找某個分配有文本標籤「玩家」的 gameobject。
    // 這是啓動代碼,不該該每一幀都查詢該玩家 。
    // 對象。 存儲對它的引用。
    var player = GameObject.FindGameObjectWithTag("Player");
    if (!player)
    {
      Debug.LogError(
        "Could not find the main player. Ensure it has the player tag set.");
    }
    else
    {
      // 得到對其變換的引用,以備後用(將託管
      // 代碼保存到本機代碼調用中)。
      _playerTransform = player.transform;
    }
    // 得到對咱們的變換的引用,以備後用。
    _myTransform = this.transform;
  }
 // 調用每一幀。 每一秒鐘的幀速率都在變化。
  void Update()
  {
    // 我正在設置我應該以每秒多快的速度移向
   // 「玩家」。在 Unity 中,單位是米。
   // Time.deltaTime 給出距離最後一幀的時間量。
   // 若是您正在以 60 FPS(每秒幀數)的速率運行,那麼就是 1/60 = 0.0167,
  // 因此當 Speed=2,幀速率是 60 FPS(幀速率
  // 每秒都在變化)時,我獲得的移動量是 2*0.0167 = .033 個單位
    //每幀。這是 2 個單位。
    var moveAmount = Speed * Time.deltaTime;
   // 更新位置,根據 moveAmount 移向玩家的位置。
    _myTransform.position = Vector3.MoveTowards(_myTransform.position,
      _playerTransform.position, moveAmount);
  }
}

在代碼中,我能夠獲得對編輯器中顯示的任何組件的引用。 我也能夠爲 GameObject 分配腳本,其中每個都有它本身的啓動和更新方法(以及許多其餘方法)。 假設包含此代碼的腳本組件須要引用 EnemyAI 類(組件),我能夠簡單地查詢該組件:

 
public class EnemyHealth : MonoBehavior
private EnemyAI _enemyAI;
// 用來初始化。
void Start () {
  // 獲取對這個遊戲對象上的 EnemyAI 腳本組件的引用。
  var enemyAI = this.GetComponent<EnemyAI>();
}
// 每幀調用一次更新。
void Update () {
  _enemyAI.MoveTowardsPlayer();
}

當您在 MonoDevelop 或您選擇的代碼編輯器中編輯好代碼並切換回 Unity 以後,一般會看到一個短暫的延遲。這是由於 Unity 做爲後臺正在編譯您的代碼。您能夠經過「編輯 | 首選項 | 外部工具 | 外部腳本編輯器」來修改您的代碼編輯器(而不是調試器)。任何編譯問題都將出如今您的 Unity 編輯器屏幕的最下方狀態欄,因此請留意它們。>若是您嘗試運行代碼中存在錯誤的遊戲,Unity 將不會讓您繼續。

編寫代碼

在先前的代碼示例中,有兩種方法,「啓動」和「更新」,並且類 EnemyHealth 是從 MonoBehavior 基類繼承而來的,經過使用基類,您能夠簡單地將 EnemyHealth 類分配給一個 GameObject 對象。在基類中有不少可用的功能,而且一般還有不少方法和屬性。主要的方法就是,若是它們存在於您的類中,Unity 將進行調用。也有少數方法能夠調用(請參閱 bit.ly/1jeA3UM)。雖然相似於 ASP.NET Web 窗體頁面生命週期,有不少方法,但一般只能使用幾個。>如下是在類中最多見的可執行的編碼方法,這些方法涉及到 MonoBehavior 派生類事件的序列:

Awake 方法:當對象第一次進行初始化時,每一個對象調用一次此方法。其它組件可能尚未被初始化,因此這種方法一般用來初始化當前的 GameObject。您應該始終使用這個方法來初始化 MonoBehavior 派生類,而不是某個構造函數。此處,不要試圖在您的場景中查詢其餘對象,由於它們可能尚未初始化。

開始:在對象生命週期的第一幀中,而且在使用任何「更新」方法以前,調用此方法。這看起來可能很是相似於 Awake 方法,但使用 Start 方法,您知道其餘對象已經過 Awake 初始化而且存在於您的場景中,所以,您能夠在代碼中輕鬆查詢其餘對象,以下:

 
// 返回在任何遊戲對象上找到的第一個 EnemyAI 腳本組件實例。
// 這種類型是 EnemyAI(一個組件),而不是一個 GameObject。
var enemyAI = GameObject.FindObjectOfType<EnemyAI>();
// 實際上,我將得到對其頂層 GameObject 的引用。
var enemyGameObject = enemyAI.gameObject;
// 想知道 Enemy 的位置嗎?
var position = enemyGameObject.transform.position;

更新:每一幀都會調用此方法。您是想問更新的頻率?它是可變的。這徹底取決於計算。出於呈現不一樣事物的緣由,您的系統老是不斷變化着負載,因此這個幀速率每秒都會發生變化。進入播放模式查看當前的幀速率時,您能夠按下「遊戲」選項卡中的「統計」按鈕,如圖 10 所示。

獲取統計信息
圖 10 獲取統計信息

FixedUpdate:一秒鐘內會以固定次數調用此方法,和幀速率無關。由於一秒鐘內調用「更新」方法的次數是變化的,而且不與物理引擎同步,因此,當您想爲某個對象提供一個力或其餘一些物理相關的函數時,最好的方法一般是使用 FixedUpdate。默認狀況下,FixedUpdate 每 0.02 秒被調用一次,這意味着 Unity 也在每 0.02 秒執行一次物理計算(這個時間間隔稱爲「固定時間步長」,而且可供開發人員進行調整),這一樣與幀速率無關。

Unity 生成的代碼項目

一旦您的項目中放入了代碼,Unity 就會在您的根文件夾中建立一個或多個項目文件(這在 Unity 界面中是不可見的)。這些都不是 Unity 引擎的二進制文件,而是 Visual Studio 或 MonoDevelop 的項目,您能夠在其中編輯和編譯代碼。Unity 能夠建立不少個看似獨立的項目,如圖 11 所示,雖然每個都有着重要的用途。

Unity 建立的項目
圖 11 Unity 建立的項目

若是您的 Unity 項目很簡單,您看不到全部這些文件。它們只有在您將代碼放入各類特定的文件夾以後,纔會被建立。圖 11 中顯示的項目是隻按照三種類型剖視的剖視圖:

  • Assembly-CSharp.csproj
  • Assembly-CSharp-Editor.csproj
  • Assembly-CSharp-firstpass.csproj

對於這些項目中的每個而言,建立的重複項目都會附加 -VS,例如 Assembly-CSharp-vs.csproj。若是 Visual Studio 是您的代碼編輯器,就會使用這些項目,而且會將它們從 Unity 添加到您的導出項目中,用於在 Visual Studio 解決方案中調試特定平臺。

其餘項目服務於同一目的,但會使用 UnityScript 來取代 CSharp。這些只是項目的 JavaScript (UnityScript) 版本, 僅當您在 Unity 遊戲中使用 JavaScript 而且僅當您將腳本放在觸發要建立這些項目的文件夾中時,纔會存在這些版本。

既然您已經看到了所建立的項目,我將探討觸發這些項目的文件夾,並告訴您它們的用途。 每一個文件夾路徑都假設它在項目視圖中的 /Assets 根文件夾下。Assets 始終是根文件夾,其中包含您的全部資產文件。例如,Standard Assets 其實是 /Assets/Standard Assets。您的腳本的生成過程經過四個階段來生成程序集。第 1 階段編譯的對象看不到第 2 階段編譯的對象,由於它們尚未被編譯。當您將 UnityScript 和 C# 都放入同一個項目中時,瞭解這一點是很是重要的。若是您想引用來自 UnityScript 的 C# 類,您須要確保在早期階段中對其進行編譯。

第 1 階段由「Standard Assets」、「Pro Standard Assets」和「Plug-ins」文件夾中的運行時腳本組成,它們所有位於 /Assets 下。這一階段建立 Assembly-CSharp-firstpass.csproj 項目。

第 2 階段的腳本位於 Standard Assets/Editor、Pro Standard Assets/Editor 和 Plug-ins/Editor 文件夾中。最後一個文件夾是爲與提供設計時功能的 Unity 編輯器 API 進行交互的腳本二準備(考慮 Visual Studio 插件及其如何如何加強 GUI,並且僅有它在 Unity 編輯器中運行)。這一階段建立 Assembly-CSharp-Editor-firstpass.csproj 項目。

第 3 階段包括不在「Editor」文件夾內的全部其餘腳本。這一階段建立 Assembly-CSharp-Editor.csproj 項目。

第 4 階段包括全部剩餘的腳本(全部其餘稱爲「Editor」的文件夾中的腳本,如 /Assets/Editor 或 /Assets/­Foo/Editor)。這一階段建立 Assembly-CSharp.csproj 項目。

可是也有一些這裏沒有涉及到的其餘幾個不經常使用的文件夾,如「Resources」。還有就是關於編譯器所使用內容方面的未決問題。是 .NET 嗎?是 Mono 嗎?是用於 Windows 運行時 (WinRT) 的 .NET 嗎?是用於 Windows Phone 運行時的 .NET 嗎?圖 12 列出了用於編譯的默認值。知道這一點很是重要,特別是對基於 WinRT 的應用程序,由於每一個平臺可用的 API 會有所不一樣。

圖 12 編譯變體

平臺 遊戲程序集的生成者 最終編譯的執行者
Windows Phone 8 Mono Visual Studio/.NET
Windows 應用商店 .NET Visual Studio/.NET (WinRT)
Windows Standalone (.exe) Mono Unity - 生成 .exe + 庫
Windows Phone 8.1 .NET Visual Studio/.NET (WinRT)

當您執行 Windows 生成時,Unity 負責進行調用,以從您的 C#/UnityScript/Boo 代碼 (DLL) 生成遊戲庫,幷包括其本機的運行時庫。對於 Windows 應用商店和 Windows Phone 8,它會導出 Visual Studio 解決方案,獨立 Windows standalone 除外,由於在其中 Unity 會生成 .exe 和所需的 .dll 文件。當我涉及到平臺生成話題時,我將在本系列的最後一篇文章中討論各類生成類型。較低級別的圖形繪製由 Windows 平臺上的 DirectX 執行。

在 Unity 中設計遊戲是一個至關簡單的過程:

  • 引進您的資產(藝術品,音頻等)。 使用資產商店。 編寫本身的資產。 聘請藝術家。 請注意,Unity 確實爲 Maya、Cheetah3d、Blender 和 3dsMax 提供本機支持,在某些狀況下要求將軟件安裝爲可使用那些本機 3D 格式,同時還可使用 obj 和 .fbx 這些常見的文件格式。
  • 使用 C#、JavaScript/UnityScript 或 Boo 編寫代碼,以控制您的對象、場景以及實現遊戲邏輯。
  • 在 Unity 中進行測試。 導出到平臺。
  • 在平臺上進行測試。 部署。

請稍等,我將講解更多內容!

本文是對 Unity 中的體系結構和過程的概述。我介紹了界面、分配代碼的基礎知識、GameObjects、組件、Mono 和 .NET 等。這使咱們可以更好的爲下一篇文章作好準備,在下一篇文章中我將深刻探討 2D 遊戲的遊戲組件組裝。請關注 Microsoft 虛擬學院,我會在夏末進行一個爲期兩天的 Unity 學習活動。請訪問unity3d.com/pages/windows/events 留意本地區的學習活動。


Adam Tuliper 是生活在陽光明媚的加利福尼亞州南部的一位 Microsoft 資深技術傳播者。他是一位獨立的遊戲開發人員,Orange County Unity Meetup(奧蘭治縣 Unity 聚會)的共同管理者,以及pluralsight.com 的做者。他和他的妻子即將擁有本身的第三個孩子,因此在他尚有閒暇的時間裏,您能夠經過訪問 adamt@microsoft.com 或 Twitter twitter.com/AdamTuliper. 來聯繫到他。

衷心感謝如下技術專家對本文的審閱:Matt Newman (Subscience Studios)、Jaime Rodriguez (Microsoft) 和 Tautvydas Žilys (Unity)

做爲一名軟件架構師,我已經編寫了不少系統,反向工程本機代碼惡意軟件,而且一般會搞清楚代碼方面的事情。 可是當提及製做遊戲,我還有點搞不清楚從哪裏開始講起。 我曾早期在 Windows 工做時,作了一些本機代碼圖形編程,但那不是什麼有趣的經歷。 後來,我開始專研 DirectX 開發,但我意識到,雖然它很是強大,但彷佛我要作的事所需的代碼很是多。

而後,有一天,我決定嘗試使用 Unity,我也看到了它確實能夠作一些使人驚訝的事情。 這篇文章在四部分系列當中做爲首篇,內容囊括了 Unity 的基礎及架構方面的知識。 我將演示如何建立 2D 和 3D 遊戲,最後演示如何構建 Windows 平臺。

Unity 是什麼

Unity 是一個 2D/3D 引擎和框架,爲您提供設計 2D、2.5D 和 3D 遊戲或應用場景的系統。 我之因此說是遊戲和應用程序,是由於我看到的不僅有遊戲,還有訓練模擬器、第一響應者應用程序,以及使用 Unity 開發須要與 2D/3D 空間交互的其餘以業務爲核心的應用程序。 Unity 憑藉的不只有代碼,還有可視化組件,讓您可以與它們進行交互,並將它們導出到各個主要的移動平臺,其中不少都是免費的。 (還有一個專業版很是不錯,但它不是免費的。 您可使用免費版原本實現大部分功能。)Unity 支持全部主要的 3D 應用程序和多種音頻格式,它甚至瞭解 Photoshop 的 .PSD 格式,以便您能將 .psd 文件導入到一個 Unity 項目中。 Unity 容許您導入和組裝資產,編寫代碼與您的對象進行交互,建立或導入動畫以便在高級的動畫系統中使用,等等。

圖 1 所示,Unity 已完成了用於確保跨平臺支持的工做,理論上您能夠經過單擊來更改平臺,雖然說如此,但一般至少還須要作少許努力,好比爲應用內購買與各商店集成。

Unity 支持的平臺 
圖 1 Unity 支持的平臺

也許 Unity 最強大的部分在於「Unity 資產商店」,它能夠說是在遊戲市場上最好的資產市場。 在這裏,您能夠知足對全部遊戲組件的需求,如用於 3D 模型的藝術品、3D 模型、動畫文件(參見商店內超過 10,000 個動畫的 Mixamo 內容)、音頻效果和全曲目、插件(包括那些能夠提供多平臺支持的多平臺工具包)、可視化腳本系統(如 PlayMaker 和 Behave)、先進的着色器、紋理、粒子特效等等。 Unity 界面是徹底腳本化的,容許不少第三方插件經過適當的集成來加入到 Unity GUI 中。 若是不是所有的話,至少也是大多數的專業遊戲開發人員會使用資源商店中的大量軟件包,若是您有不錯的資源,也能夠將它發佈在那裏。

人們對 Unity 的誤解

我猶豫地解釋,Unity 並不像人們一直質疑的那樣。 然而,默認狀況下 Unity 並非一個用來設計您的 2D 資產和 3D 模型(地形除外)的系統。 您能夠把一堆殭屍帶入到場景中,對它們進行控制,但您不能在 Unity 的默認工具中建立殭屍。 從這個意義上來講,Unity 並非相似於 Autodesk Maya 或 3DSMax、Blender 甚至 Adobe Photoshop 那樣的資產建立型工具。 可是,至少有一個第三方建模插件 (ProBuilder) 可讓您在 Unity 的內部建立一些 3D 組件模型;有 2D 環境生成器插件(如用於建立 2D 平鋪環境的 2D 地形編輯器),您還能夠在 Unity 中設計地形——使用地形工具建立出有樹木、草地、高山等使人歎爲觀止的景觀。 因此,我再一次猶豫地指出 Unity 可實現事項存在的一些侷限。

Microsoft 如何能融入進來? Microsoft 與 Unity 的緊密合做可以確保整個 Microsoft 堆棧能夠獲得平臺的強大支持。 Unity 支持 Windows 的獨立可執行性、Windows Phone,Windows 應用商店應用程序、Xbox 360 和 Xbox One。

開始使用

下載 Unity 的最新版本,手邊準備好一個帶有雙按鍵和可單擊滾輪的鼠標。 還有一個用於免費版模式或專業版模式下得到許可的單個下載。 您可訪問 unity3d.com/unity/licenses 查看兩種版本之間的區別。 編輯器是主要的 Unity 界面,它運行在 Windows(包括 Surface Pro)、Linux 和 OS X 上。

我將在接下來的文章中使用 Unity 進入真正的遊戲開發,可是,首先,我將探索 Unity 界面、項目結構和體系結構。

體系結構和編譯

Unity 是一個基於 C++ 的本機遊戲引擎。 使用 C#、JavaScript (UnityScript) 或較少使用的 Boo 編寫代碼。 您的代碼,而不是 Unity 引擎代碼,運行在 Mono 上或 Microsoft.NET Framework 上,這是實時 (JIT) 編譯的(iOS 除外,由於它不容許使用 JIT 代碼,而且它是由 Mono 使用預先 [AOT] 編譯將其編譯到本地代碼)。

Unity 讓您可以在 IDE 中測試遊戲,而無需執行任何種類的導出或生成。 當您在 Unity 中運行代碼時,您使用的是 Mono 的 3.5 版本,它的 API 兼容性基本上與 .NET Framework 3.5/CLR 2.0 的 API 至關。

在項目視圖中雙擊代碼文件,能夠打開默認的跨平臺編輯器 Mono­Develop,這樣就能夠在 Unity 中編輯您的代碼了。 若是您願意,您能夠配置 Visual Studio 做爲您的編輯器。

使用 MonoDevelop 進行調試,或使用 Visual Studio、UnityVS 的第三方插件。 在沒有 UnityVS 的狀況下,您不能將 Visual Studio 用做調試器,由於當您調試遊戲時,您不是在調試 Unity.exe,而是經過使用一個做爲發出命令並執行相關操做的軟件調試器在調試 Unity 內部的虛擬環境。

若要進行調試,就須要從 Unity 啓動 MonoDevelop。 MonoDevelop 有一個插件,您在 MonoDevelop 中調試 | 附加到進程以後,這個插件能夠打開返回到 Unity 調試器的鏈接,並向其發出命令。 UnityVS 使您可以將 Visual Studio 調試器鏈接回 Unity。

當您第一次打開 Unity 時,您會看到如圖 2 中所示的項目對話框。

Unity 項目嚮導 
圖 2 Unity 項目嚮導

在項目對話框中,您爲您的項目 (1) 指定了名稱和位置。 您能夠將任何程序包導入到您的項目 (2) 中,但此處您沒必要覈對全部事項;列表僅爲方便使用而提供。 您也能夠稍後導入一個程序包。 程序包是一個包含預先打包的資源(模型、代碼、場景、插件,可在 Unity 中打包的一切)的 .unitypackage 文件,且您能夠重複使用或輕鬆地分發它們。 但若是您不知道它是什麼,就不要在此處進行覈對;您的項目規模逐漸變大,有時會顯著增加。 最終,您能夠選擇 2D 或 3D (3)。 這個下拉列表是 Unity 中的新增項,它以前並無強大的 2D 遊戲工具,直到最近纔剛剛出現。 當設置爲 3D 時,默認首選 3D 項目,一直以來它都做爲 Unity 的經典行爲,因此它並不須要任何特別說起。 當選擇 2D 時,Unity 改變了一些看似小,而實則很重要的東西,我將在本系列的後續 2D 文章中對此進行介紹。

此列表的填充內容來自您系統上的特定位置的 .unitypackage 文件;Unity 提供了有關安裝的一些內容。 您從 Unity 資產商店下載的全部內容也做爲 .unitypackage 文件而出現,本地緩存在您的系統的 C:\Users\<you>\AppData\­Roaming\Unity\Asset Store 中。 所以,當它存在於您的系統上時,它就會顯示在這個列表中。 您能夠簡單地雙擊一個 .unitypackage 文件,該文件就會導入到您的項目中。

經過繼續使用 Unity 界面,我會從單擊圖 2 中的對話框中的「建立」開始,以便建立一個新的項目。 默認的 Unity 窗口布局如圖 3 所示。

默認的 Unity 窗口 
圖 3 默認的 Unity 窗口

在此,您能夠看到:

  1. 項目:您項目中的全部文件。 您能夠經過從資源管理器拖放到 Unity 中,將文件添加到您的項目中。
  2. 場景:當前打開的場景。
  3. 層次結構:場景中的全部遊戲對象。 注意,使用術語 GameObjects 和 GameObjects 下拉菜單。
  4. 檢查器:場景中選定對象的組件(屬性)。
  5. 工具欄:最左邊是平移、移動、旋轉、縮放,中央是播放、暫停、前進幀。 單擊「播放」可當即播放遊戲,而沒必要執行單獨的生成。 「暫停」可暫停遊戲,「前進幀」運行一次前進一幀,爲您提供很是緊湊的調試控制。
  6. 控制檯:此窗口能夠隱藏,但它顯示的輸出來自您的編譯、錯誤、警告等。 它還顯示來自代碼的調試信息;例如,Debug.Log 會在此處顯示它的輸出。

值得一提的是,「遊戲」選項卡緊挨着「場景」選項卡。 當您單擊「播放」時,此選項卡激活,您的遊戲開始在這個窗口中運行。 這就是所謂的播放模式,它爲您提供一個用來測試遊戲的場地,甚至可讓您切換回「場景」選項卡進行實時修改遊戲。 但此處要很是當心。 當播放按鈕高亮顯示時,您處在播放模式下,當您離開它時,您在播放模式下所作的任何更改都將丟失。 我,以及我曾交談過的幾乎全部的 Unity 開發人員,都曾由於這種方式而丟失了工做,因此我在播放模式下,經過編輯 | 首選項 | 顏色 | 播放模式色彩更改了個人編輯器顏色,使它更加明顯。

關於場景

您的遊戲中運行的一切都存在於一個場景中。 當您針對某個平臺打包您的遊戲時,由此產生的遊戲是一個或多個場景的集合,包括您添加的全部依賴於平臺的代碼。 在一個項目中您能夠有足夠多您須要的場景。 一個場景能夠看做是遊戲中的一個基準,但您在一個場景文件中能夠有多個基準,只要將玩家/照相機移動到場景中不一樣的地點便可。 當您下載第三方程序包,或從資產商店中下載示例遊戲時,一般您必須在項目中查找可打開的場景文件。 場景文件是一個單個文件,它包含各類關於項目中用於當前場景的資源的元數據及其屬性。 重要的是,和任何其餘工具同樣,要在開發過程當中常常按下 Ctrl+S 組合鍵保存場景。

雖然 Unity 有時在打開一個項目時,會建立一個新的空場景,這時您必須在項目資源管理器中查找場景,但一般狀況下,Unity 會打開您最後操做的那個場景。 這會讓新用戶感到很困惑,可是若是您碰巧打開本身的最後一個項目,而且想知道您所完成的工做都去了哪裏,那麼記住這一點很重要! 請放輕鬆,您將在項目中保存的場景文件中找到工做。 經過單擊圖 4 中顯示的圖標並對場景進行篩選,您能夠搜索您項目中的全部場景。

篩選項目中的場景 
圖 4 篩選項目中的場景

在一個場景中,若是沒有照相機,您就看不到任何東西,若是沒有附加到 GameObject 的音頻偵聽器組件,您就什麼都聽不到。 可是請注意,在任何新的場景中,Unity 老是建立一個照相機,上面已經配備有音頻偵聽器組件。

項目結構和導入資產

Unity 項目和 Visual Studio 項目不一樣。 您不打開項目文件或解決方案文件,由於它不存在。 您將 Unity 指向一個文件夾結構,它將該文件夾打開爲一個項目。 項目中包含「Assets」、「Library」、「ProjectSettings」和「Temp」文件夾,但顯示在界面中的只有「Assets」文件夾,如圖 4 所示。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!但願你也加入到咱們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

相關文章
相關標籤/搜索