Unity3D研究之角色控制器組件研究
使用它的方法如下,首先打開Unity游戲引擎編輯器,然后在Project視圖中右鍵選擇Import Package -> Charactr Controller(角色控制器)把它導(dǎo)入我們的工程中。如下圖所示,第一人稱與第三人稱的組建已經(jīng)加入Project視圖中。3rd Person Controller 表示第三人稱控制器,F(xiàn)irst Person Controller表示第一人稱控制器。

如下圖所示,我們將FirstPerson Controller拖拽入Hierarchy(層次視圖)中。由于角色控制器是具有一定物理引擎的,所以一定要將它放在地形或面對(duì)象之上,否則當(dāng)它接收物理效果時(shí)發(fā)現(xiàn)地面沒有東西支撐它,它就會(huì)掉下去。然后運(yùn)行游戲你就會(huì)發(fā)現(xiàn)和CS中的第一人稱效果非常相像, W、S、A、D移動(dòng)人物行走,移動(dòng)鼠標(biāo)更改行走的方向,空格鍵人物會(huì)跳躍。
第一人稱視角的實(shí)現(xiàn)原理是在游戲場(chǎng)景中創(chuàng)建了一個(gè)膠囊體的游戲?qū)ο?,并且給膠囊體對(duì)象身上綁定了一個(gè)攝像機(jī),攝像機(jī)對(duì)象如下圖所示,它綁定在”Person Controller”中。這時(shí)場(chǎng)景中默認(rèn)的攝像機(jī)就會(huì)失效,可以直接刪掉默認(rèn)的攝像機(jī)。通過按鍵控制這個(gè)膠囊體移動(dòng),通過鼠標(biāo)修改膠囊體的朝向,此時(shí)你就會(huì)發(fā)現(xiàn)第一人稱視角已經(jīng)完全實(shí)現(xiàn),目前為止我們不需要編寫一行代碼。目前場(chǎng)景中的天空盒子我是使用skyBox組件綁定在攝像機(jī)中,因?yàn)榈谝蝗朔Q視角的攝像機(jī)對(duì)象在”Person Controller”中,所以需要將SkyBox組件綁定在這個(gè)攝像機(jī)中,如果綁定在默認(rèn)攝像機(jī)中那么你將不會(huì)看到天空的效果。

下面我們?cè)诳纯吹谌朔Q視角,如下圖所示,在Project視圖中將3rd Person Controller拖拽入Hierarchy視圖中。第三人稱視角需要使用我們?cè)械臄z像機(jī),如果剛剛將攝像機(jī)的刪掉的話。在Hierarchy視圖中點(diǎn)擊Creat->Camera 即可。然后選擇攝像機(jī),在右側(cè)Inspector視圖中設(shè)置它的tag為MainCamera,如下圖所示。最后在Hierarchy視圖中選擇3rd Person Controller,在右側(cè)Inspector視圖中將Third Person Camera 腳本的 Camera Transform 變量綁定上剛剛創(chuàng)建的主攝像機(jī),此時(shí)運(yùn)行游戲后以第三人稱視角移動(dòng)主角行走與跳躍,攝像機(jī)永遠(yuǎn)都會(huì)在跟隨在后面除非修改角色控制器組件中默認(rèn)提供的源碼,源碼都在右側(cè)監(jiān)測(cè)面板視圖中直接點(diǎn)開就可以查看。

下面我們學(xué)習(xí)角色控制器組件在其它模型之間的應(yīng)用。首先在Hierarchy視圖中創(chuàng)建兩個(gè)Cube(立方體對(duì)象) 命名為:Cube0(發(fā)出碰撞的對(duì)象)Cube1(接收碰撞的對(duì)象),然后在Hierarchy視圖中選擇Cube0對(duì)象,接著Unity導(dǎo)航菜單欄中選擇Component(組件)-Character->選擇任意一個(gè)角色控制屬性。 補(bǔ)充一句,角色控制器組件一定要在Project視圖中導(dǎo)入,否則這里將無法綁定組件。角色控制器組件因?yàn)榕c碰撞組件相互沖突,所以添加角色控制器組建后 Collider組件就會(huì)消失。下面我們實(shí)現(xiàn)一段簡(jiǎn)單得代碼,使用添加過角色控制器組件的Cube0 去碰撞未添加角色控制器組件的Cube1。
[代碼]java代碼:
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
	//主動(dòng)碰撞的對(duì)象名稱
	string castName = null;
	//接收碰撞的對(duì)象名稱
	string receiveName = null;
	void OnGUI ()
    {
		if(castName!= null && receiveName !=null)
		{
			//設(shè)置顯示的顏色為黑色
			GUI.color = Color.black;
 		    //顯示主動(dòng)碰撞的對(duì)象 與接收碰撞的對(duì)象名稱
	    	GUI.Label(new Rect(100,100,200,30),"主動(dòng)碰撞的對(duì)象名稱"+castName);
	    	GUI.Label(new Rect(100,200,200,30),"接收碰撞的對(duì)象名稱"+receiveName);
		}
	}
	//角色控制器組件在與具有Collider組件對(duì)象之間的碰撞
	void OnControllerColliderHit(ControllerColliderHit hit)
	{
		//得到接收碰撞名稱
		GameObject hitObject = hit.collider.gameObject;
		//當(dāng)它不是地面時(shí)間
		if(!hitObject.name.Equals("Terrain"))
		{
			//得到主動(dòng)碰撞的對(duì)象 與接收碰撞的對(duì)象名稱
			castName = gameObject.name;
			receiveName = hitObject.name;
		}	
	}
}
將上面這段代碼綁定在Cube0中,運(yùn)行游戲后W、A、S、D按鍵來控制Cube1立方體移動(dòng)。當(dāng)Cube0與Cube1發(fā)生碰撞時(shí),程序?qū)⑦M(jìn)入方法 OnControllerColliderHit(),通過參數(shù)就可以得到接收碰撞的游戲?qū)ο笠簿褪荂ube1對(duì)象,而gameObject就是當(dāng)前主動(dòng)發(fā)生碰撞的Cube1。如下圖所示,當(dāng)兩個(gè)立方體碰撞時(shí)使用GUI已經(jīng)將碰撞的信息打印出來。

接著我在說說剛體組件,默認(rèn)在Unity中創(chuàng)建的模型是不具備接收物理引擎的,除非給模型添加剛體組件或角色控制器組件。我們先說說剛體,還用奮斗的小鳥來舉例子。發(fā)射小鳥以后,小鳥以一個(gè)拋物線軌跡去撞擊物體,發(fā)生碰撞后被碰撞的物體會(huì)根據(jù)小鳥撞擊的角度以及力度發(fā)生不同的物理效果,并且?guī)缀跏峭耆M真實(shí)的物理引擎。但是這種物理引擎的效果不能綁定在比如RPG游戲的主角身上。原因很簡(jiǎn)單,因?yàn)閯傮w所添加的物理引擎太過于真實(shí)以至于會(huì)影響用戶的對(duì)主角的操作,舉個(gè)例子比如用戶在控制主角移動(dòng)時(shí)他碰撞到質(zhì)量較大的物體,根據(jù)真實(shí)的物理引擎會(huì)被這個(gè)物體的反彈力把主角反彈回原位。但是這個(gè)是不符合邏輯的,因?yàn)閯傮w組件太過于物理話了,所以我們需要給主角添加角色控制器組件,它操作起來比較靈活,更容易讓我們操作主角。
下面我們給Cube1對(duì)象綁定剛體組件,選擇Cube1對(duì)象然后在導(dǎo)航菜單欄中選擇Component->physics ->Rigidbody(剛體)。我們看看下面這段代碼,使用添加了角色控制器組件的Cube0 去碰撞添加剛體組件的Cube1,當(dāng)他生碰撞時(shí)計(jì)算一下Cube0碰撞Cube1時(shí)的碰撞角度向量,然后通過剛體向他施加一個(gè)力把它推開。
[代碼]java代碼:
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
	//角色控制器組件在與具有Collider組件對(duì)象之間的碰撞
	void OnControllerColliderHit(ControllerColliderHit hit)
	{
		//判斷碰撞的對(duì)象是否具備剛體組件
		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);
			}
		}
	}
}
也可以將同樣的腳本直接綁定在第三人稱的角色控制器組件中。如下圖所示,主角移動(dòng)將周圍的箱子都推開了。

總的來說角色控制器組件適用于 既需要感應(yīng)物理引擎的支持但是又不能完全依賴與物理引擎,需要自己代碼去編寫一些東西的模型,所以非常適合游戲中主角對(duì)象的使用。雨松MOMO祝大家學(xué)習(xí)愉快,哇咔咔。















 
 
 
 
 
 
 