溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

[Unity3d]第一人稱和第三人稱視角完美切換

發(fā)布時間:2020-06-25 12:48:42 來源:網(wǎng)絡(luò) 閱讀:3550 作者:蓬萊仙羽 欄目:游戲開發(fā)

最近一直在搞3D漫游,在第一人稱和第三人稱視角切換碰到些問題,視角的例子我是導(dǎo)入的官方的character controller包,不得不佩服官方腳本語言的寫法,看了一下寫的很完美,新手估計(jì)比較難看懂,里面涉及到一些角度,還有向量等的計(jì)算,這就要求有一定的圖形學(xué)的基礎(chǔ),我將官方的第一人稱視角和第三人稱視角結(jié)合了一下,但發(fā)現(xiàn)還是不那么容易,不僅僅只是簡單的攝像機(jī)的切換和position以及rotation的賦值而已,當(dāng)然這種方法適合第三人稱切換至第一人稱,而第一人稱切換至第三人稱你會發(fā)現(xiàn)根本方向就切換不過來,位置是對了,但方向還是原來的方向,這就讓我有點(diǎn)苦惱,然后不得已只能硬著頭皮去看官方寫的控制第三人稱人物運(yùn)行的腳本ThirdPersonController,里面有一些英文的注解,這腳本寫的還是有一定的技術(shù)含量,畢竟是官方的嘛,想要看懂還是要慢慢靜下心來看的。

實(shí)現(xiàn)步驟:                                                                                                                                                                                                        

1.導(dǎo)入官方的第一人稱和第三人稱的Person,會發(fā)現(xiàn),第三人稱的Main Camera是在model的外面而第一人稱的Main Camera是在model的里面,這里最好統(tǒng)一一下,我將第三人稱的那個model拉到我新建的一個空物體下(記得reset這空物體),然后將主攝像機(jī)也拖放到這個空物體下,最好確保camera和3rdPersonController平級。這里還要說一下的,將3rdPersonController也reset一下,然后設(shè)置PositionY跟相機(jī)的Y一樣,我這里設(shè)置的是51大概。

2.創(chuàng)建視角切換的腳本viewpointSwitch,掛在GUI的物體上,這個物體掛了一些關(guān)于GUI還有控制鼠標(biāo)隱藏顯示的腳本
鼠標(biāo)隱藏和顯示:
void Update()  { 	 if (Input.GetKey(KeyCode.H)) 	// Lock the cursor inside gameview 	 Screen.lockCursor = true; 	// Hide mouse cursor 	Screen.showCursor = false; 	 	if(Input.GetKey(KeyCode.U)) 	 // Lock the cursor inside gameview 	Screen.lockCursor = false; 	//Show mouse cursor 	Screen.showCursor = true; }

viewpointSwitch:
[Unity3d]第一人稱和第三人稱視角完美切換[Unity3d]第一人稱和第三人稱視角完美切換
using UnityEngine; using System.Collections;  public class ViewpointSwitch : MonoBehaviour {     //從場景中拖入的object     public GameObject Obj_3rd;     public GameObject cam_3rd;     public GameObject gobj_3rd;      public GameObject Obj_1fs;     public GameObject cam_1fs;     public GameObject gobj_1fs;      //記錄剛進(jìn)入第一人稱視角時候的歐拉角和離開第一視角時候的歐拉角(Y方向)     float pre1fsAngle = 0;     float cur1fsAngle = 0;  	// Update is called once per frame 	void Update ()     {         //切換至第一人稱視角         if (Input.GetKey(KeyCode.F1))         {             //記錄一開始             //pre1fsAngle = cam_1fs.transform.eulerAngles.y;             pre1fsAngle = cam_3rd.transform.eulerAngles.y;  //記錄的第一人稱(這里取的是第三人稱,其實(shí)是一樣的)一開始的y方向歐拉角,這里沒用上面注釋掉的寫法是防止重復(fù)按f1鍵切換然后覆蓋初始值導(dǎo)致旋轉(zhuǎn)角度差值縮小             if (!Obj_1fs.activeSelf)             {                 Obj_1fs.SetActive(true);                 GameObject.Find("Main Character Controller").transform.localPosition = GameObject.Find("3rd Person Controller").transform.localPosition;                 GameObject.Find("Main Character Controller").transform.localRotation = GameObject.Find("3rd Person Controller").transform.localRotation;                 Obj_3rd.SetActive(false);             }         }         //切換至第三人稱視角         if (Input.GetKey(KeyCode.F2))         {             cur1fsAngle = cam_1fs.transform.eulerAngles.y;  //記錄             if (!Obj_3rd.activeSelf)             {                 Obj_3rd.SetActive(true);                 GameObject.Find("3rd Person Controller").transform.localPosition = GameObject.Find("Main Character Controller").transform.localPosition;                 //注意這里Mathf里面的方法是幅度,我這里就進(jìn)行了一個角度轉(zhuǎn)幅度的計(jì)算:幅度=角度*pi/180                 float angle = (cur1fsAngle - pre1fsAngle) * Mathf.PI / 180;                 gobj_3rd.GetComponent<ThirdPersonController>().v = Mathf.Cos(angle);                 gobj_3rd.GetComponent<ThirdPersonController>().h = Mathf.Sin(angle);                 print("旋轉(zhuǎn)角度:" + (cur1fsAngle-pre1fsAngle));                 gobj_3rd.GetComponent<ThirdPersonController>().flag = true;  //這個flag標(biāo)志是讓ThirdPersonController的update方法執(zhí)行改變上面的v,h一次,然后第二幀的時候就執(zhí)行v=Input.GetAxisRaw("Vertical")和h=Input.GetAxisRaw("Horizontal")                 Obj_1fs.SetActive(false);             }         } 	} } 
備注:
//w(1) & s(-1)(前后運(yùn)動)
v = Input.GetAxisRaw("Vertical");
 //a(-1) & d(1)(左右運(yùn)動)
 h = Input.GetAxisRaw("Horizontal");
這里的v和h變量要解釋一下,v代表前后方向,如果按下前方向w鍵,這里Input.GetAxisRaw("Vertical")會有一個-1~1的一個變化,如果是遙感就會有浮點(diǎn)數(shù),但如果是鍵盤的話,一般就是0,-1,1三個狀態(tài),按下w前進(jìn)方向鍵,v會變成1,如果按下后退鍵s,v就會變成-1,如果不按則是0。h就是代表水平左右軸向,a鍵按下h=-1,d按下h=1,不按則代表0。
ThirdPersonController.js人物旋轉(zhuǎn)的方向是始終轉(zhuǎn)向一個前進(jìn)的方向向量,var targetDirection = h * right + v * forward;
這里的right和forward分表表示X軸(forward方向)和Z軸(right方向)的單位向量
var forward = cameraTransform.TransformDirection(Vector3.forward);
var right = Vector3(forward.z, 0, -forward.x);

效果圖:                                                                                                                                                                                                              

1.剛開始啟動,第三人稱的模型朝向以及旋轉(zhuǎn)坐標(biāo)
[Unity3d]第一人稱和第三人稱視角完美切換    
[Unity3d]第一人稱和第三人稱視角完美切換
2.按一下D鍵,也就是右鍵,人物旋轉(zhuǎn),90度,朝向以及旋轉(zhuǎn)坐標(biāo),以及v,h(控制旋轉(zhuǎn)方向的一個系數(shù),上文有介紹)的值
[Unity3d]第一人稱和第三人稱視角完美切換
[Unity3d]第一人稱和第三人稱視角完美切換
[Unity3d]第一人稱和第三人稱視角完美切換


在線展示:                                                                                                                  

http://ueige123.oicp.net/dingxiaowei/13viewpointswitch/13viewpointswitch.html



==================== 迂者 丁小未 CSDN博客專欄=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:858550         cocos2dx QQ群:280818155

====================== 相互學(xué)習(xí),共同進(jìn)步 ===================

 

轉(zhuǎn)載請注明出處:http://blog.csdn.net/dingxiaowei2013/article/details/18281261

歡迎關(guān)注我的微博:http://weibo.com/u/2590571922

需要工程文件的請留言!


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI