Unity的相机跟随和第三人称视角

Unity相机跟随和第三人称视角

介绍

最近足球项目的镜头在做改动,观察了一下实况足球的视角,发现他有多种镜头模式,带球时跟随人物进行旋转的第三人称视角,不带球时镜头锁定人和球都能看到的视角,其实还有很多镜头视角,这里我主要选择这两个来讲一下做一个demo。(我这里的demo不会做的很细大概做一个出来,他的镜头很细致细致到旋转多少度才会有反馈,并不是实时旋转反馈的)

镜头视角

跟随人物方向进行旋转的镜头视角

固定球和人的镜头视角

这里大家可以参考一下,因为如果要做细致的话其实还有很多需要写的地方,这里我也只是做了个简单的demo给需要类似这种镜头的伙伴一个思路。

思路

跟随人物方向进行旋转的镜头视角

参考我上面的这个gif,其实可以观察的出来,其实相机的是始终在你控制的人物正后上方,这样只需要计算出来相机应该在的位置,然后用现在的位置与最终的位置做一个lerp差值移动,缓慢移动到最终位置。

固定球和人的镜头视角

根据上面的图我们大概可以看出来,相机是始终以球和人为中心,转向也始终是球和人,相机的位置这里就是球到人连线的后方,旋转方向也是这个反向量,这块也很好理解。

镜头旋转代码

这里我不做太多的解释了,大家应该都看得懂。

target是相机跟随的目标

football是附属固定的次要目标

offset是相机的高和前后距离

还有两个平滑度参数也可以进行调整

这个直接挂在相机上即可

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowCamera : MonoBehaviour
{
    public Transform target; // 要跟随的目标对象
    public Transform football; // 其次要跟随的目标
    public Vector2 offset = new Vector2(2, 5);   // 相机与目标之间的偏移量
    public float smoothSpeed = 0.125f; // 相机跟随平滑度
    public float rotateSpeed = 0.125f;

    public bool IsHasBall = true;


    void LateUpdate()
    {
        if (target == null)
            return;

        if (Input.GetKeyDown(KeyCode.Q)) 
        {
            IsHasBall = !IsHasBall;
        }

        if (IsHasBall)
        {
            Vector3 desiredPosition = target.position + Vector3.up * offset.y - target.forward * offset.x;
            Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
            transform.position = smoothedPosition;

            // 获取目标对象的正前方
            Vector3 lookDirection = target.forward;
            // 使用 Quaternion.LookRotation 方法计算相机的旋转方向
            Quaternion targetRotation = Quaternion.LookRotation(lookDirection);
            // 应用旋转
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotateSpeed);
        }
        //没有球的状态
        else
        {
            //自身到足球的单位向量
            Vector3 dir = (target.position - football.position).normalized;
            Vector3 desiredPosition = target.position + Vector3.up * offset.y + dir * offset.x;
            Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
            transform.position = smoothedPosition;

            //足球设置位置
            //求出自己和球的中点,让相机朝向这个中点
            Vector3 tar = ((target.position + football.position) * 0.5f - smoothedPosition).normalized;

            // 获取目标对象的正前方
            Vector3 lookDirection = tar;

            // 使用 Quaternion.LookRotation 方法计算相机的旋转方向
            Quaternion targetRotation = Quaternion.LookRotation(lookDirection);
            // 应用旋转
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotateSpeed);
        }
    }
}

人物移动的参考代码

人物移动的有很多种方式,这里我为了测试用了个比较简单的方式去做,参考一下即可

正常的人物移动是需要按照镜头的方向前进后退等,这里我只是为了方便测试没有写的很细。

csharp 复制代码
using UnityEngine;

public class RoleCtrlTest : MonoBehaviour
{
    public float moveSpeed = 5f; // 人物移动速度
    public float rotationSpeed = 180f; // 人物转向速度


    void Update()
    {
        // 获取玩家的输入
        float moveHorizontal = Input.GetAxis("Horizontal");

        if (moveHorizontal == 0)
        {
        }
        else if (moveHorizontal > 0)
        {
            transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);
        }
        else if (moveHorizontal < 0)
        {
            transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(transform.forward * moveSpeed * Time.deltaTime, Space.World);
            transform.position += transform.forward * moveSpeed * Time.deltaTime;
        }
    }
}

注意

镜头其实还有很多的插件可以使用,比如Cinemachine 插件,其实还有很多也不举例子了,因为插件想要符合多种镜头模式需要长时间经历注入,所以我选择了手写一个。

感谢大家的支持和关注

相关推荐
90后小陈老师7 小时前
Unity教学 项目2 2D闯关游戏
游戏·unity·游戏引擎
噗噗夹的TA之旅8 小时前
Unity Shader 学习20:URP LitForwardPass PBR 解析
学习·unity·游戏引擎·图形渲染·技术美术
nnsix8 小时前
Unity ReferenceFinder插件 多选资源查找bug解决
unity·游戏引擎·bug
gzroy9 小时前
Unity Shader Graph实现全息瞄准器
unity·游戏引擎
90后小陈老师12 小时前
Unity教学 基础介绍
unity·游戏引擎
90后小陈老师12 小时前
Unity教学 项目3 3D坦克大战
3d·unity·游戏引擎
秦奈14 小时前
Unity复习学习随笔(五):Unity基础
学习·unity·游戏引擎
nnsix15 小时前
Unity ReferenceFinder插件 窗口中选择资源时 同步选择Assets下的资源
java·unity·游戏引擎
麷飞花16 小时前
unity3d scene窗口选中物体, 在 hierarchy高光显示
unity·editor·unity3d·u3d·hierarchy
ۓ明哲ڪ17 小时前
Unity功能——关闭脚本自动编译(Unity2021.3)
unity·游戏引擎