2014年9月30日 星期二

使用 Unity 和 C# 開發您的第一款遊戲(MSDN轉譯)


2014-09-29 MSDN Unity官方平臺
作者:Adam Tuliper 微軟技術傳道者

作為一名軟體架構師,我寫過很多系統、反向工程本機程式惡意軟體,並且通常會搞清楚語言方面的事情。 但是當說起製作遊戲,我還有點搞不清楚從哪裡開始講起。 我曾早期在 Windows 工作時,做了一些本機程式圖形程式設計,但那不是什麼有趣的經歷。 後來我開始專研 DirectX 開發,我發現,雖然它非常強大,但我要做的事似乎需要寫很多程式。

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

Unity 是什麼

Unity 是一個 2D/3D 引擎,為您提供設計 2D、2.5D 和 3D 遊戲或各種應用的系統。 我之所以說是遊戲和應用程式,是因為我看到的不只有遊戲,還有訓練模擬、即時反應的應用程式,以及需要與 2D/3D 空間互動的產品為核心的應用程式。 Unity 憑藉的不僅有程式,還有視覺化元件,讓您能夠與它們進行互動,並將它們匯出到各個主要的移動平臺,其中很多都是免費的。 (還有一個專業版非常不錯,但它不是免費的。 您可以使用免費版本來實現大部分功能。)Unity 支援所有主要的 3D 應用程式和多種音訊格式,它甚至能讀取 Photoshop 的 .PSD 格式,以便您能將 .psd 檔導入到一個 Unity 專案中。 Unity 允許您導入和組裝資源,編寫程式與物件進行互動,創建或導入動畫以便在動畫系統中使用等等。


如圖 1 所示,Unity 已完成了跨平臺支援的工作,理論上您可以按一下來切換平臺,但通常還需要做少量工作,比如整合商店和金流。


圖 1 Unity 支援的平臺

也許 Unity 最強大的部分在於“Unity Asset Store資源商店”,它可以說是在遊戲市場上最好的商店。 在這裡您可以找到所有遊戲元件的需求,如 美術設定、3D 模型、動畫檔(商店內
的 Mixamo 套件有超過 10,000 個動畫)、音訊效果和音樂、外掛程式(包括那些可以提供多平臺支援的套件)、視覺化腳本系統(如 PlayMaker 和 Behave)、先進的著色器、貼圖、粒子特效等等。 Unity 介面是完全腳本化的,允許很多協力廠商外掛程式通過適當的整合加入到 Unity GUI 中。 就算不是全部的開發者,至少也是大多數的開發者會使用資源商店中的套件,如果您有不錯的作品,也可以將它發佈在那裡。

人們對 Unity 的誤解

我猶豫要如何解釋Unity 並不像人們質疑的那樣。 然而,預設情況下 Unity 並不是一個用來製作 2D 和 3D 模型(地形除外)的系統。 您可以把一堆僵屍角色帶入到場景中,控制他們走來走去,但你不能在 Unity 中畫一隻僵屍。從這個意義上來說,Unity 並非類似於 Autodesk Maya 或 3DSMax、Blender 甚至 Adobe Photoshop 那樣的開發工具。 但有一個協力廠商建模外掛程式 (ProBuilder) 是可以讓你在 Unity 內創建一些 3D 元件模型,也有 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 4.x 中執行程式時,您使用的是 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 中所示的項目對話方塊。


圖 2 Unity 專案精靈

在專案對話方塊中,您為您的專案 (1) 指定了名稱和位置。可以將任何套件加入專案 (2) 中,這裡你不必全選,列表僅為方便使用而提供,事後都可以匯入。套裝程式是一個包含預先打包的資源(模型、程式、場景、插件,可在 Unity 中打包的一切)的 .unitypackage 檔,且您可以重複使用或分發它們。

如果你不知道這些是什麼,就不要在此處打勾,隨著你的專案規模變大會影響大小。 最後,您可以選擇 2D 或 3D (3)。 這個下拉清單是 Unity 新的項目,之前並沒有強大的 2D 遊戲工具,直到最近才出現。 當設定 3D 時,預設會是3D專案的環境。當選 2D 時,Unity 改變了一些看似小,但很重要的設定,我將在本系列的後續 2D 文章中對此進行介紹。

此清單的內容來自您系統上的 .unitypackage 文件,Unity 提供了一些內容。 您從 Unity 資產商店下載的內容也會作為 .unitypackage 檔而出現,存在你的系統 C:\Users\<you>\AppData\­Roaming\Unity\Asset Store 中。 因此當它存在你電腦上時,就會顯示在這個清單中。 您可以簡單地按兩下匯入一個 .unitypackage 檔。

按一下圖 2 中的對話方塊中的“Creat”開始,建立一個新的專案。 預設的 Unity 窗口如圖 3 所示。


圖 3 預設的 Unity 窗口

您可以看到:
1. Project:專案中的所有檔案。可以透過從檔案總管拖放到 Unity中來加入你的專案。

2. Scene:當前打開的場景。

3. Hierarchy:場景中的物件,我們用 GameObjects 和 GameObjects 下拉式功能表來稱呼。

4. Inspector:場景中選定物件的元件(屬性)。

5. Toolbar:最左邊是平移、移動、旋轉、縮放,中央是播放、暫停、前進。 按一下“播放”可立即播放遊戲,而不必另外編譯。 “暫停”可暫停遊戲,“前進”一次執行一幀,為您提供非常札實的調整控制。

6. Console:此視窗可以隱藏,但它顯示你的編譯、錯誤、警告紀錄等。 也會顯示程式的資訊;例如,Debug.Log 會在此處顯示它的輸出。

值得一提的是,“Game”介面在“Scene”介面旁。當按下“播放”時,遊戲介面會啟動並開始在這個視窗中執行。這就是所謂的播放模式,它提供一個測試遊戲的環境,也可以切換回“Scene”介面即時修改遊戲。但要非常小心,當你處於播放模式時,針對場景的修改在離開播放模式後會還原。 我和許多 Unity 的開發人員聊過,大家都曾因為這樣而工作被還原,所以我在播放模式下,從Edit/Preferences/Colors)更改了Playmode tint的顏色來讓我不會出錯。

關於場景

遊戲中的一切都存在於一個場景中。當針對平臺發佈遊戲時,產生的是一個或多個場景的集合,包括增加的平臺程式。在一個專案中你可以有多個場景。一個場景可以看作是遊戲中的一個關卡,但你在一個場景檔中可以有多個關卡,只要將玩家/鏡頭移動到場景中不同的地點即可。當您下載第三方套件或從資產商店下載範例時,通常你必須在專案中找出場景檔。場景檔是一個單體檔案,它包含各種關於專案中需要用到的資源中繼資料及屬性。 和其他工具一樣,在開發過程中常按下 Ctrl+S 來存檔。

雖然 Unity 有時在打開一個專案時,預設會是一個新的空場景,這時你必須在專案介面中找出場景檔,但通常Unity 會打開最後操作的那個場景。這讓新手感到很困惑,如果你想知道所完成的工作都去了哪裡,放輕鬆!記住這一點很重要!透過按一下圖 4 中顯示的圖示對場景進行篩選,您可以找出專案中的所有場景。


圖 4 篩選專案中的場景

場景中如果沒有鏡頭就看不到任何東西,如果沒有任何 GameObject 有Audio Listener元件,就什麼都聽不到。 但還好在新的場景中,Unity 總是會建立一個鏡頭,上面已經有Audio Listener元件了。

專案結構和導入資產

Unity 專案和 Visual Studio 專案不同。 你不用打開專案或ssl文件,因為沒有那種東西。Unity 所在的資料結構為專案。 專案資料夾中包含“Assets”、“Library”、“ProjectSettings”和“Temp”資料夾,但顯示在介面中的只有“Assets”資料夾,如圖 4 所示。


“Assets”包含您所有的資產(美術、程式、音訊),你專案中的每一個檔都放在這裡。這是 Unity 編輯器中的頂層資料夾。 只能在 Unity 介面中進行更改,決不能通過檔案總管。

“Library”是匯入資源的本地暫存;它為資源保留所有中繼資料。 “ProjectSettings”儲存你透過“Edit/Project Settings”的設定。 “Temp”用於產生過程中來自 Mono 和 Unity 的暫存檔案。

我想強調的是只通過 Unity 介面(而不是直接通過檔案總管)進行更改的重要性。 甚至包括簡單的複製和貼上。 Unity 透過編輯器追蹤物件中繼資料,所以使用編輯器來進行更改(幾個附加案例之外)。 你可以從檔案總管拖放到 Unity,這種效果很好。

至關重要的 GameObject

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




圖 5 Unity 中的 GameObjects

GameObject 非常簡單能從“Inspector”介面看到屬性。可以在圖 6 中看到一個空的 GameObject 已被加入場景中,請注意它在檢查器中的屬性。GameObject 在預設情況下沒有可視屬性,當你選擇物件時只會顯示小圖示。 代表它只是一個空物件。


圖 6 簡單的 GameObject

GameObject 有一個“名稱”、一個“標籤”(類似於您透過 XAML 中的 FrameworkElement.Tag 的文本標籤或在 Windows 表單中的標籤)、一個“Layer層”和“Transform”(可能是最重要的屬性)。

“Transform”(轉換)屬性是 GameObject 的位置、旋轉以及縮放的資訊。 Unity 使用左手坐標系,因此可以將螢幕的座標視為 X(水平)、Y(垂直)和 Z(深度,也就是進出螢幕的方向)。

在遊戲開發中,使用向量座標非常普遍,我在後面的文章會詳細介紹。 就目前而言,知道 Transform.Position 和 Transform.Scale 都是 Vector3 的物件就可以了。 Vector3 是一個簡單的三維向量,換句話說,它就是三個點:X、Y 和 Z。 透過使用這三個值,您可以定義一個物件位置,甚至沿著某個方向移動一個物件。

組件Components

您可以透過增加元件,對 GameObjects 增加功能。 您所加入的元件都會顯示在“Inspector”介面中。 有 MeshRender 和 SpriteRender 組件,音訊和相機功能組件,物理相關的元件(碰撞體和剛體)、粒子系統、路徑查找系統、第三方廠商組件等。可以使用程腳本件將程式分配給物件。通過增加功能,元件能夠為您的 GameObjects 帶來勃勃生機,類似於軟體發展中的裝飾器模式,甚至比這更好。

我會將一些程式指定給新的 GameObject,在這種情況下,您可以透過“GameObject/Create Other/Cube”方式建立一個簡單的方塊。我把這個方塊命名為“Enemy”,然後又創建了另外一個,這下就有兩個方塊了。在圖 7 中我將一個方塊移動和另一個方塊距離 15 個單位,這只需要在選擇物件後,使用工具列的移動工具或 W 鍵就能夠做到。


圖 7 包含兩個方塊的專案

裡面是一個簡單的程式,會找到玩家並朝它移動。 以下兩種方法都可以執行移動操作,改變 Transform.Position 屬性每一幀都移動到一個新位置,或者可以對該物件施予一個物理力量, Unity 會
執行其餘的工作。

每一幀都做些處理和“移動到這一點”相比,在思路上有些不同。在這個範例中,我打算每一幀都對物件移動一點點,所以我對移動到什麼地方可以有精確的控制。如果您不想每一幀都做調整,那麼有些插件可以執行單個函式呼叫移動操作,比如免費開放的 iTween 套件。

我做的第一件事就是在“專案”視窗中用滑鼠按右鍵,建立名為 EnemyAI 的一個新 C# 腳本。 若要將此腳本分配給對象,只需將檔案拖到場景或層次中的物件即可,程式就會應用到物件。剩下的 Unity 會處理。 就是這麼簡單。

圖 8 顯示已分配有腳本的 Enemy 方塊。


圖 8 已分配有腳本的 Enemy

查看圖 9 中的程式,並注意全域變數。在編輯器中,你可以看到我的全域變數出現時,有一個選項可以取代預設值。這代表你可以在介面中更改預設值,這裡也可以顯示許多不同物件類型的全域變數(而非屬性)。 如果我拖放此腳本到另一個 GameObject,則該腳本元件會獨立產生另外實體。這是個基本的示範,它可以更多功能,比方說增加一個 RigidBody 元件到這個物件,但現在我會將它保持簡單的樣子。

圖 9 EnemyAI 腳本

public class EnemyAI : MonoBehavior
{
// 這些值將出現在編輯器中,而完整的屬性則不會出現。
public float Speed = 50;
private Transform _playerTransform;
private Transform _ myTransform;
// 在分配到的 GameObject 啟動時調用。
void Start()
{
// 查找某個tag為“Player”的 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()
{
// 設定應該以每秒多快的速度移向"Player"

//在 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 正在編譯你的代碼。您可以通過“Edit/Preferences/External Tools/External Script Editor”來修改您的程式編輯器(而不是除錯器)。任何編譯問題都將出現在您的 Unity 編輯器螢幕的最下方狀態列,所以請留意。如果您嘗試執行的程式中存在錯誤的話,Unity 不會讓你繼續。

編寫程式

在先前的程式範例中,有兩種方法,“Start”和“Update”,而且類 EnemyHealth 是從 MonoBehavior 基類繼承而來的,通過使用基類,您可以簡單地將 EnemyHealth 類分配給一個 GameObject 物件。在基類中有很多可用的功能,並且通常還有很多方法和屬性。主要的方法就是,如果它們存在於您的類中,Unity 將進行呼叫。也有少數方法可以呼叫(請參閱 bit.ly/1jeA3UM)。雖然類似於 ASP.NET Web 表單頁面生命週期,有很多方法,但通常只能使用幾個。以下是在類中最常見的可執行的編碼方法,這些方法涉及到 MonoBehavior 派生類事件的序列:

Awake:當物件第一次進行初始化時,每個物件呼叫一次此方法。其它元件可能還沒有被初始化,所以這種方法通常用來初始化當前的 GameObject。您應該始終使用這個方法來初始化 MonoBehavior 派生類,而不是某個構造函數。不要在此試圖在場景中查詢其他物件,因為它們可能還沒有初始化。

Start:在物件生命週期的第一幀中,並且在使用任何“Update”方法之前呼叫。這非常類似 Awake,但使用 Start法代表其他物件已通過 Awake 初始化並且存在於您的場景中,因此,您可以在代碼中輕鬆查詢其他物件,如下:

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

Update:每一幀都會呼叫。如果你想問更新的頻率?它是可調整的,完全取決於計算。為了呈現不同物件的原因,系統總是不斷變化著承載,所以這個畫面播放速率每秒都會變化。進入播放模式查看當前的畫面播放速率時,您可以按下“Game”介面中的“Stats”按鈕,如圖 10 所示。


圖 10 獲取統計資訊

FixedUpdate:一秒鐘內會以固定次數呼叫此方法,和畫面播放速率無關。因為一秒鐘內呼叫“Update”的次數是變動的,且不與物理引擎同步,所以當您想為某個物件提供一個力道或其他一些物理相關的函數時,最好的方法是使用 FixedUpdate。預設情況下,FixedUpdate 每 0.02 秒被呼叫一次,這代表 Unity 也在每 0.02 秒執行一次物理計算(這時間間隔稱為“Fixed Timestep”,並可讓開發者調整),同樣與畫面播放速率無關。

Unity 產生的程式項目

一旦您的專案中放入了程式,Unity 就會在您的根資料夾中創建一個或多個專案檔案(這在 Unity 介面中看不見)。這些並非 Unity 引擎的二進位檔案,而是 Visual Studio 或 MonoDevelop 的專案,你可以在其中編輯和編譯程式。Unity 可以建立很多個看似獨立的項目,如圖 11 所示,雖然每一個都有著重要的用途。


圖 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 匯出時,Unity 負責進行呼叫,以從您的 C#/UnityScript/Boo 程式 (DLL) 產生遊戲庫,並包括本機的執行庫。針對 Windows 商店和 Windows Phone 8,它會匯出 Visual Studio 方案,獨立 Windows standalone 除外,因為 Unity 會生成 .exe 和所需的 .dll 文件。關於平臺發佈議題,我將在本系列的最後一篇文章中討論各種產生類型。較低級別的圖形繪製由 Windows 平臺上的 DirectX 執行。

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

· 匯入物件(美術、音訊等)。使用Asset Store。或自己做Asset。找個美術。 Unity 支援 Maya、Cheetah3d、Blender 和 3dsMax ,特定格式會要求你安裝繪圖軟體,同時可以使用 obj 和 .fbx 這些常見的檔案格式。

· 使用 C#、JavaScript/UnityScript 或 Boo 編寫程式,控制你的物件、場景以及實現遊戲邏輯。
· 在 Unity 中進行測試並匯出到平臺。
· 在平臺上進行測試並發佈。

等等!我還想知道更多!

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

2014年9月24日 星期三

【GMGDC】Unity 5光照貼圖技術分享


來自Unity大中華區的報導
原文章:http://forum.china.unity3d.com/thread-603-1-1.html


2014年9月24日,第三屆全球移動遊戲開發者大會GMGDC在成都市高新區世紀城國際會議中心隆重開幕。在第一天的會議中,Unity大中華區技術總監劉鋼出席了Imagination開發者日,並為現場的開發者分享了Unity 5 光照貼圖烘焙的相關知識。

劉鋼個人簡介:
  浙江大學理學博士,目前擔任Unity Technologies大中華區技術總監職務。主要成就有:3D圖形架構師參與DirectX10.0世代GPU的架構設計工作、帶領團隊研發了一款應用於Autodesk公司大多數旗艦產品的通用3D圖形引擎等。


演講記錄:

今天簡單地跟大家分享一下Unity5.0裡面的光照貼圖烘焙技術。由於時間只有20分鐘,所以只能給大家一些概要性的介紹,沒有辦法深入,等到Unity5版本正式推出之後,我會給大家一些更詳細的介紹。

接下來我會分3個部分跟大家講解。
第一部分講解一下在以往的Unity版本中所採用的光照烘焙方法,以及Unity5.0中為什麼會採用一套全新的光照貼圖烘焙方法。
第二部分講解Imagination的PowerVR Ray Tracing方法。第三部分講解Geomerics的Enlighten方法。後兩種方法都會被引入到Unity 5版本當中去。

首先我們來介紹Unity在4.X版本裡面使用光照烘焙的方法。

我們採用的是Autodesk的Beast,而我們在5.0版本中可能會把它徹底移除。這是為什麼呢?

我們先介紹一下Beast的弱點吧。Beast只能烘焙靜態的光照貼圖,而不支援動態光照。一般而言,使用Beast的工作流程是:先建造一個場景,然後在場景中佈置各種光源,進而點擊Bake操作鍵,接下來大家就可以喝喝咖啡,或者直接下班回家了,因為整個烘焙過程可能需要幾分鐘、幾小時,甚至是更長的時間。這樣的過程還不一定得到正確的結果,如果發現前面的烘焙結果存在問題,還要重新返回到第一步,直至得到滿意的烘焙結果。這樣的過程對於廣大開發者來說肯定是一個不太友好的過程,勢必會影響大家的工作效率。

那麼既然我們說原來的方法存在著一定的問題,那麼理想的光照方案是什麼樣的呢?

第一,理想的方法不需要任何的預計算時間;

第二,它能夠讓場景中所有與光照有關的資訊都能夠實現動態改變,比如說動態改變光源、改變材質、改變環境光照,甚至改變場景中幾何體的形狀;第三,這樣的一套方法還需要做到即時渲染,這不僅包括Console設備,也包括我們手中的移動設備。可惜的是,這樣一套理想的方案在目前是不存在的。很多的遊戲開發廠商,甚至是硬體開發廠商,都做過一些實踐或者嘗試,但是最終都失敗了,都沒能同時實現剛才所說的這幾個目標。

但是有一種繞行的方式,可以達到近似的效果。這就是Unity5.0當中所採用的方法,我們會捨棄掉Beast,取而代之的是兩種方案的結合,這就是PowerVR Ray Tracing和Enlighten的結合。

為什麼要使用這兩個方案的結合呢?

我先給大家一個簡要的概括:這兩種方案都可以實現全域的GI,但是相比較而言的話,PowerVR Ray
Tracing的特點是不需要烘焙過程,速度非常快,但是它的效果不是非常理想;而Enlighien的特點仍然需要一定的烘焙過程,但是效果非常好。更具體一點說,我們會在Unity編輯器環境下採用PowerVRRay Tracing方案,從而利用它快速即時的特點,你可以在場景中隨時動態調整任何的東西,都能及時地看到調整的效果;一旦你把這個效果調整到了一個比較理想的狀態之後,就可以採用Enlighten來進行預處理和烘焙,從而達到更好的即時渲染效果。特別地,Enlighten具有很好的跨平臺特性,能夠在從移動到Console等多個平臺上即時地運行。

在Unity 5.0中,PowerVR Ray Tracing還有一個特點,就是它能夠實現漸進式的效果過渡,一開始顯示比較粗糙的、類似於馬賽克式的效果,然後逐步反覆運算求精,可能在若干毫秒之後,就會呈現出非常完美的效果。大家可能還會有一個問題,如果說我在Editor的模式下,採用PowerVR Ray Tracing調整出了一個比較好的效果,那麼我怎麼保證它和Enlighten最終取得的效果是近似相同的,如果完全不同,那我們就白花時間調整了!這個肯定是大家不希望見到的結果。所以我們在Unity中引入PowerVR Ray Tracing時是進行了調整和改變的,使PowerVR Ray Tracing和Enlighten的輸入是一致的,然後儘量使他們的輸出也是一樣的。

接下來我們來看一段視頻,來看看PowerVR Ray Tracing在Unity編輯器中的使用方法。大家可以看到,我們可以動態地改變沙發的材質,並即時地預覽到調整效果。此外,還可以動態調整場景中的體積光源,也可以動態調整方向光的照射方向,以及聚光燈的位置,都可以即時地觀看到調整結果。

再說一下Enlighten,它能夠實現動態光照,也支援傳統的烘焙過程,並能把兩者無縫的拼接起來,最終保證在畫面上面不會有任何的走樣效果。這裡,我們也可以通過一個視頻看看光照效果。這個場景中是一個太空艙,太空艙外面有一個環境光照,還有一個探視口,從外面有光線射進來。這個場景總的光照條件是非常非常複雜的,有來自於窗外的環境光照,有一些直接的方向光源,有動態材質還有一些粒子效果,所有這些東西都可以動態地疊加起來,對於周圍環境的影響也是即時的。

我們剛才簡單地介紹了Unity5.0中將會採用的光照貼圖烘焙方法,最後我來做一個簡單的總結:在Unity的以往版本中,我們使用了Beast;在Unity5版本中,我們會捨棄Beast,進而採用PowerVR Ray Tracing和Enlighten的結合;PowerVR負責編輯器中的編輯模式,即所見即所得的模式;而Enlighten會負責遊戲內的即時渲染。最後,大家可能還有一個疑問,就是Enlighten會問會不會有效率問題。

我們說,在一些相對中高端的設備上,Enlighten的運行效率是非常高的;而在一些低端的設備上,Enlighten同時支援與Beast相似的靜態光照貼圖方式,因而也可以保證運行效率。

因為時間有限,今天就和大家分享這麼多,謝謝大家!

2014年9月23日 星期二

Unity 5 的全域光照

原文連結:http://blogs.unity3d.com/2014/09/18/global-illumination-in-unity-5/
作者:Jesper Mortensen

Unity5在圖形模擬和光照特效方面做了重大改變。自從3.0版本開始,Unity的光照效果一直局限於烘焙好的光照貼圖。然後我們在全域光照領域有了很大的提升與改進,現在是時候將這個功能從Unity的沙盒中開放出來了。其中之一的新特性就是改善的光照流程為基礎上的全新全域即時光照,也是本文的重點。 


新加坡團隊的Paul Tham採用Unity 5 光跡追蹤後的娃娃模型展示

淺談全域光照(Global Illumination)
全域光照(以下簡稱GI)演算法是基於光傳輸的物理特性的一種模擬。模擬光在3D場景中面與面之間的傳輸的方式,能有效的改善遊戲的模擬度。不僅如此,他還可以傳達一種意境,如果用的好也會有效改善你的遊戲體驗。GI演算法不僅考慮光源的直射光,而且還考慮場景中其他材質表面的反射光。一般來說在遊戲中由於即時運算的關係,間接光照的模擬因效能消耗過大而無法採用。

這些都是源於下面這個淺顯的方程式:


簡單來說,從某一觀察點看到的光是從場景中物體表面點入射的光(Le)與從觀察點上方的半球入射的光疊加。Li描述的是從半球上某一角度w’ 入射的光。反射項p描述的是光線如何反射到觀察點,這項的取值依賴於入射角w’ 和觀察者的角度w。

細心的你可能已經發現L(x,w) 在方程式的兩邊,而且有一個還在在積分式中。如果不是這種情形,我們也許已經計算出全域光照的結果。由於物理規律是不太可能去改變的,研究協會提出了一套解決方案。

其中最流行(最古老的)的是光跡追蹤演算法。這個演算法從根本上改善了GI演算法,在演算最難的部分使用了一些比較耗時的演算技巧。光跡追蹤在電影或電視CG動畫上經常被運用。儘管該領域有大量的研究成果,但是每張圖的渲染還是要花費數秒的時間(哪怕使用非常先進的GPU)。

光跡追蹤通常使用的是螢幕空間,所以一張圖每一幀都需要重新渲染。這代表可以完全支援全動態的場景:燈光、材質、幾何形狀可以自由變換的動畫。但這也是一個缺點,因為每當鏡頭移動的時候,一張全新的圖片需要被渲染,而這張圖像的轉換需要花費數秒鐘的時間,導致這技術無法用於即時的遊戲場景。

一張沒有轉換完全的圖會有很多噪點,所以圖像在完全轉換之前會有嚴重的閃爍。可以使用濾波來降低這種影響,但無法徹底消除。下面是一些在不同轉換程度的圖像。
 

 光跡追蹤圖片在轉換過程各種階段

近期有很多新的圖像混合演算法出現,其中大部分都在GPU中運行,例如體椎追蹤。這些演算法中大部分需要在具有一定記憶體大小的桌上電腦的GPU上運行,只適合高端PC系統。為了讓全域光照在更多的平臺(包括手機)運行,必須做出了一些妥協。

Enlighten介紹:

Enlighten對於這個問題有了一套很好的解決方案。通過優化適用於各種不同的平台,從手機一直到桌上型電腦。已經被運用於戰地風雲4Battlefield 4,榮譽勳章MoH Warfighter等3A級遊戲,證明它是穩定可靠的。

他的運作原理是如果一些可見光是預先計算的(上面那個GL方程右側的積分體),那麼在手機實現即時光照就可行。

Enlighten允許的動態更改:
  • 光源
  • 環境光
  • 材質屬性(漫反射率和表面自發光) 
GI模擬中的幾何體部分必須被設置為靜態的。但是動態的幾何體可以使用GI根據靜態幾何體產生的光探針進行即時渲染。為了實現這個功能,Enlighten預先計算GI即時模擬需要的資料。這個資料存儲在一個即時模組中,模組適用於大部分平臺:SX, Windows, Linux, iOS, Android, PS Vita, PS3, PS4, Windows Phone, Xbox360 and XboxOne。WebGL目前正在開發中,還不確定何時支援。

Enlighten輸出資料如下:
  • 即時光照
  • 即時光探針
  • 即時立體貼圖 
Enlighten受限於GI對於漫反射傳輸的計算。漫反射是最重要的傳輸方式,因為他包含了全域光照的資訊。由於漫反射是低頻的,所以即時光照貼圖可以是一張即時更新的低解析度圖像。另外通過增加動態更新的立方貼圖來實現鏡面/光滑面的反射。在Heckbert notation中,Enlighten使用了光線追蹤子集L(D)*(S|G)?E。這代表Enlighten包含了大部分的GI效果。而缺失的效果中最重要的是鏡面反射(俗稱散焦),你得用些技巧來達到該效果。

下面是使用Enlighten,兩種不同的光線設置渲染圖像的例子。這些光線設定是完全動態且即時的。

 維京人村莊 - 黎明

接下來的這個鏡頭,使用了更加明亮的藍色天空和更高更強烈的陽光:

 維京人村莊 - 陽光普照

下面這個鏡頭降低了陽光的強度,環境光為灰色且不飽和的。主要為環境光照:

 維京人村莊 - 陰天

最後是一張日落時分溫暖靜謐的畫面:

 維京人村莊 - 夕陽

使用這種技術,可以賦予你遊戲非常逼真的時間週期。

Enlighten預先計算

場景中的大部分幾何體都必須是靜態的,實際上,這些大尺寸的幾何體都會參與到GI的計算。在預計算階段,Enlighten會自動將場景分解為數個子系統。去改變如何生成這些子系統是可行的。這些系統被用於預計算大量的並行通道。通道之間是息息相關的,並解決每一個系統的任務。這裡有個圖例闡述維京人村落如何被自動分解成多個子系統。 
視覺化自動產生的Enlighten子系統 

在預計算完成後,系統之間的相互關係就確定了。這可用在執行時減少對於靜態幾何體的限制。在執行時,不同系統之間傳輸的間接光總量是可以控制的。這可以讓你在系統切換實現淡入淡出,用於實現拆除或開門的效果。

Enlighten運行時:

Enlighten可以有效地在手機設備上執行。它可以在一個執行緒中非同步執行(或多個,如果平臺允許)。手機平臺中最突出的是直接光照或動態光照的陰影貼圖需要在GPU中計算。所以手機平臺中只允許少量的動態光照。但即時調整幾何物體的自發光屬性卻幾乎無消耗。Enlighten將自發光的物體作為可見物體計算。這代表自發光物體可以不耗效能產生品質好的陰影,即使在低解析度配備下。

得益於GPU對於直接光照和陰影投射的支援,Enlighten可以很好的實現動態光照,無論是在桌上型電腦系統還是遊戲機,只要是能支援遊戲的系統。

這裡是一個在ARM架構的平板上使用Enlighten的例子。



關於烘焙

對於某些遊戲來說選擇烘焙貼圖可能更合適,所以Unity將來仍會很好的支援和發展烘焙流程。Unity5中光照的輸入參數有:光源、自發光材質及環境光,你可以選擇使用烘焙或者即時GI。選擇烘焙的光照和Unity之前版本有同樣的參數,它將被烘焙成光照貼圖,而動態光照則由Enlighten運行庫來處理。烘焙和即時GI可以無縫接合。

Unity5中也有些新的烘焙特性。其中之一就是光照貼圖被分散成組件形式。每個圖集都包含5個光照貼圖,它們分別是直接光照、間接光照、直接方向光、間接方向光和AO圖(環境光吸收)。烘焙完成後,它們組合成光照貼圖供遊戲使用。在編輯器中可以指定這些圖的融合參數。你可以調整這些選項來適配你最終的輸出效果。例如,你可以很輕易的增加間接照明,這只需要在重新烘焙之前增加一個合成的工作,當然這個工作會花費你數秒鐘的時間。

光照流程

Elighten不僅僅提供遊戲中的即時GI。其中一個很重要的改進就是,Elighten為美術提供了全新的光照流程。當美術需要看到更高品質的細節的時候,它提供了更快的反覆運算模式。它使用反覆運算取代了完全重新的烘焙。不需要使用者的操作,場景會被重新預計算與烘焙的效果替換,而這些預計算與烘焙都是在背景完成的。編輯器會自動檢測場景的改變,並且執行所需的步驟來修復光照。大多數情況下,對光照的反覆運算幾乎是瞬間完成的。

下面是一個使用新的光照流程的影片教學(英文):


什麼類型的遊戲需要用到Enlighten?

之前提過,即時GI的局限性在於大規模的場景設定必須是預先確定的。是追求只適用于高端系統完全動態光照的解決方案,還是覆蓋儘量多的場景並且可以在手機平臺使用達到更廣的市場解決方案,我們只能二選一。在5.0中我們選擇了後者。下面是使用即時GI會存在一定困難的遊戲類型列表:

Q:可以實現開門效果嗎?
A:上文探討過,場景會被自動劃分為子系統,所以這取決於你的門,某些情況下是可以的。而另外一些就要借助腳本了。 (相關腳本會在5.x的版本中發佈)

Q:支持銷毀嗎?
A:Enlighten支援場景中物體的動態透明。這代表遊戲中要被銷毀的物體需要首先被標注。當然這不是最理想的解決方案。(功能會在5.x中提供)

Q:我可以通過串流一塊塊載入關卡嗎?
A:當然,子系統可以通過串流載入。你可以載入你的場景塊,然後手動或者通過腳本載入。(該功能會出現在5.0)

Q:可以使用一些預先做好的模組半自動產生場景嗎?(類似無盡的跑者)
A:可以的,如果預先計算好模組所在位置不同的組合,你可以實現各模組之間的切換。這個就類似於你製作跑酷時的光照烘焙(無縫)。(這裡所需要預計算的API會在5.x中提供)。

Q:可以用程式化建立像是創世神(Minecraft)這樣的遊戲世界嗎?
A:長話短說,不可以。然而我們也在做很多專案,其中使用了Imagination TechnologiesPowerVR Ray Tracing然而來實現GI預覽和混合。這可能是一個備選的方案用來解決由程式或者玩家創建場景的問題。PowerVR Ray Tracing技術支援全動態場景的GI。他不是全即時的,而且開始出現的數幀裡可能會有噪點,但這是一個非常有前景的方向。在允許一定的延遲的情況下,它非常適用於用戶自訂場景的光線渲染。(因項目還在研發階段,暫時還沒有案例)

哪些是Free版,哪些是Pro版所擁有?

這些特性在Free版和Pro版中的界限目前還不清晰,我們會在後續的文章中公佈。

5.0中有哪些?

下面是5.0中的主要功能:


  • 遊戲即時GI組件Enlighten
  • 反覆運算流程(服務於即時GI與烘焙)
  • 反射探針
5.0後續:

由於我們正對光照流程和生成做了很多的改變,其中一些存在一些潛在bug可能會導致5.0的崩潰,後續我們會努力修復。下面這些是在5.x系列週期內會出現的特性:
  • 即時光照和烘焙光照的PowerVR追蹤演算法(查看詳細
  • 控制即時GI子系統間切換的API
  • Enlighten即時立方貼圖
  • GI的即時透明支持
  • 預計算/烘焙的雲/集群計算

更多資料請查看slides for the Unite 2014 talk on GI, video of the Unite 2014 talk on GI, Unite 2014 keynote (graphics part)。(英文)

讓我們知道你們的想法。

來自Unity的Graphics團隊。

2014年9月18日 星期四

Unity 開源專案參與指南


Unity 開源專案參與指南
作者:Na'Tosha Bard

在上個月的Unite大會上,我們宣佈了開放原始程式碼的計畫,也就是說未來Unity有一些元件將會把原碼開放。自從公佈了BitBucket(源碼託管網站)上的Unity Test Tools專案後,我們已經看見眾多開發者進行了各種複製、創建分支、拉取的操作(你可以從TestTools專案中看到專案的發展動態,當然你也可以在專案的事件追蹤器issue tracker中來觀察)。此後,我們還發佈了Xcode Manipulation API(允許開發者修改和調整所產生的Xcode項目)和iOS Native Code範例(一些類似如何整合Unity和Native UI以及進行NativeVideo Rendering的例子)。現在,我們正在加緊Unity4.6中全新的UI系統的開源工作(目前為beta版),同時我們也正在討論對更多元件進行開源計畫。

我們也發佈了參與指南,它是Unity用戶手冊中的一部分。今天就讓我同大家一起來瞭解一下其中的步驟。

參與步驟

我們的原始碼倉庫託管在Mercurial或者Git的BitBucket上。如果你曾經參與過在GitHub上專案的開發,那麼它們的步驟很相似。但是如果你以前使用的是Perforce或者SVN(或者一些其他的版本控管系統),那麼類似於“forks(分支)”,“clones(克隆)”,“pushing(推送)”和”pulling(拉取)”這些概念對於你可能比較陌生,我們建議你詳細遵循指南的步驟(每一個步驟都有截圖),並且充分利用“擴展閱讀”這部分的內容。

你需要做的第一件事情就是創建一個BitBucket帳戶,這是我們管理資源庫的地方。有一個非常簡單的步驟(如果你從未用過BitBucket,但是你有一個GitHub的帳號,你可以在BitBucket上使用相同的一個帳號)(你首先需要創建一個BitBucket的帳號,然後再連接你的GitHub(或者是Google)帳號,然後你就可以用你的GitHub(或Google)帳號登陸到BitBucket了),如果你思考為什麼我們不用GitHub,而用BitBucket,請查看我們的常見問題解答

下一步,你要在BitBucket的Unity 主頁上,找到你想要參與的專案。一旦完成以上操作,你就可以在你自己的空間上建立一個資源庫的分支(fork)。一個資源庫的分支就是一個簡單的資源庫的複製,它將存貯在你自己的私有空間下,並且你可以在這裡隨意的推送你的更改。

複製分支以及確認你的更改。除非你喜歡難用的命令列工具,我們推薦Atlassian的SourceTree,它同時整合了Mercurial和Git。無論你使用的是Mercurial或者是Git,或者無論Mac或者Windows平臺下工作,它都非常適合。

最後從你的分支開一個pull請求,然後等待。Unity工程師將會查看你的pull請求,並且處理它,如果通過了審核,它將被合併到我們的倉庫中。

處理過程類似於:

Pull請求後的情況

當你提出一個pull的請求,通常會發生以下4種情況之一:


1. pull請求通過,最終被整合。

2. pull請求因為拒絕而關閉。

3. pull請求不是因為被拒絕而關閉,而是Unity工程師要求你在分支被順利合併之前做一些其他的工作。

4. pull請求被拒絕,但是Unity工程師仍然會採用pull請求中一部分的更改。

情況1和2是很簡單明瞭的。情況3通常代表著你需要清空或者是處理一些額外情況。如果Unity工程師並不想採用你所有的更改,而只是選取其中一部分,或者以往的更改需要在應用之前清空的時候,通常會發生第4種情況。在UnityTest Tools項目中,我們已經碰到了第1,第2和第4種情況。

在任何情況下,你會收到郵件告訴你關於pull請求活動的通知,所以請確保你的信箱能收到從BitBucker的通知。

就這麼簡單

僅僅幾個簡單的步驟,你就可以參與改善Unity和整個生態系統,為了你和Unity社區中的每一個人。正如之前所提,我們非常期待看到你的貢獻!

2014年9月17日 星期三

PlayStation開發者福音

作者:Unity CEO - David Helgason

大家應該都知道,Unity已經跟Sony公司合作了很長的時間。2013年3月我們成為了戰略合作夥伴,進而研發出Unity For PlayStation套件,開發者可以用它來開發PlayStation全平台的遊戲。

現在,我們的合作關係又進了一步!我們會為經驗豐富的PlayStation遊戲開發者提供更深入的功能及優化方面的技術支援,同時所有獲得PlayStation認證的開發者將可以免費使用這些工具。

你要做的就是聯繫PlayStation官方人員諮詢如何獲得PlayStation認證,進而獲得可在Unity Pro版中使用的Unity for PlayStation版本。

另外Sony也表示,他們歡迎來自世界各地不論大小的開發團隊發佈到PlayStation平台!有一些非常出色的遊戲是由小團隊開發的,要從眾多的優秀平臺中脫穎而出,這在過去是非常難得的。

我們看到一些非常棒的遊戲使用工具並已成功發佈,例如《Oddworld : Abe’s Odyssey(奇異世界:阿比逃亡記)》、《Stick itto The Man!(是男人就要堅強)》及《CounterSpy(反擊間諜)》,還有非常多的遊戲正在開發中,像《Galak-Z》、《Assault Android Cactus》、《Night in the Woods》、《Shiftlings》, 《Starwhal》以及《BroForce》等等。

你可以進入Unity 案例展示頁面,搜索Playstation平臺來找到遊戲列表。

現在,這些工具都已經發佈啦,並且比以往更容易獲得及使用,我們期待著你們強大的作品喲!

2014年9月9日 星期二

Unity大中華區線上技術支援服務總結報告

您的開發團隊還是在開發中自行解決問題嗎?CB OB前夕發現上線人數一多就開始當機?為什麼面臨這些上線才會遇到的問題?是否需要在背後有強而有力的原廠當你的支援?

從2013年3月以來,Unity 在大中華區提供了付費線上技術支援服務,在一年半的時間內,我們已經收到了上千個問題,除了一些底層Bug之外我們達到了解決率96.6%!

這個線上技術支援是針對使用中文溝通的開發公司推出的一項服務,該服務以全中文的方式進行,為研發團隊解答使用Unity引擎過程中遇到的各類問題,確保第一時間可以協助開發者解決網路難以搜尋到的專業問題。

服務團隊有對Unity引擎底層非常熟悉的官方開發工程師以及對Unity遊戲開發有豐富經驗的支援工程師。經過一年半的實際操作,Unity大中華區線上技術支援服務已經在大中華區行業的龍頭企業、中小型開發公司,甚至獨立開發團隊中廣受好評,為了讓大家更了解實際數據,我們整理了一些資料

1、問題回應時間

截至目前為止,系統一共接收到1087個技術問題,其中1050個已被解決。在這些問題中,每個問題的首次回應時間平均為1.47工作時。平均解決時間,即問題從提出到客戶認為其已經被解決為止,為11.50工作小時。(每週9*5個工作小時)

下圖為從今年開始,我們的首次回復時間和平均解決時間的總體趨勢圖。





2、問題類型

在我們接收到的問題中,其問題類型歸納如下:


可以看出華人Unity開發者問最多的問題是圖形渲染類,再來是Editor編輯器相關,動畫使用和記憶體管理也是大家比較會遇到的問題。

3、如何保證服務品質

我們通過不斷拜訪客戶、舉辦各種交流會議、信件交流、微博等問題積累來自大中華地區大大小小各種不同公司的疑難雜症,可以說是彙總了所有遊戲開發者會遇到的各種問題的資料庫。據不完全統計,我們的整體問題回答總數已經超過一萬。

技術支援團隊經常與研發團隊進行溝通,一旦出現棘手問題,直接就該問題與其對應功能的引擎開發者或負責人進行討論,從而快速找到問題根源並回饋給用戶。有時候客戶發現Bug,透過快速地確認就不需再找解決方案了,這裡也要感謝我們的用戶給與的信任與配合。

Unity 作為一家以技術為核心的公司,一直在努力提升引擎技術力的同時,也努力在為使用者提高服務品質。

遊戲開發大眾化,所有艱難繁雜的工作都交給Unity ,您只需要輕鬆愉悅地享受創意和開發的樂趣,這就是Unity 的願景和承諾!

更多關於技術支援的內容可寫信到chinasales@unity3d.com

2014年9月4日 星期四

關於文件,和Unity腳本的兩三事

原文連結:http://blogs.unity3d.com/2014/09/03/documentation-unity-scripting-languages-and-you/
作者:aleksandr

每位開發者都有自己擅長使用的程式設計語言。以往在Unity中,我們主要支援三種語言:C#、UnityScript(也就是大家所熟知JavaScript的Unity版本)還有Boo。我們的目標是用你想用的程式設計語言提供技術支援服務。

根據我們的統計分析,使用三種指令碼語言的百分比如下圖:



從上圖可以看見,選擇Boo作為開發語言的使用者如此至少,而我們還需要投入大量的資源來支援它,這顯然非常浪費。所以我們將在Unity5.0中放棄對Boo的技術支援(主要包括文件,教學等多方面)。我們會將資源投入在開發者更關心的地方。

當Unity 5.0發佈的時候,我們同時也會取消掉“建立Boo腳本”功能。不過原來在專案裡的Boo腳本還是可以正常工作。

我們也聽取了很多開發者的回饋,瞭解到開發者想要更全面的C#支援。因此我們也在調整為開發者提供C#語言的最大支援。

目前,官方網站上的教學範例及文件基本上都是C#語言的,在Unity5.X系列的版本中,C#也會是範例和文件的首選。

註:現在我們內部的流程是用UnityScrip/JavaScript編寫範例,然後會自動轉換成C#或者Boo。新的Unity引擎中的C#-to-UnityScript轉換工具,可以將C#並自動轉換成UnityScript。


現在我們已經'把許多C#範例更新上了,未來也將會有更多的C#範例在Unity 5出現!
讚的喔!

著作人