[Unity3d]第一人称和第三人称视角完美切换
admin
2023-01-20 14:01:03
0

最近一直在搞3D漫游,在第一人称和第三人称视角切换碰到些问题,视角的例子我是导入的官方的character controller包,不得不佩服官方脚本语言的写法,看了一下写的很完美,新手估计比较难看懂,里面涉及到一些角度,还有向量等的计算,这就要求有一定的图形学的基础,我将官方的第一人称视角和第三人称视角结合了一下,但发现还是不那么容易,不仅仅只是简单的摄像机的切换和position以及rotation的赋值而已,当然这种方法适合第三人称切换至第一人称,而第一人称切换至第三人称你会发现根本方向就切换不过来,位置是对了,但方向还是原来的方向,这就让我有点苦恼,然后不得已只能硬着头皮去看官方写的控制第三人称人物运行的脚本ThirdPersonController,里面有一些英文的注解,这脚本写的还是有一定的技术含量,毕竟是官方的嘛,想要看懂还是要慢慢静下心来看的。

实现步骤:                                                                                                                                                                                                        

1.导入官方的第一人称和第三人称的Person,会发现,第三人称的Main Camera是在model的外面而第一人称的Main Camera是在model的里面,这里最好统一一下,我将第三人称的那个model拉到我新建的一个空物体下(记得reset这空物体),然后将主摄像机也拖放到这个空物体下,最好确保camera和3rdPersonController平级。这里还要说一下的,将3rdPersonController也reset一下,然后设置PositionY跟相机的Y一样,我这里设置的是51大概。
2.创建视角切换的脚本viewpointSwitch,挂在GUI的物体上,这个物体挂了一些关于GUI还有控制鼠标隐藏显示的脚本 鼠标隐藏和显示:
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;      //记录刚进入第一人称视角时候的欧拉角和离开第一视角时候的欧拉角(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().v = Mathf.Cos(angle);                 gobj_3rd.GetComponent().h = Mathf.Sin(angle);                 print("旋转角度:" + (cur1fsAngle-pre1fsAngle));                 gobj_3rd.GetComponent().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");  //a(-1) & d(1)(左右运动)  h = Input.GetAxisRaw("Horizontal");
这里的v和h变量要解释一下,v代表前后方向,如果按下前方向w键,这里Input.GetAxisRaw("Vertical")会有一个-1~1的一个变化,如果是遥感就会有浮点数,但如果是键盘的话,一般就是0,-1,1三个状态,按下w前进方向键,v会变成1,如果按下后退键s,v就会变成-1,如果不按则是0。h就是代表水平左右轴向,a键按下h=-1,d按下h=1,不按则代表0。 ThirdPersonController.js人物旋转的方向是始终转向一个前进的方向向量,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.刚开始启动,第三人称的模型朝向以及旋转坐标 [Unity3d]第一人称和第三人称视角完美切换    
[Unity3d]第一人称和第三人称视角完美切换
2.按一下D键,也就是右键,人物旋转,90度,朝向以及旋转坐标,以及v,h(控制旋转方向的一个系数,上文有介绍)的值 [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

====================== 相互学习,共同进步 ===================

 

转载请注明出处:http://blog.csdn.net/dingxiaowei2013/article/details/18281261

欢迎关注我的微博:http://weibo.com/u/2590571922

需要工程文件的请留言!


相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...