版本:unity 5.3.4  语言:C#

有段时间没写了,主要在忙考核期的任务,可能还是不是很适应公司的环境,最近负能量有点多,不过我已经把那些悲情的歌删除了,应该没事了。

之前一段时间迷上了RimWorld,玩到了4点半,第二天精神饱满的上班了,不过这是在玩命吧。但总是学习的话感觉给自己压力太大了,所以是养成习惯,而不是逼出习惯来吧?总之我还是抱着能改善自己生活的想法来工作和学习,希望哪天自己也能成个学霸。

还有最近比较关心的是FF15和PS4 Pro了,英亚上好便宜啊,就是暂时买不起,希望过一两个月不要涨价,没涨就入了。

好了,正题了,工作上的事情差不多就抽空写写,这些脚本反复接触的话,我觉得自己在解决问题的时候思路也会广很多。

今天主要带来两个脚本,一个脚本其实在某脚本中有集成,只不过基础包为刚体FPS新建了一个,思路是一样的,那就是HeadBob,主要控制镜头的摇动:

// 镜头摇动脚本,之前的非刚体FPS脚本是直接集成在脚本中的
public class HeadBob : MonoBehaviour
{public Camera Camera;   //当前使用的Camerapublic CurveControlledBob motionBob = new CurveControlledBob(); //曲线摇动控制器,主要控制移动时相机的x、y轴移动public LerpControlledBob jumpAndLandingBob = new LerpControlledBob();   //插值摇动控制器,跳跃着陆时y轴的下降和还原public RigidbodyFirstPersonController rigidbodyFirstPersonController;   //刚体FPS脚本public float StrideInterval;    //步伐的间隔[Range(0f, 1f)] public float RunningStrideLengthen; //奔跑步伐延长//private CameraRefocus m_CameraRefocus;    //重调相机聚焦,这个脚本主要用于如果看到物体,则强制往前看,不允许镜头上下移动,感觉没什么用,所以注释了吧private bool m_PreviouslyGrounded;  //之前的状态是否在地上private Vector3 m_OriginalCameraPosition;   //相机的起源位置// 初始化private void Start(){motionBob.Setup(Camera, StrideInterval);m_OriginalCameraPosition = Camera.transform.localPosition;//m_CameraRefocus = new CameraRefocus(Camera, transform.root.transform, Camera.transform.localPosition);}private void Update(){//m_CameraRefocus.GetFocusPoint();Vector3 newCameraPosition;if (rigidbodyFirstPersonController.Velocity.magnitude > 0 && rigidbodyFirstPersonController.Grounded){// 在陆地上并且在移动时,根据镜头摇动计算出新的坐标Camera.transform.localPosition = motionBob.DoHeadBob(rigidbodyFirstPersonController.Velocity.magnitude*(rigidbodyFirstPersonController.Running ? RunningStrideLengthen : 1f));  //这边如果在奔跑状态下,步伐长度增加newCameraPosition = Camera.transform.localPosition;newCameraPosition.y = Camera.transform.localPosition.y - jumpAndLandingBob.Offset();    //减去一个跳跃后下沉的值}else{// 其他情况newCameraPosition = Camera.transform.localPosition;newCameraPosition.y = m_OriginalCameraPosition.y - jumpAndLandingBob.Offset();}Camera.transform.localPosition = newCameraPosition;// 刚着陆,开始下沉的计算if (!m_PreviouslyGrounded && rigidbodyFirstPersonController.Grounded){StartCoroutine(jumpAndLandingBob.DoBobCycle());}m_PreviouslyGrounded = rigidbodyFirstPersonController.Grounded; //把是否着陆的状态存储//m_CameraRefocus.SetFocusPoint();}
}

是否注意到unity团队把CameraRefocus注释了,然后我就打开了,对比了一下前后的结果,然后去分析了一下,哈哈,这就是下一个要说的脚本:

// 相机重聚焦脚本,在HeadBob中是被注释掉的,不清楚有什么历史渊源
public class CameraRefocus
{public Camera Camera;   //相机public Vector3 Lookatpoint; //观察对象坐标public Transform Parent;    //父对象的坐标,这边传入的就是角色层的坐标private Vector3 m_OrigCameraPos;    //相机的起源坐标private bool m_Refocus; //是否重聚焦// 初始化,这边的parent传入的是transform.root即最上层节点,就是相机层的父节点public CameraRefocus(Camera camera, Transform parent, Vector3 origCameraPos){m_OrigCameraPos = origCameraPos;    //相机起源坐标Camera = camera;    //相机层和角色层Parent = parent;}// 相机和父节点的改变public void ChangeCamera(Camera camera){Camera = camera;}public void ChangeParent(Transform parent){Parent = parent;}// 获取聚焦点public void GetFocusPoint(){RaycastHit hitInfo;if (Physics.Raycast(Parent.transform.position + m_OrigCameraPos, Parent.transform.forward, out hitInfo, //从相机的坐标往角色的前方放出一条射线100f)){Lookatpoint = hitInfo.point;    //记录碰到的物体上坐标m_Refocus = true;return;}m_Refocus = false;}// 设置聚焦点// 如果看到物体,则强制往前看,不允许镜头上下移动public void SetFocusPoint(){if (m_Refocus){Camera.transform.LookAt(Lookatpoint);}}
}

反正是我上面注释所说的效果,不过我不太清楚在什么情况下会用到,限定镜头角度范围的话,也不会这么做吧。

Unity基础包 刚体FPS HeadBob和CameraRefocus 脚本研究相关推荐

  1. Unity 面试题汇总(三)Unity 基础相关

    Unity 面试题汇总(三)Unity 基础相关 目录 Unity 面试题汇总(三)Unity 基础相关 0.FSM(状态机).HFSM(分层状态机).BT(行为树)的区别 1.什么是协同程序? 2. ...

  2. Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS

    本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没有比这 ...

  3. Unity基础学习路线

        Unity基础 C#程序设计 第001课初识unity 第002课初始unity场景树_渲染体系_物理体系 第003课初识Unity C#的基本结构_类_成员_类的函数 第004课Unity ...

  4. [Unity学习笔记:FPS游戏制作(3)]子弹拖尾,碰撞与枪口火焰效果

    往期博客[Unity学习笔记:FPS游戏制作(2)] 发射子弹----(2021.6.20学习笔记) 文章目录 一,实现思路 二,粒子效果的实现 (1)子弹拖尾特效的实现 (2)枪口火焰特效的实现 ( ...

  5. Unity基础射线判定以及编辑自定义模型

    Unity基础射线判定以及编辑自定义模型 Unity射线基础解析 Unity UI射线检测 射线判定生成自定义模型 代码很简单没有难度,自己看一下应该就能明白. OK 老规矩,直接上代码: Unity ...

  6. 数据分析必备:掌握这个R语言基础包1%的功能让你事半功倍!(附代码)

    来源:大数据 本文约7100字,建议阅读15分钟. 本文介绍了utils包在R语言基础的用途. [ 导读 ]无论数据分析的目的是什么,将数据导入R中的过程都是不可或缺的.毕竟巧妇难为无米之炊.util ...

  7. 我的世界服务器高清修复,我的世界1.7.2 skinme高清修复(optifine)兼容版 35+8大型基础包...

    我的世界1.7.2 skinme高清修复(optifine)兼容版 35+8大型基础包这是一款休闲益智类型的游戏下载,我的世界1.7.2 skinme高清修复(optifine)兼容版 35+8大型基 ...

  8. Numpy:高性能科学计算和数据分析的基础包

    Numpy:高性能科学计算和数据分析的基础包 概述 基础数据类型:ndarray数组 为什么引入ndarray数组 案例1:实现a+1的计算 案例2:实现c=a+b的计算 创建ndarray数组 查看 ...

  9. 第一阶段unity基础

    第一阶段unity基础 引言 注意: 1.重点:1.适用性(什么时候用,怎么用)<记脑子里>  2.作用(能够解决什么问题) 3.定义  4.操作/语法 2.每天练习必须会独立完成 3.形 ...

最新文章

  1. 根据函数指针地址获取函数名
  2. 个人知识管理的29个原则--摘录
  3. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )
  4. python subprocess Popen
  5. 远程连接——Win连接远程Linux的软件
  6. gdb调试的基本使用
  7. requests模块相关用法
  8. CTO职场解惑指南系列(二)春节篇
  9. android蓝牙历史
  10. linspace函数matlab_MATLAB用不同颜色绘制多条曲线
  11. 【图像修复】基于matlab GUI Lucy_Richardson迭代法图像修复【含Matlab源码 846期】
  12. flashfxp连接失败,导致flashfxp连接失败的4种原因
  13. GitHub官网入门教程翻译
  14. 五百强各大行业简介+面试流程+tips
  15. 酷我音乐解析API,支持搜索、歌单、单曲、专辑、MV解析、多音质切换、图片大小切换
  16. IT售前工作职责和流程
  17. 全球高分辨率(10m和30m)土地覆盖数据分享
  18. linux模糊查找目录文件,详解Linux查找目录下的按时间过滤的文件
  19. mt管理器逆向了解安卓----【mt管理器介绍】
  20. 算法初体验之欧几里得算法

热门文章

  1. linux 查看ln链接地址,linux ln链接详解
  2. 【ODYSSEY-STM32MP157C】驱动 UART 读取传感器数据
  3. 简单的购物车和购物车结算
  4. 购物车二级列表联动以及价格计算
  5. 啤酒车间平面布置图、水厂平面布置图、厂房设备布置图、污水厂管道布置图、乳品厂平面布置图、水果罐头工厂厂区总平面布置图、煤矿开采工作面综合布置图、日产500吨石灰窑CAD工艺布置图……各种布置图汇总
  6. 【游戏】任天堂Nintendo Switch超详细购买/使用指南以及注意事项(根据自己使用持续更新中...)
  7. VBA -[知识点]: 字典
  8. 新媒体运营编辑有出路吗
  9. 佐治亚理工计算机科学在线硕士,佐治亚理工学院计算机研究生申请要求及截止时间一览...
  10. linux下启动,关闭oracle数据库