您好,登錄后才能下訂單哦!
最近一直在搞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ù)含量,畢竟是官方的嘛,想要看懂還是要慢慢靜下心來看的。
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; }
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); } } } }備注:
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
需要工程文件的請留言!
免責(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)容。