做者:王選易,出處:http://www.cnblogs.com/neverdie/ 歡迎轉載,也請保留這段聲明。若是你喜歡這篇文章,請點推薦。謝謝!html
最近剛剛完成了一個我我的比較滿意的小項目:【深刻Cocos2d-x】使用MVC架構搭建遊戲Four,在這個遊戲中,我使用了本身搭建的MVC架構來製做一個遊戲,作到了比較好的SoC(關注點分離)。可是苦於Cocos2d-x沒有一個比較完善的編輯器,因此我開始學習另外一個很是流行的遊戲引擎-Unity3D。架構
Unity3D是一個Component-Based的遊戲引擎,而且爲GamePlay Progrmmer提供了不少遊戲性層上的支持。好比能夠在圖形界面上設計動畫狀態轉換的Animator。好比能夠直接在場景編輯器中方便進行調整的Collider。好比能夠動態調整動畫曲線的Animation。總的來講,Unity是一個架構比Cocos2d-x精巧許多的遊戲引擎。app
可是很遺憾的是,Unity自己並不開源,還好,Unity在不開源的狀況下卻作了比較詳盡的文檔支持。同時,Unity的社區也是很友好的,stackoverflow也有許多值得一看的問題。編輯器
順便推薦幾個學習Unity的網站:ide
Unity聖典函數
我在學Unity3D的知識的時候,發現Unity內部涉及的重要類比Cocos2d-x要多,有點理不清的感受,因此製做了下面的設計類圖來爲像我同樣的初學者提供一個Unity的初步印象。動畫
因爲Unity是一個Component-Based的遊戲引擎,因此遊戲中全部的物體都是一個GameObject,爲了給這個GameObject附加上各類各樣的屬性,因此咱們引入了Component這個概念。網站
GameObject是由Component組合成的,Component的生命週期和GameObject息息相關。一旦GameObject的Destroy方法,它的子對象和對應的全部Component都會被銷燬,同時,咱們也能夠一次只銷毀一個單獨的Component。
Component有以下這些種類,我製做了一張表格來記錄它們的用途:
組件附屬於遊戲物體.把一個 Renderer (渲染器)組件附到遊戲對象,可使遊戲對象顯示到場景,附一個 Camera (攝像機)能夠把物體變成一個攝像機物體.全部腳本都是組件,所以都能附到遊戲對象上.
經常使用的組件能夠經過簡單的成員變量取得:
附在遊戲對象上的組件或腳本能夠經過GetComponent獲取.以下代碼示例:
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void Awake() { transform.Translate(0, 1, 0); GetComponent<Transform>().Translate(0, 1, 0); } }
1
|
|
關於Input的深刻解讀請參考這篇文章:Input 輸入
Unity支持,鍵盤,操縱桿和遊戲手柄輸入。
在輸入管理器(Input Manager)能夠建立虛擬軸和按鈕,並終端用戶能夠在屏幕配置對話框配置鍵盤輸入。
若是想添加新的虛擬軸,選擇菜單Edit->Project Settings->Input menu。這裏能夠改變每一個軸的設置。便可進入Input Manager的配置界面。
從腳本,全部虛擬軸經過它們的名字(name)來訪問。
當建立時,每一個項目都具備下面的默認輸入軸:
Time類是Unity中的一個全局變量,它記載了和遊戲相關的時間,幀數等數據。
Time 類包含一個很是重要的變量叫deltaTime.這個變量包含從上次調用Update 或FixedUpdate到如今的時間(根據你是放在Update函數仍是FixedUpdate函數中).(另注: Update每幀調用一次)
依照上面的例子,使得物體在一個勻速的速度下旋轉,不依賴幀的速率,以下:
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void Update() { transform.Rotate(0, 5 * Time.deltaTime, 0); } }
1
|
固然了,在使用Time這個類的時候,咱們也要記住使用各類各樣的Lerp函數來減小本身的工做量,在Unity3D中,Vector3,Vector2,Color等類都提供了相應的Lerp函數給咱們調用。
|
1
|
|
Physics類是Unity重的一個工具函數類,它主要提供了Linecast和Raycast兩種射線投射方式。
其中Linecast是以投射的起始位置和終止位置爲參數,來判斷這個投射有沒有和某個Collider發生了碰撞。
而Raycast則是以投射的起始位置和投射方向爲參數,來判斷這個投射有沒有和某個Collider發生了碰撞。
相應的實例能夠看下面的這一段程序:
using UnityEngine; using System.Collections; public class Example : MonoBehaviour { void Update() { // 使用Raycast Vector3 fwd = transform.TransformDirection(Vector3.forward); if (Physics.Raycast(transform.position, fwd, 10)) print("There is something in front of the object!"); // 使用Linecast Transform target; if (!Physics.Linecast(transform.position, target.position)) ProcessData.AndDoSomeCalculations(); } }
在Physics這個模塊中,有三個Component是相當重要的,分別是RigidBody,Collision,Joint。在新的版本中,又引入了RigidBody2D,Collision2D,Joint2D這些Component來處理2D中的Physics事件。
這三個類都是處理物理相關的事件的,那麼它們有什麼區別呢?
RgidBody是做爲一個受力物體而存在的,因此能夠向一個RigidBody施加Force(力),Drag(阻力)。同時RigidBody還有 velocity (速度),mass(質量),position(位置),旋轉(rotation)等等。
Collider是爲了處理物理中的碰撞事件而出現的類,就像上面表格中所說的,若是沒有Collider,兩個RigidBody之間是沒法發生碰撞的。對同一個GameObject能夠綁定多個Collider構建更加複雜的碰撞體結構。Collider另一個很值得注意的就是咱們能夠爲Collider設置material,即Collider的物理材質。 物理材質用於調整摩擦力和碰撞單位之間的反彈效果。
當發生碰撞時,會觸發毀掉函數OnCollisionEnter,OnCollisionStay,OnCollisionExit等等。這幾個函數與OnTriggerXXX的區別會在接下來的博客中提到。
Joint用於鏈接兩個RigidBody,當Joint斷掉的時候會觸發OnJointBreak的回調函數。