Unity基础包 刚体FPS HeadBob和CameraRefocus 脚本研究
来源:互联网 发布:js文本框只能输入整数 编辑:程序博客网 时间:2024/06/05 10:17
版本:unity 5.3.4 语言:C#
有段时间没写了,主要在忙考核期的任务,可能还是不是很适应公司的环境,最近负能量有点多,不过我已经把那些悲情的歌删除了,应该没事了。
之前一段时间迷上了RimWorld,玩到了4点半,第二天精神饱满的上班了,不过这是在玩命吧。但总是学习的话感觉给自己压力太大了,所以是养成习惯,而不是逼出习惯来吧?总之我还是抱着能改善自己生活的想法来工作和学习,希望哪天自己也能成个学霸。
还有最近比较关心的是FF15和PS4 Pro了,英亚上好便宜啊,就是暂时买不起,希望过一两个月不要涨价,没涨就入了。
好了,正题了,工作上的事情差不多就抽空写写,这些脚本反复接触的话,我觉得自己在解决问题的时候思路也会广很多。
今天主要带来两个脚本,一个脚本其实在某脚本中有集成,只不过基础包为刚体FPS新建了一个,思路是一样的,那就是HeadBob,主要控制镜头的摇动:
// 镜头摇动脚本,之前的非刚体FPS脚本是直接集成在脚本中的public class HeadBob : MonoBehaviour{ public Camera Camera; //当前使用的Camera public 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); } }}
反正是我上面注释所说的效果,不过我不太清楚在什么情况下会用到,限定镜头角度范围的话,也不会这么做吧。
0 0
- Unity基础包 刚体FPS HeadBob和CameraRefocus 脚本研究
- Unity基础包 刚体FPS RigidbodyFirstPersonController 脚本研究
- Unity基础包 FirstPersonController 脚本研究
- Unity 基础 - 刚体和 Collider
- Unity脚本获取内存和FPS
- Unity基础包 FirstPersonController下的CurveControlledBob和LerpContolledBob 脚本研究
- Unity基础包 FirstPersonController下的MouseLook 脚本研究
- Unity基础包 FirstPersonController下的FOVKick 脚本研究
- Unity基础包 FirstPersonController下的MouseLook 脚本研究
- Unity统计FPS脚本
- Unity 帧率设置和显示FPS脚本
- unity 刚体
- Unity刚体、碰撞器、实验和总结
- Unity基础包 工具类 FPSCounter脚本显示帧率
- unity脚本基础
- Unity脚本基础
- Unity基础 - 脚本入门
- unity脚本基础笔记
- 用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
- 缓存技术
- unity3D的面试题
- Lua元表
- Service组件研究
- Unity基础包 刚体FPS HeadBob和CameraRefocus 脚本研究
- oracle数据库常用的99条查询语句
- 关于Oracle误操作--数据被Commit后的数据回退恢复(闪回)
- 跨服务器session共享
- poj3071_Football 概率DP、二进制的应用
- 为EasyUI 的Tab 标签添加右键菜单(转)
- selenium 分布式部署测试
- Android 守护进程的一些认识
- 原生js的日期计算器