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 插件,其实还有很多也不举例子了,因为插件想要符合多种镜头模式需要长时间经历注入,所以我选择了手写一个。

感谢大家的支持和关注

相关推荐
虾球xz10 分钟前
游戏引擎学习第11天
stm32·学习·游戏引擎
许许前进38 分钟前
问题本记录(2):Unity+机器学习
unity·游戏引擎
虾球xz2 小时前
游戏引擎学习第10天
学习·游戏引擎
_乐无12 小时前
Unity 性能优化方案
unity·性能优化·游戏引擎
明明明h15 小时前
Unity Assembly Definition & Assembly Definition Reference
unity·游戏引擎
龙中舞王15 小时前
Unity学习笔记(4):人物和基本组件
笔记·学习·unity
无敌最俊朗@18 小时前
unity3d————协程原理讲解
开发语言·学习·unity·c#·游戏引擎
夜色。18 小时前
Unity6 + Android Studio 开发环境搭建【备忘】
android·unity·android studio
这不比博人传燃?1 天前
传奇996_19——常用函数
游戏引擎
erxij1 天前
【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看
c++·经验分享·游戏·3d·游戏引擎