Unity 第一人称、第三人称、漫游视角 控制器.
前言
这是以前写的人物控制器(包含第一人称、第三人称、漫游视角),这里做个记录,方便后续参考使用.
实现
模型使用官方的,操作使用鼠标右键控制视角,键盘WASD、Shift控制人物移动.
切换到漫游视角(God)时,有BUG,待修复.
人物控制:
/// <summary>/// 第三人称.人物移动操作./// </summary>private void MoveUpdate_ThirdController(){//按住左SHIFT 加速.if (Input.GetKey(KeyCode.LeftShift)){isRun = true;}else{isRun = false;}//按下了 W A S D.if (v != 0 || h != 0){if (isRun) //执行奔跑动画.{m_Animator.SetBool("Run", true);}else //执行行走动画.{m_Animator.SetBool("Run", false);m_Animator.SetBool("Walk", true);}float rotY = playerCamera.transform.rotation.eulerAngles.y; //摄像机世界坐标前方.Vector3 dir = new Vector3(h, 0, v); //移动方向.dir = Quaternion.Euler(0, rotY, 0) * dir; //移动方向的前方为摄像机前方.(按下W,向摄像机正前方行走)(前进方向必须是摄像机的前方)//m_CC.SimpleMove(dir);m_CC.Move(dir * walkSpeed_Third); //m_CC为CharacterController组件.m_Transform.localRotation = Quaternion.LookRotation(dir);}else{m_Animator.SetBool("Walk", false);}}
/// <summary>/// 第一人称.人物移动操作./// </summary>private void MoveUpdate_FirstController(){//按住左SHIFT 加速.if (Input.GetKey(KeyCode.LeftShift)){isRun = true; //加速.}else{isRun = false; //正常速度.}//按下了 W A S D.if (v != 0 || h != 0){//todo:----->>当前动画默认是移动的.而且没有向后走的动画.所以第一人称不使用动画.float rotY = playerCamera.transform.rotation.eulerAngles.y; //摄像机世界坐标前方.Vector3 dir = new Vector3(h, 0, v); //移动方向.dir = Quaternion.Euler(0, rotY, 0) * dir; //移动方向的前方为摄像机前方.(按下W,向摄像机正前方行走)(前进方向必须是摄像机的前方)if (isRun) //加速.{//m_CC.SimpleMove(dir * runSpeed_First);m_CC.Move(dir * runSpeed_First); //m_CC为CharacterController组件.}else //正常速度.{//m_CC.SimpleMove(dir * walkSpeed_First);m_CC.Move(dir * walkSpeed_First);}}}
/// <summary>/// 漫游模式.人物移动操作.(不受重力影响,飞行.)/// </summary>private void MoveUpdate_GodController(){//按住左SHIFT 加速.if (Input.GetKey(KeyCode.LeftShift)){isRun = true; //加速.}else{isRun = false; //正常速度.}//按下了 W A S D.if (v != 0 || h != 0){float rotY = playerCamera.transform.localRotation.eulerAngles.y; //摄像机自身坐标前方.左右.float rotX = playerCamera.transform.localRotation.eulerAngles.x; //摄像机自身坐标前方.上下.Vector3 dir = new Vector3(h, 0, v); //移动方向.dir = Quaternion.Euler(rotX, rotY, 0) * dir; //移动方向的前方为摄像机前方.(按下W,向摄像机正前方行走)(前进方向必须是摄像机的前方)if (isRun) //加速.{//m_CC.SimpleMove(dir * runSpeed_First);//m_CC.Move(dir * runSpeed_First);m_Transform.Translate(dir * runSpeed_God);}else //正常速度.{//m_CC.SimpleMove(dir * walkSpeed_First);//m_CC.Move(dir * walkSpeed_First);m_Transform.Translate(dir * walkSpeed_God);}}}
视角控制:(放在LateUpdate)
//----->>第三人称视角控制.void Start () {m_Transform = gameObject.GetComponent<Transform>();//playerPerson = GameObject.Find("Player/Person").GetComponent<Transform>();playerPerson = GameObject.Find("Player/Person/HeadPos").GetComponent<Transform>(); //最好朝向的是人物的头部.dir = playerPerson.position - m_Transform.localPosition; //先获取摄像机指向人物的方向向量. //朝向头部时,不能使用playerPerson.localPosition}/// <summary>/// 第三人称 摄像机旋转控制./// </summary>private void CameraController_ThirdController(){float x = Input.GetAxis("Mouse X") * rotateSpeed;float y = Input.GetAxis("Mouse Y") * rotateSpeed;distance -= (Input.GetAxis("Mouse ScrollWheel") * scrollSpeed);distance = Mathf.Clamp(distance, minDis, maxDis);//按住鼠标右键,旋转视角.if (Input.GetMouseButton(1)){Quaternion rotX = Quaternion.Euler(0, x, 0);//Quaternion rotY = Quaternion.Euler(-y, 0, 0);//摄像机世界坐标Z 比人物世界坐标Z 远(Z轴在人物前方),上下滑动方向改变.if (m_Transform.position.z <= playerPerson.position.z) //摄像机在人物后方.{#region 限制上下角度范围.(不同点:rotY的Euler是-y)Quaternion rotY = Quaternion.Euler(-y, 0, 0);if (m_Transform.localRotation.eulerAngles.x < minAngleX) //当向下角度越界时.{if (y < 0) //达到最下,向上滑动.{dir = rotX * rotY * dir;}else //达到最下,向下滑动. (不再向下滑){dir = rotX * dir;}}else if (m_Transform.localRotation.eulerAngles.x > maxAngleX) //当向上角度越界时.{if (y > 0) //达到最上,向下滑动.{dir = rotX * rotY * dir;}else //达到最上,向上滑动. (不再向上滑){dir = rotX * dir;}}else //上下角度在范围内.{dir = rotX * rotY * dir;}#endregion}else //摄像机在人物前方.{#region 限制上下角度范围.(不同点:rotY的Euler是y)Quaternion rotY = Quaternion.Euler(y, 0, 0);if (m_Transform.localRotation.eulerAngles.x < minAngleX) //当向下角度越界时.{if (y < 0) //达到最下,向上滑动.{dir = rotX * rotY * dir;}else //达到最下,向下滑动. (不再向下滑){dir = rotX * dir;}}else if (m_Transform.localRotation.eulerAngles.x > maxAngleX) //当向上角度越界时.{if (y > 0) //达到最上,向下滑动.{dir = rotX * rotY * dir;}else //达到最上,向上滑动. (不再向上滑){dir = rotX * dir;}}else //上下角度在范围内.{dir = rotX * rotY * dir;}#endregion}}m_Transform.localPosition = playerPerson.position - dir.normalized * distance;m_Transform.LookAt(playerPerson);}
//----->>第一人称视角控制.void Start () {m_Transform = gameObject.GetComponent<Transform>();playerPerson = GameObject.Find("Player/Person").GetComponent<Transform>();}void LateUpdate () {float x = Input.GetAxis("Mouse X");float y = -Input.GetAxis("Mouse Y");playerPerson.Rotate(Vector3.up, x, Space.Self);m_Transform.Rotate(Vector3.right, y, Space.Self);m_Transform.localRotation = ClampRotationAroundXAxis(m_Transform.localRotation);}/// <summary>/// 限制四元数的欧拉角X. (这是官方案例的方法.)/// </summary>private Quaternion ClampRotationAroundXAxis(Quaternion q){q.x /= q.w;q.y /= q.w;q.z /= q.w;q.w = 1.0f;float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan(q.x);angleX = Mathf.Clamp(angleX, minRotX, maxRotX);q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angleX);return q;}
项目链接_Github.
项目链接_csdn.
完毕.
Unity 第一人称、第三人称、漫游视角 控制器.相关推荐
- Unity第一人称手游-左侧控制移动,右侧控制视角和方向(第一人称,类似吃鸡游戏)
Unity第一人称手游-左侧控制移动,右侧控制视角和方向(第一人称,类似吃鸡游戏) 文章最后会附上 项目下载地址 备注:资源是URP的,普通平台修改资源材质即可 效果图 实现原理及步骤 左侧遥杆移动- ...
- Three.js漫游相机控制器/three.js第三人称视角漫游/three.js第一人称视角漫游
Three.js三维可视化引擎没有实现第三人称漫游控制器,第一人称实现的也很一般,大部分满足不了需求,需要自己手动去写一个.以下是模仿其它平台写的第三人称视角漫游,也可以简便的改写成第一人称. 下面是 ...
- unity第一人称射击游戏,枪击游戏,功能完整可以当大作业或者毕设
unity第一人称射击游戏,枪击游戏(含源码和exe导出文件,下载链接在文末) unity第一人称枪击游戏,分为海岛地图和沙漠地图,可以开镜射击,敌人可以移动,菜单页面有开始游戏,游戏说明,退出三个按 ...
- Three.js系列: 写一个第一/三人称视角小游戏
大家好,我是秋风,在上一篇 中说到了 Three.js 系列的目标以及宝可梦游戏,那么今天就来通过 Three.js 来谈谈关于游戏中的视角跟随问题.相信我的读者都或多或少玩一些游戏,例如王者荣耀.绝 ...
- 游戏分为第一人称和第三人称,什么是第二人称
第一人称 第三人称 第二人称 最简单实现第二人称的方式,和朋友打cs单挑,然后将显示器连接线交换. 第一人称是自己,第三人称是除自己和对方的旁观者视角,那第二人称就是站在你对面的视角,举个例子,你正在 ...
- 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章
CV:翻译并解读2019<A Survey of the Recent Architectures of Deep Convolutional Neural Networks>第一章~第三 ...
- 从硬盘上把数据传回到计算机称为什么,计算机基础知识 第一章 习题三
计算机基础知识第一章习题三 一.填空题 1. 高级语言不能直接被计算机识别并执行,必须翻译成机器语言,翻译的方式有两种:一种是编译方式,另一种是方式. 2. 计算机中存储数据的最小单位是:存储容量的基 ...
- 【前端】第一章 前端三要素、前后端分离的演变史
第一章 前端三要素.前后端分离的演变史 文章目录 第一章 前端三要素.前后端分离的演变史 一.前端三要素 结构层(HTML) 表现层(CSS) 行为层(JavaScript) 二.前后端分离的演变史 ...
最新文章
- c语言中如何自定义sort,c – 如何重载自定义std :: sort比较函数?
- 解决Fckeditor删除所有上传页面如何上传
- bind-utils.x86_64(dig) 安装失败解决办法
- 【LOJ#6682】梦中的数论(min_25筛)
- SAFEARRAY使用实例
- C++语言第一课的学习
- python内核死亡的原因_Python xgboost:内核死亡
- GIMP教程 3 扭曲变换工具 (瘦脸 瘦腿)
- X86_64 CR3控制寄存器详解
- 关于mac m1 安装安卓模拟器
- xboxone硬盘坏的表现_详解硬盘常见的故障及解决方法
- Chrome手势插件
- Java实践(五)仿照用户列表查询写查自己的库
- linux服务器在没有网的条件下,怎么安装使用numpy呢
- Bootstrap 4网格系统
- 用glRotatef函数转动对象
- 每个程序员都有的经历:从程序员到高级架构师,必须经历的三个阶段
- wangeditor富文本编辑器的一些坑
- 营养计算器操作指南--快速入门
- Python 读取excel数据并填入excel,批量生成模板
热门文章
- SendMail:古老但不古板的神奇邮件系统
- 使用Google App Engine将自己的IP所在地显示为Google~
- 17岁高考落榜生成为世界顶尖IT高手
- 对“新手”特别重要!数据科学必备的数学基础清单
- 家用计算机没有声,如何解决Win7电脑没有声音但驱动正常的问题
- 尤雨溪亲自回应Vue.js涉及国家安全漏洞问题
- Unity实现怪物巡逻追击玩家
- MBA联考-20101215
- LFSR线性反馈移位寄存器循环码编码原理
- 东芝TC358775XBG转换芯片:MIPI转LVDS(单/双路),替代ICN6202芯片