關(guān)鍵詞:Unity / 入門 / 游戲對象 / 場景 / 快捷鍵 / Terrain / 資源包
場景顯示在 Scene 里面,Hierarchy 里面是游戲?qū)ο蟊热?3D Object: Main Camera、Plane等; 按住 Q/W/E/R/T 同時點擊鼠標操作:Q平移場景/W平移選中的游戲?qū)ο?E旋轉(zhuǎn)/R縮放工具/T操作2D的精靈工具,分別對應 Unity 編輯器左上角的功能圖標的快捷鍵; 鼠標右鍵:移動視圖;
[游戲?qū)ο骫
一個游戲項目由多個場景組成,在場景中,一個角色,一個模型,一個特效,都是游戲?qū)ο蟆鼍熬褪怯啥鄠€游戲?qū)ο蠼M成的;每個游戲?qū)ο笊砩隙紩卸鄠€組件,使游戲?qū)ο缶邆湎鄳奶匦浴崿F(xiàn)相應的功能;從網(wǎng)上找一些地形貼圖資源,自己使用地形編輯器編輯一個新的地圖;
.unitypackage 后綴文件
在Unity中攝像機決定游戲最終的顯示效果 同一個場景中允許存在多個攝像機
世界坐標 Global 是整個 3D 場景的坐標系; 本地坐標 Local 是某個游戲?qū)ο髢?nèi)獨立的坐標系; (游戲?qū)ο罂梢杂凶訉ο螅澜缱鴺伺c本地坐標是相對的)
要想讓模型出來,網(wǎng)格是必須的(好比人的骨架);
使模型表面賦有更多的細節(jié),就需要給它添加紋理; 比如:在Assets中新建一個material材質(zhì)球 拖拽到 Object 上,通過右側(cè)的面板修改材質(zhì)球上的紋理屬性間接修改Object
材質(zhì)能夠?qū)⒓y理應用在模型上,著色器決定紋理呈現(xiàn)出的最終效果;
項目目錄下: - Assets 里面存放的是項目所需要的資源; - Library 里面存放的是所需要的庫文件; - PRojectSettings 里面存放的是工程設置文件; - Temp 里面存放的是臨時文件;
項目框架: 一個工程里面有多個場景,一個場景中有多個游戲?qū)ο螅總€游戲?qū)ο笥钟卸鄠€組件;
工程(Project) | / / 場景(Scene) 場景(Scene) ... ... | / / 游戲?qū)ο?GameObject) 游戲?qū)ο?GameObject) ... ... | / / 組件(Component) 組件(Component) ... ...每個場景可以理解為每個界面;
組件開發(fā): 游戲物體想要實現(xiàn)什么功能,只需要添加對應的組件即可,我們可以在Inspector視圖中查看當前游戲?qū)ο笊砩系慕M件,修改組件的屬性; (Inspector)
Transform 組件,決定物體的位置,旋轉(zhuǎn)和縮放;Mesh Filter 組件,顯示網(wǎng)格;Box Collider 組件,用來給物體添加碰撞器;Mesh Renderer 組件,可以給物體添加材質(zhì),紋理以及渲染的方式;腳本組件: 腳本也是一種特殊的組件; 創(chuàng)建腳本; 在腳本中設置公共字段作為組件屬性; 在腳本中通過方法獲取游戲?qū)ο蠛徒M件;
用Mono編輯腳本
using UnityEngine;using System.Collections;// 如果我們的腳本需要掛載到游戲?qū)ο笊砩希托枰^承于 MonoBehaviourpublic class TestCS : MonoBehaviour { public int age; public string name; // Use this for initialization void Start () { // gameObject 表示當前腳本組件所掛載的游戲?qū)ο? // unity 中輸出到控制臺使用 print 或者 Debug.log print ("Test 腳本掛在到了 " + gameObject.name + " 的身上"); // 每個游戲?qū)ο笊隙贾辽儆幸粋€組件,叫做 Transform // transform 表示當前游戲?qū)ο笊砩系?Transform 組件 print(transform.position.x); print(name + age); } // Update is called once per frame void Update () { }}運行結(jié)果:
對應的Inspector: 
可以再添加一個腳本Demo.cs,修改TestCS.cs的屬性,可以改變Cube的Script內(nèi)容
using UnityEngine;using System.Collections;public class Demo : MonoBehaviour { // Use this for initialization void Start () { // GameObject de fangfa GetComponent, nenggou // huoqu dangqian youxi duixiang shenshang zhiding de leixing de zujian duixiang TestCS t = GetComponent<TestCS> (); t.age = 24; t.name = "Da Wang"; t.Log(); } // Update is called once per frame void Update () { }}結(jié)果截圖: 
Awake –> OnEnable –> Start ==》Update –> LateUpdate ==》 OnDisable –> OnDestroy
using UnityEngine;using System.Collections;// 繼承于 MonoBehaviour 的類叫做運行時類,運行時類都不能手動實例化,eg:不能 new: Test t = new Test()public class Test : MonoBehaviour{ // 這些方法都不是 MonoBehaviour 中定義的方法,而是通過反射調(diào)用的一些事件。方法名寫錯不會報錯 // 這些方法定義了一個腳本從被加載到被銷毀的過程中,腳本的生命周期 // 1.每當腳本被加載時調(diào)用,調(diào)用 1 次;在Awake中做一些初始化操作(放 public 字段); void Awake () { // 初始化 public 成員 print ("Awake"); } // 2. 在每次激活腳本的時候就會調(diào)用 OnEnable,比如計時器重置; void OnEnable () { print ("onEnable"); } // 2. 在第一次調(diào)用 Update 之前調(diào)用一次 Start 方法,然后中途不管激活取消激活,都不會再調(diào)用了 // 在Start方法中也可以做一些初始化操作(主要放私有字段); void Start () { print ("Start"); } // 3.每幀都會調(diào)用一次 Update,每秒接近60幀,所以每秒大概調(diào)用60次左右 void Update () { print ("Update"); } // 4. 在Update調(diào)用之后進行調(diào)用,刷新其它邏輯的時候 void LateUpdate () { print ("LateUpdate"); } // 5. 取消激活狀態(tài)后調(diào)用 void OnDisable () { print ("OnDisable"); } // 6.被銷毀時調(diào)用一次 void OnDestroy () { print ("OnDestroy"); } // 用來寫 UI 的,持續(xù)調(diào)用 - 調(diào)用頻率高 IMGUI代碼需要寫在 OnGUI 方法中 void OnGUI () { print ("OnGUI"); } // 以固定的頻率調(diào)用(跟圖像刷新無關(guān),不受圖像刷新幀速率的影響) // 一般把處理物理的代碼放在這里 void FixedUpdate () { print ("FixedUpdate"); }}//public class A{// public void T(){// Test t = new Test ();// wrong// }//}Input 獲取鍵盤事件:
Input.GetKey()Input.GetKeyDown()Input.GetKeyUp()using UnityEngine;using System.Collections;// 繼承于 MonoBehaviour 的類叫做運行時類,運行時類都不能手動實例化,eg:不能 new: Test t = new Test()public class Test : MonoBehaviour{ void Start () { // print ("Start"); } // 獲取用戶事件需要使用 Input 類 // GetKeyDown 按鍵按下 & GetKeyUp 按鍵彈起 & GetKey 檢測持續(xù)按鍵的事件 void Update () { // 每幀都需要監(jiān)聽用戶事件 // 在當前這一幀中如果用戶按下了 W 就會返回 true, 否則返回 false if (Input.GetKeyDown (KeyCode.W)) { print ("往前走."); }else if(Input.GetKeyDown(KeyCode.S)){ // Debug.Log ("往后退."); print ("往后退.");// print 只能在 MonoBehaviour 的子類中使用 } if(Input.GetKeyUp(KeyCode.Alpha1)){ print ("彈起了 1 鍵"); } if(Input.GetKey(KeyCode.F)){ print ("按了 F 鍵"); } // GetMouseButtonDown用來檢測鼠標按鍵按下的事件 & // 參數(shù) 0 表示鼠標左鍵 & 參數(shù) 1 表示鼠標右鍵 & 參數(shù) 2 表示中鍵 if(Input.GetMouseButtonDown(0)){ print ("按下了鼠標左鍵"); } if(Input.GetMouseButtonUp(0)){ print ("彈起了鼠標左鍵"); } if(Input.GetMouseButton(0)){ print("持續(xù)按下了鼠標左鍵"); } }}結(jié)果截圖: 
Name Tag ActiveSelf SetActive() GetComponent() AddComponent() GetComponent() AddComponent() Destroy() FindGameObjectWithTag() FindGameObjectsWithTag()
運行結(jié)果
基本組成:
Sence 場景,類似于 Flash 中的 stage, 用于放置各種對象GameObject, 可以攜帶各種 Component;每個 GameObject 至少帶有 Transform 組件, 所有的組件都可以從頂部菜單 Component 里面找到并添加給游戲?qū)ο?
腳本語言:
C# / javascript / boo (前兩者使用較為廣泛, 網(wǎng)上教程以前兩者為主, 個人推薦 C#),一般的繼承 MonoBehavior 類的腳本都需要依附的場景中的對象上才能被執(zhí)行.GUI(用戶圖形界面):
用于制作按鈕/文本顯示/滾動條/下拉框等常用圖形操作界面元素,使用 GUISkin 和 GUIStyle 可以自定義樣式;系統(tǒng)自帶 GUI;各類 GUI 插件, NGUI/EZGUI 等;預制:
用于程序運行時,動態(tài)實例化對象的”母體”,比如,在射擊類游戲中,子彈的生成就可以使用實例化預制的方式來實現(xiàn),可以定義它的各種屬性方法, 然后在使用的時候直接實例化一個實例;在 project 面板右擊選擇 Create -> Prefab 新建一個預制, 將 Hierarchy 面板中要制成的對象拖到這個新建預制上即可;標簽:
tag 用于辨別物體, 與 name 類似,使用對象的 tag 和 name 都可以找到對應的物體, GameObject.Find(“name”) 或 GameObject.FindWithTag(“Tag”); 默認的是 Untagged,可以通過 Inspector 面板里面 Tag 的下拉菜單選擇 Add Tag 項來添加新的標簽; Inspector -> TagManager -> Tags 里的 size 來增加標簽的數(shù)量, 每個 Element 內(nèi)都填入新標簽的名字;
層:
在使用某些功能的時候, 可以通過層來過濾不需要運用該功能的對象, 也就是把該功能運用到特定的層, 比如, 相機的 Culling Mask 屬性, 通過選擇特定層可以實現(xiàn)只顯示位于被選中的層的對象. 層的添加也是在標簽管理器中, Unity 已經(jīng)設置了8個層,你是不能對這8個層進行修改的,你可以從第9個(也就是 user layer8)開始添加你定義的層;
資源:
.unitypackage 格式的文件可以直接 import 到 unity 中,記住最好是在打開 unity 的情況下,在 project 面板里右擊,然后在 import packages 中選中你要導入的資源;可以 export package 導出場景成為 .unitypackage 資源包在工程面板可以 import new assests 可以導入其他形式的資源, 如, 模型/音頻/視頻等, 也可直接從外部文件夾中拖入
物理引擎:
unity 使用 nvidia PhysX 物理引擎
碰撞器: 各種基本體的碰撞器(box/sphere/capsule/cylinder), 網(wǎng)格碰撞器(mesh collider),車輪碰撞器(Wheel collider),地形碰撞器(terrain collider) 碰撞器組件在你選中對象的時候會以綠色框顯示;
碰撞檢測: 碰撞器碰撞檢測 / 光線投射(射線) / 觸發(fā)器碰撞檢測, 通過碰撞檢測可以得到與當前對象發(fā)生碰撞的對象信息, 使用碰撞的相關(guān)函數(shù) OnCollisionEnter(碰撞器碰撞檢測) / OnTriggerEnter(觸發(fā)器碰撞檢測) / Physics.Raycast(光線投射)獲取;剛體: 模擬物體物理現(xiàn)象的基礎, 加了剛體組件才能模擬重力 / 阻力等;力: 作用于剛體,你只要通過添加各種力, 就可以使剛體表現(xiàn)出跟現(xiàn)實中一樣的受力情況;
粒子系統(tǒng):
兩種形式, 一種以物體攜帶例子系統(tǒng)組件的形式實現(xiàn), 另一種是直接使用粒子系統(tǒng) GameObject(3.5 以后)
粒子系統(tǒng) GameObject: GameObject – Create Other – Particle System粒子系統(tǒng)組件: 粒子發(fā)射器(Particle Emitter, 有 Ellipsoid Particle Emitter 和 Mesh Particle Emitter 兩種類型的粒子發(fā)射器, 主要有 粒子產(chǎn)生 / 數(shù)量 / 速度 / 大小 / 存活時間等參數(shù)設置), 粒子動畫器(Particle Animator, 主要負責粒子產(chǎn)生后直至粒子消亡的行為變化的控制, 包括運動過程中的旋轉(zhuǎn) / 受力等), 粒子渲染器(Particle Renderer, 主要是負責給予粒子的渲染,陰影,材質(zhì)等設定)
Camera(相機):
相機視角: 透視(可調(diào)整透視角度) / 正交(沒有透視效果)
Skybox: 只在 Game 窗口可見, 需要 skybox 類型的 shader, 以及附在其上的六面貼圖紋理第一人稱視角: 角色不出現(xiàn)在視野中, 相機看到的就像角色雙眼看到的一樣第三人稱視角: 能在視野中看到角色, 相機一直跟著角色運動.可以使用導入 Unity 自帶的 Character Controllers 資源包, 里面有第一人稱和第三人稱的原型
光照系統(tǒng):
常見燈光類型: 平行光(Directional light, 無衰減, 模擬太陽光)聚光燈(spotlight, 從一點向某一方向反射錐形光束, 有衰減, 聚光效果)點光源(Point light, 從一點向外輻射, 有衰減) 烘焙: 將靜態(tài)光影效果渲染到紋理上, 減少燈光和陰影帶來的開銷陰影: 分為 hard shadows 和 soft shadows 兩種, 前一種陰影比較重, 后一種相對柔和.要產(chǎn)生陰影,還需要將投射陰影的對象的 Cast shadows 都選, 將接受陰影的對象的 Receive shadows 勾選, eg: 你要讓樹在地面上產(chǎn)生陰影, 那就得讓樹投射陰影, 然后讓地面接受陰影才行;地形系統(tǒng):
選擇頂部菜單 Terrain – creat terrain 創(chuàng)建一個地形 地形有一組地形工具用來繪制地形的高度, 生成各種地貌, 并且可以對地表運用紋理, 還可以添加樹,草等地表植被.
3d 模型 / 材質(zhì) / 紋理(貼圖) shader(著色器, Unity 本身擁有幾十種 shader, 也可以根據(jù)自己的需要使用 shaderLab 語言來編寫 shader,一般可以只用 Unity 自帶的和網(wǎng)上流傳的)
關(guān)于 Player settings 播放器設置的話這里暫且不多說,發(fā)布的時候通過 player setting 進行發(fā)布設置,每個平臺都有對應的設置參數(shù),根據(jù)需要來設置,主要 是關(guān)于程序圖 標、分辨 率、渲染 等設置, 大家可以 自己試試 (有些參 數(shù)只有 pro 版才能設置)。 下面我們來看看 build settings 對話框,左側(cè)是可發(fā)布的平臺(Unity 跨平臺性 很強大,4.0 已支持發(fā)布至 10 種平臺:IOS、Andriod、Windows、Mac、linux、 Webplayer、Flash、PS3、Xbox360、Wii u),右側(cè)是對應平臺的發(fā)布設置,一 般初學的話,只要會發(fā)布單機版的和 webplayer 的就差不多了,這兩個的話, 右側(cè)的發(fā)布選項按照默認的設置就可以,當然單機版要在 Target Platform 中選 擇對應的操作系統(tǒng),webplayer 的話這里我給大家介紹前兩個參數(shù),Streamed 顧名思義就是在網(wǎng)絡上下載的時候以流的形式,Offline Deployment,這個是 可以在離線(斷網(wǎng))狀態(tài)下本地運行你的 webplayer 程序(這里需要注意的是, 默認情況下你每次打開 webplayer 程序的時候,瀏覽器都會自動去訪問官網(wǎng)更 新 webplayer 插件,如果你沒勾選這個選項而又在沒有聯(lián)網(wǎng)的狀態(tài)下運行 webplayer 的話是無法運行的)
End.
Note by HF.
新聞熱點
疑難解答