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

感谢大家的支持和关注

相关推荐
仙魁XAN4 小时前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
我要吐泡泡了哦6 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
躺下睡觉~14 小时前
Unity-Transform类-父子关系
java·unity·游戏引擎
躺下睡觉~14 小时前
Unity-Transform类-缩放和看向
unity·游戏引擎
君莫愁。16 小时前
【Unity】检测鼠标点击位置是否有2D对象
unity·c#·游戏引擎
咩咩觉主17 小时前
Unity实战案例全解析:PVZ 植物卡片状态分析
unity·c#·游戏引擎
蓝裕安20 小时前
伪工厂模式制造敌人
开发语言·unity·游戏引擎
谢泽浩1 天前
Unity 给模型贴上照片
unity·游戏引擎
z2014z1 天前
Unity Resource System 优化笔记
unity·游戏引擎
王维志1 天前
Unity 高亮插件HighlightPlus介绍
unity·游戏引擎