Unity3D研究之角色控制器組件研究
使用它的方法如下,首先打開Unity游戲引擎編輯器,然后在Project視圖中右鍵選擇Import Package -> Charactr Controller(角色控制器)把它導入我們的工程中。如下圖所示,第一人稱與第三人稱的組建已經加入Project視圖中。3rd Person Controller 表示第三人稱控制器,First Person Controller表示第一人稱控制器。
如下圖所示,我們將FirstPerson Controller拖拽入Hierarchy(層次視圖)中。由于角色控制器是具有一定物理引擎的,所以一定要將它放在地形或面對象之上,否則當它接收物理效果時發(fā)現地面沒有東西支撐它,它就會掉下去。然后運行游戲你就會發(fā)現和CS中的第一人稱效果非常相像, W、S、A、D移動人物行走,移動鼠標更改行走的方向,空格鍵人物會跳躍。
第一人稱視角的實現原理是在游戲場景中創(chuàng)建了一個膠囊體的游戲對象,并且給膠囊體對象身上綁定了一個攝像機,攝像機對象如下圖所示,它綁定在”Person Controller”中。這時場景中默認的攝像機就會失效,可以直接刪掉默認的攝像機。通過按鍵控制這個膠囊體移動,通過鼠標修改膠囊體的朝向,此時你就會發(fā)現第一人稱視角已經完全實現,目前為止我們不需要編寫一行代碼。目前場景中的天空盒子我是使用skyBox組件綁定在攝像機中,因為第一人稱視角的攝像機對象在”Person Controller”中,所以需要將SkyBox組件綁定在這個攝像機中,如果綁定在默認攝像機中那么你將不會看到天空的效果。
下面我們在看看第三人稱視角,如下圖所示,在Project視圖中將3rd Person Controller拖拽入Hierarchy視圖中。第三人稱視角需要使用我們原有的攝像機,如果剛剛將攝像機的刪掉的話。在Hierarchy視圖中點擊Creat->Camera 即可。然后選擇攝像機,在右側Inspector視圖中設置它的tag為MainCamera,如下圖所示。最后在Hierarchy視圖中選擇3rd Person Controller,在右側Inspector視圖中將Third Person Camera 腳本的 Camera Transform 變量綁定上剛剛創(chuàng)建的主攝像機,此時運行游戲后以第三人稱視角移動主角行走與跳躍,攝像機永遠都會在跟隨在后面除非修改角色控制器組件中默認提供的源碼,源碼都在右側監(jiān)測面板視圖中直接點開就可以查看。
下面我們學習角色控制器組件在其它模型之間的應用。首先在Hierarchy視圖中創(chuàng)建兩個Cube(立方體對象) 命名為:Cube0(發(fā)出碰撞的對象)Cube1(接收碰撞的對象),然后在Hierarchy視圖中選擇Cube0對象,接著Unity導航菜單欄中選擇Component(組件)-Character->選擇任意一個角色控制屬性。 補充一句,角色控制器組件一定要在Project視圖中導入,否則這里將無法綁定組件。角色控制器組件因為與碰撞組件相互沖突,所以添加角色控制器組建后 Collider組件就會消失。下面我們實現一段簡單得代碼,使用添加過角色控制器組件的Cube0 去碰撞未添加角色控制器組件的Cube1。
[代碼]java代碼:
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { //主動碰撞的對象名稱 string castName = null; //接收碰撞的對象名稱 string receiveName = null; void OnGUI () { if(castName!= null && receiveName !=null) { //設置顯示的顏色為黑色 GUI.color = Color.black; //顯示主動碰撞的對象 與接收碰撞的對象名稱 GUI.Label(new Rect(100,100,200,30),"主動碰撞的對象名稱"+castName); GUI.Label(new Rect(100,200,200,30),"接收碰撞的對象名稱"+receiveName); } } //角色控制器組件在與具有Collider組件對象之間的碰撞 void OnControllerColliderHit(ControllerColliderHit hit) { //得到接收碰撞名稱 GameObject hitObject = hit.collider.gameObject; //當它不是地面時間 if(!hitObject.name.Equals("Terrain")) { //得到主動碰撞的對象 與接收碰撞的對象名稱 castName = gameObject.name; receiveName = hitObject.name; } } }
將上面這段代碼綁定在Cube0中,運行游戲后W、A、S、D按鍵來控制Cube1立方體移動。當Cube0與Cube1發(fā)生碰撞時,程序將進入方法 OnControllerColliderHit(),通過參數就可以得到接收碰撞的游戲對象也就是Cube1對象,而gameObject就是當前主動發(fā)生碰撞的Cube1。如下圖所示,當兩個立方體碰撞時使用GUI已經將碰撞的信息打印出來。
接著我在說說剛體組件,默認在Unity中創(chuàng)建的模型是不具備接收物理引擎的,除非給模型添加剛體組件或角色控制器組件。我們先說說剛體,還用奮斗的小鳥來舉例子。發(fā)射小鳥以后,小鳥以一個拋物線軌跡去撞擊物體,發(fā)生碰撞后被碰撞的物體會根據小鳥撞擊的角度以及力度發(fā)生不同的物理效果,并且?guī)缀跏峭耆M真實的物理引擎。但是這種物理引擎的效果不能綁定在比如RPG游戲的主角身上。原因很簡單,因為剛體所添加的物理引擎太過于真實以至于會影響用戶的對主角的操作,舉個例子比如用戶在控制主角移動時他碰撞到質量較大的物體,根據真實的物理引擎會被這個物體的反彈力把主角反彈回原位。但是這個是不符合邏輯的,因為剛體組件太過于物理話了,所以我們需要給主角添加角色控制器組件,它操作起來比較靈活,更容易讓我們操作主角。
下面我們給Cube1對象綁定剛體組件,選擇Cube1對象然后在導航菜單欄中選擇Component->physics ->Rigidbody(剛體)。我們看看下面這段代碼,使用添加了角色控制器組件的Cube0 去碰撞添加剛體組件的Cube1,當他生碰撞時計算一下Cube0碰撞Cube1時的碰撞角度向量,然后通過剛體向他施加一個力把它推開。
[代碼]java代碼:
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { //角色控制器組件在與具有Collider組件對象之間的碰撞 void OnControllerColliderHit(ControllerColliderHit hit) { //判斷碰撞的對象是否具備剛體組件 GameObject hitObject = hit.collider.gameObject; Rigidbody rigidbody = hitObject.rigidbody; if(rigidbody != null && !rigidbody.isKinematic) { //地面也具備剛體組件,這里判斷一下 if(!hitObject.name.Equals("Terrain") ) { rigidbody.AddForce(new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z) * 10); } } } }
也可以將同樣的腳本直接綁定在第三人稱的角色控制器組件中。如下圖所示,主角移動將周圍的箱子都推開了。
總的來說角色控制器組件適用于 既需要感應物理引擎的支持但是又不能完全依賴與物理引擎,需要自己代碼去編寫一些東西的模型,所以非常適合游戲中主角對象的使用。雨松MOMO祝大家學習愉快,哇咔咔。