最近一直在搞3D漫游,在第一人称和第三人称视角切换碰到些问题,视角的例子我是导入的官方的character controller包,不得不佩服官方脚本语言的写法,看了一下写的很完美,新手估计比较难看懂,里面涉及到一些角度,还有向量等的计算,这就要求有一定的图形学的基础,我将官方的第一人称视角和第三人称视角结合了一下,但发现还是不那么容易,不仅仅只是简单的摄像机的切换和position以及rotation的赋值而已,当然这种方法适合第三人称切换至第一人称,而第一人称切换至第三人称你会发现根本方向就切换不过来,位置是对了,但方向还是原来的方向,这就让我有点苦恼,然后不得已只能硬着头皮去看官方写的控制第三人称人物运行的脚本ThirdPersonController,里面有一些英文的注解,这脚本写的还是有一定的技术含量,毕竟是官方的嘛,想要看懂还是要慢慢静下心来看的。
实现步骤:
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:
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; //记录刚进入第一人称视角时候的欧拉角和离开第一视角时候的欧拉角(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; //记录的第一人称(这里取的是第三人称,其实是一样的)一开始的y方向欧拉角,这里没用上面注释掉的写法是防止重复按f1键切换然后覆盖初始值导致旋转角度差值缩小 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里面的方法是幅度,我这里就进行了一个角度转幅度的计算:幅度=角度*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("旋转角度:" + (cur1fsAngle-pre1fsAngle)); gobj_3rd.GetComponent<ThirdPersonController>().flag = true; //这个flag标志是让ThirdPersonController的update方法执行改变上面的v,h一次,然后第二帧的时候就执行v=Input.GetAxisRaw("Vertical")和h=Input.GetAxisRaw("Horizontal") Obj_1fs.SetActive(false); } } } }备注:
//w(1) & s(-1)(前后运动)
v = Input.GetAxisRaw("Vertical");
效果图:
在线展示:
http://ueige123.oicp.net/dingxiaowei/13viewpointswitch/13viewpointswitch.html
==================== 迂者 丁小未 CSDN博客专栏=================
MyBlog:http://blog.csdn.net/dingxiaowei2013 MyQQ:1213250243
Unity QQ群:375151422 cocos2dx QQ群:280818155
====================== 相互学习,共同进步 ===================
转载请注明出处:http://blog.csdn.net/dingxiaowei2013/article/details/18281261
欢迎关注我的微博:http://weibo.com/u/2590571922