Unity3d--实现第三人称视角(相机跟随)

实现第三人称视角有三种:

方案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()中

  • 13
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity中,第三人称跟随视角是一种相机跟随玩家角色的效果,让玩家能够从角色身后或角度上方观察游戏场景。为了实现这一效果,需要进行以下步骤: 1. 首先,我们需要记录相机和角色之间的偏移量。通过获取相机和角色的GameObject,以及计算它们之间的偏移量来实现。例如,可以使用以下代码来记录偏移量: mainCamera = GameObject.Find("Main Camera"); player = GameObject.Find("Player"); offset = -player.transform.position + mainCamera.transform.position; 2. 接下来,我们需要根据偏移量和角色的旋转位置来计算相机的目标位置,并实现相机跟随效果。可以使用以下代码来实现: mainCamera.transform.rotation = Quaternion.Lerp(mainCamera.transform.rotation, player.transform.rotation, 1.0f/LerpCount); mainCamera.transform.position = player.transform.position + mainCamera.transform.rotation * offset; 3. 这样实现的效果是相机会平滑地跟随玩家角色的旋转和移动。相机会在一定时间内旋转到固定位置,最终保持与玩家角色相对位置不变。 需要注意的是,以上代码只是示例,实际使用时可能需要根据具体情况进行调整和优化。同时,还可以根据需求添加额外的功能,如限制相机的移动范围、调整相机的缩放等,以满足游戏的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Unity相机跟随游戏角色移动旋转(第三人称为主)](https://blog.csdn.net/fairen/article/details/119827181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值