Unity3d--实现第三人称视角(相机跟随)
2017-09-13 02:40
3075 查看
实现第三人称视角有三种:
方案1:
最简单的就是 直接 把主相机作为Player角色的子物体,并自行固定好相机的位置方案2:
设置一个空的GameObject,并且与Player的旋转和位置保持一致,然后将 主相机 设置成该GameObject的子对象。这种做法和方案 1 相似。(这种做法好处在于 当模拟角色死亡倒地的时候比较方便,如果采用方案 1 ,只能是重新创建一个相机,因为角色倒地的时候,子物体相机也会视角倒地,所以效率肯定方案 2 高)
方案3:
通过代码动态改变相机的位置,使相机始终保持在自己想要的位置上,当物体旋转时,同理。代码实现相机跟随物体,可使用一个接口函数Vector3.SmoothDamp() 平滑阻尼 。
函数介绍:随着时间的推移,逐渐改变一个向量朝向预期的目标(有点类似受阻力减速运动)
在官方的手册里也有推荐用此函数 来实现 平滑的相机跟随
Unity手册—-Vector3.SmoothDamp() 传送门
public static Vector3 SmoothDamp( Vector3 current, //当前物体位置 Vector3 target, //目标位置 ref Vector3 currentVelocity, //当前速度,这个值由你每次调用这个函数时被修改 //虽然使用ref关键字,不过函数运行时会自动修改 //一般传入参数值为0 float smoothTime, //到达目标的大约时间,较小的值将快速到达目标 float maxSpeed = Mathf.Infinity,//选择允许你限制的最大速度(默认为正无穷) float deltaTime = Time.deltaTime//自上次调用这个函数的时间(默认为Time.deltaTime) );
以下代码为 相机跟随物体 旋转与移动 实例:
public GameObject thirdPersonPlayer; //角色 public GameObject FollowCamera; //跟随相机 public float CameraSmoothTime = 0; private Vector3 velocity = Vector3.zero; void Update() { //相机跟随旋转 float x = RotateSpeed * Input.GetAxis("Mouse X"); //以下为相机与角色同步旋转是 FollowCamera.transform.rotation = Quaternion.Euler( FollowCamera.transform.rotation.eulerAngles + Quaternion.AngleAxis(x, Vector3.up).eulerAngles );//原理: 物体当前的欧拉角 + 鼠标x轴上的增量所产生的夹角 thirdPersonPlayer.transform.rotation = Quaternion.Euler( thirdPersonPlayer.transform.rotation.eulerAngles + Quaternion.AngleAxis(x, Vector3.up).eulerAngles );//同理 //------------------------------------------------------>>>>>>>> //相机跟随移动 Vector3 TargetCameraPosition = thirdPersonPlayer.transform.TransformPoint(new Vector3(0, 4.5f, -5.5f));//获取相机跟随的相对位置,再转为世界坐标 FollowCamera.transform.position = Vector3.SmoothDamp( FollowCamera.transform.position, TargetCameraPosition, ref velocity, CameraSmoothTime, //最好为0 Mathf.Infinity, Time.deltaTime ); }
CameraSmoothTime 个人建议设为 <=0.001(直接为0) :
由于平滑阻尼函数类似于减速运动,到达时间设定太长(例如0.5)的话,会出现相机跟随太慢。
还有一种情况就是(例如0.01),相机完成平滑阻尼运动仍需时间,但时间太短,会使相机不停前后抖动,从而产生角色抖动的现象。
题外话,关于相机跟随的一些建议与探讨:
当物体移动和相机跟随的刷新频率不同时,常常会出现物体抖动的问题,解决这个问题的最好方法是:当角色的移动和旋转放在Update()中,那么就可以把所有相机的移动旋转放在LateUpdate()。
这是为了在相机追踪角色位置之前,确保角色已经完成移动与旋转。
如果相机在跟随物体A时,画面同时还有物体B,此时物体A和物体B的刷新频率需要保持一致,否则物体二仍然会出现抖动
例如:物体A使用rigidbody移动物体,物体B使用改变transform.position来移动且在Update中刷新,此时物体B会发生抖动。
原因是物体A的rigidbody刷新是在FixedUpdate()中,而物体B在Update(),刷新频率不同导致感觉物体B抖动
此时解决方法如果不改变物体A的移动方式则需要把物体B的刷新放在FixedUpdate()中
相关文章推荐
- 【Unity3D游戏开发学习笔记】(七)上帝之眼—第三人称摄像机的简单实现(跟随视角,自由视角)
- 基于Unity3D的相机功能的实现(五)—— 相机跟随
- Unity3d实现相机的跟随缩放旋转
- unity3d中实现相机的跟随
- Unity3D第三人称无锁定视角实现
- 相机第三人称视角跟随
- 4000 基于Unity3D的相机功能的实现(六)—— 上帝视角(王者荣耀视角)
- Unity3D第三人称无锁定视角实现
- Unity3D 利用FSM设计相机跟随实现
- 基于Unity3D的相机功能的实现(四)——第三人称相机(TPS)
- unity3d 简单的相机跟随目标
- unity3D鼠标滚轮来实现镜头拉近拉远及视角旋转
- unity3d相机跟随物体平滑移动(C#代码)
- Unity3D游戏场景之控制模型移动、旋转和相机跟随
- 基于Unity3D的相机功能的实现(三)——第一人称相机(FPS)
- Unity3D的NGUI实现血条跟随功能
- Unity3D自学笔记——架构应用(八)人物移动与角色相机的跟随
- unity3d 敌人锥形视角实现的想法
- Unity 相机跟随人物移动而移动,利用插值实现
- 基于Unity3D的相机功能的实现(一)——VR相机