使用它的方法如下,首先開啟Unity遊戲引擎編輯器,然後在Project視圖中右鍵選擇Import Package -> Charactr Controller(角色控制器)把它匯入我們的工程中。如下圖所示,第一人稱與第三人稱的組建已經加入Project視圖中。3rd Person Controller 表示第三人稱控制器,First Person Controller表示第一人稱控制器。
如下圖所示,我們將FirstPerson Controller拖拽入Hierarchy(層次視圖)中。由於角色控制器是具有一定物理引擎的,所以一定要將它放在地形或面對象之上,否則當它接收物理效果時發現地面沒有東西支撐它,它就會掉下去。然後運行遊戲你就會發現和CS中的第一人稱效果非常相像, W、S、A、D移動人物行走,移動滑鼠更改行走的方向,空格鍵人物會跳躍。
第一人稱視角的實現原理是在遊戲情境中建立了一個膠囊體的遊戲對象,並且給膠囊體對象身上綁定了一個攝像機,攝像機對象如下圖所示,它綁定在”Person Controller”中。這時情境中預設的攝像機就會失效,可以直接刪掉預設的攝像機。通過按鍵控制這個膠囊體移動,通過滑鼠修改膠囊體的朝向,此時你就會發現第一人稱視角已經完全實現,目前為止我們不需要編寫一行代碼。目前情境中的天空盒子我是使用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 變數綁定上剛剛建立的主攝像機,此時運行遊戲後以第三人稱視角移動主角行走與跳躍,攝像機永遠都會在跟隨在後面除非修改角色控制器組件中預設提供的源碼,源碼都在右側監測面板視圖中直接點開就可以查看。
下面我們學習角色控制器組件在其它模型之間的應用。首先在Hierarchy視圖中建立兩個Cube(立方體對象) 命名為:Cube0(發出碰撞的對象)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發生碰撞時,程式將進入方法 OnControllerColliderHit(),通過參數就可以得到接收碰撞的遊戲對象也就是Cube1對象,而gameObject就是當前主動發生碰撞的Cube1。如下圖所示,當兩個立方體碰撞時使用GUI已經將碰撞的資訊列印出來。
接著我在說說剛體組件,預設在Unity中建立的模型是不具備接收物理引擎的,除非給模型添加剛體組件或角色控制器組件。我們先說說剛體,還用奮鬥的小鳥來舉例子。發射小鳥以後,小鳥以一個拋物線軌跡去撞擊物體,發生碰撞後被碰撞的物體會根據小鳥撞擊的角度以及力度發生不同的物理效果,並且幾乎是完全類比真實的物理引擎。但是這種物理引擎的效果不能綁定在比如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);
}
}
}
}
也可以將同樣的指令碼直接綁定在第三人稱的角色控制器組件中。如下圖所示,主角移動將周圍的箱子都推開了。
總的來說角色控制器組件適用於 既需要感應物理引擎的支援但是又不能完全依賴與物理引擎,需要自己代碼去編寫一些東西的模型,所以非常適合遊戲中主角對象的使用。