前言

这是以前写的人物控制器(包含第一人称、第三人称、漫游视角),这里做个记录,方便后续参考使用.

实现


模型使用官方的,操作使用鼠标右键控制视角,键盘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 第一人称、第三人称、漫游视角 控制器.相关推荐

  1. Unity第一人称手游-左侧控制移动,右侧控制视角和方向(第一人称,类似吃鸡游戏)

    Unity第一人称手游-左侧控制移动,右侧控制视角和方向(第一人称,类似吃鸡游戏) 文章最后会附上 项目下载地址 备注:资源是URP的,普通平台修改资源材质即可 效果图 实现原理及步骤 左侧遥杆移动- ...

  2. Three.js漫游相机控制器/three.js第三人称视角漫游/three.js第一人称视角漫游

    Three.js三维可视化引擎没有实现第三人称漫游控制器,第一人称实现的也很一般,大部分满足不了需求,需要自己手动去写一个.以下是模仿其它平台写的第三人称视角漫游,也可以简便的改写成第一人称. 下面是 ...

  3. unity第一人称射击游戏,枪击游戏,功能完整可以当大作业或者毕设

    unity第一人称射击游戏,枪击游戏(含源码和exe导出文件,下载链接在文末) unity第一人称枪击游戏,分为海岛地图和沙漠地图,可以开镜射击,敌人可以移动,菜单页面有开始游戏,游戏说明,退出三个按 ...

  4. Three.js系列: 写一个第一/三人称视角小游戏

    大家好,我是秋风,在上一篇 中说到了 Three.js 系列的目标以及宝可梦游戏,那么今天就来通过 Three.js 来谈谈关于游戏中的视角跟随问题.相信我的读者都或多或少玩一些游戏,例如王者荣耀.绝 ...

  5. 游戏分为第一人称和第三人称,什么是第二人称

    第一人称 第三人称 第二人称 最简单实现第二人称的方式,和朋友打cs单挑,然后将显示器连接线交换. 第一人称是自己,第三人称是除自己和对方的旁观者视角,那第二人称就是站在你对面的视角,举个例子,你正在 ...

  6. 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  7. 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>第一章~第三 ...

  8. 从硬盘上把数据传回到计算机称为什么,计算机基础知识 第一章 习题三

    计算机基础知识第一章习题三 一.填空题 1. 高级语言不能直接被计算机识别并执行,必须翻译成机器语言,翻译的方式有两种:一种是编译方式,另一种是方式. 2. 计算机中存储数据的最小单位是:存储容量的基 ...

  9. 【前端】第一章 前端三要素、前后端分离的演变史

    第一章 前端三要素.前后端分离的演变史 文章目录 第一章 前端三要素.前后端分离的演变史 一.前端三要素 结构层(HTML) 表现层(CSS) 行为层(JavaScript) 二.前后端分离的演变史 ...

最新文章

  1. c语言中如何自定义sort,c – 如何重载自定义std :: sort比较函数?
  2. 解决Fckeditor删除所有上传页面如何上传
  3. bind-utils.x86_64(dig) 安装失败解决办法
  4. 【LOJ#6682】梦中的数论(min_25筛)
  5. SAFEARRAY使用实例
  6. C++语言第一课的学习
  7. python内核死亡的原因_Python xgboost:内核死亡
  8. GIMP教程 3 扭曲变换工具 (瘦脸 瘦腿)
  9. X86_64 CR3控制寄存器详解
  10. 关于mac m1 安装安卓模拟器
  11. xboxone硬盘坏的表现_详解硬盘常见的故障及解决方法
  12. Chrome手势插件
  13. Java实践(五)仿照用户列表查询写查自己的库
  14. linux服务器在没有网的条件下,怎么安装使用numpy呢
  15. Bootstrap 4网格系统
  16. 用glRotatef函数转动对象
  17. 每个程序员都有的经历:从程序员到高级架构师,必须经历的三个阶段
  18. wangeditor富文本编辑器的一些坑
  19. 营养计算器操作指南--快速入门
  20. Python 读取excel数据并填入excel,批量生成模板

热门文章

  1. SendMail:古老但不古板的神奇邮件系统
  2. 使用Google App Engine将自己的IP所在地显示为Google~
  3. 17岁高考落榜生成为世界顶尖IT高手
  4. 对“新手”特别重要!数据科学必备的数学基础清单
  5. 家用计算机没有声,如何解决Win7电脑没有声音但驱动正常的问题
  6. 尤雨溪亲自回应Vue.js涉及国家安全漏洞问题
  7. Unity实现怪物巡逻追击玩家
  8. MBA联考-20101215
  9. LFSR线性反馈移位寄存器循环码编码原理
  10. 东芝TC358775XBG转换芯片:MIPI转LVDS(单/双路),替代ICN6202芯片