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

news2025/1/21 0:53:13

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

  • 介绍
  • 镜头视角
    • 跟随人物方向进行旋转的镜头视角
    • 固定球和人的镜头视角
  • 思路
    • 跟随人物方向进行旋转的镜头视角
    • 固定球和人的镜头视角
  • 镜头旋转代码
  • 人物移动的参考代码
  • 注意

介绍

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

镜头视角

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

请添加图片描述

固定球和人的镜头视角

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

思路

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

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

固定球和人的镜头视角

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

镜头旋转代码

这里我不做太多的解释了,大家应该都看得懂。
target是相机跟随的目标
football是附属固定的次要目标
offset是相机的高和前后距离
还有两个平滑度参数也可以进行调整
这个直接挂在相机上即可

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);
        }
    }
}

人物移动的参考代码

人物移动的有很多种方式,这里我为了测试用了个比较简单的方式去做,参考一下即可
正常的人物移动是需要按照镜头的方向前进后退等,这里我只是为了方便测试没有写的很细。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1475214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3-1openflow协议原理以及应用(packet包广播风暴)实践

在Mininet中&#xff0c;其自带的控制器是采用是OpenFlow 1.0版本。因此如果在开发中使用mininet内置的控制器&#xff08;使用端口6653&#xff09;&#xff0c;即使拓扑构建和ovs自定义时声明使用openflow13&#xff0c;但是由于采用的控制器版本受限&#xff0c;ovs与控制器…

RV32/64 特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret&#xff08;从机器模式返回到先前的模式&#xff09;2.2 sret&#xff08;从监管模式返回到先前的模式&#xff09;2.3 wfi&#xff08;等待中断&#xff09;2.4 sfence.vma&#xff08;内存屏障&#xff09; …

深度学习 精选笔记(5)多层感知机

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

在Ubuntu22.04 LTS上搭建Kubernetes集群

文章目录 准备工作系统准备软件包准备主机和IP地址准备 安装步骤安装前准备关闭防火墙设置服务器时区关闭 swap 分区关闭SELinux配置hosts配置文件转发 IPv4 并让 iptables 看到桥接流量 安装容器运行时安装Kubernetes配置并安装apt包初始化集群 安装calico网络插件部署应用 本…

iSH使用与优化全网整合教程【持续更新】【精华】

【最后一次更新:2023.4.​​​​​22】 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任&#xff5e; iSH介绍与换源【已安装并已完成…

香港紧缺13个专业人才有哪些?香港优才计划人才清单解读!

香港紧缺13个专业人才有哪些&#xff1f;香港优才计划人才清单解读&#xff01; 香港优才计划是香港的一项人才引进政策&#xff0c;目的是吸纳优秀人才来港发展定居&#xff0c;提高香港的国际竞争力。因此&#xff0c;香港优才跟香港紧缺行业息息相关。 如果是从事香港紧缺行…

Docker 常用操作命令备忘

Docker 一旦设置好了环境&#xff0c;日常就只要使用简单命令就可以运行和停止。 于是&#xff0c;我每次用的时候&#xff0c;都想不起来一些关键性的命令到底怎么用&#xff0c;特此记录。 一、镜像管理 从公有仓库拉取镜像 &#xff08;对于使用苹果电脑 M1/M2/M3 芯片的 …

Rust调用同级目录中的rs文件和调用下级目录中的rs文件

一、Rust调用同级目录中的rs文件 Rust新建工程demo02&#xff0c;src文件夹下面新建test.rs文件&#xff0c;这样main.rs文件与它属于同级目录中。 关键点&#xff1a;导入test文件和test文件中的Ellipse模块 mod test;//导入test模块&#xff08;文件&#xff09; use test…

Java学习--学生管理系统(残破版)

代码 Main.java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<Student> list new ArrayList<>();loop:while (true) {System.out.println("-----欢迎来到阿宝院校学生管理系…

一拎即走的轻薄云台投影,极米投影仪Z7X让生活幸福加倍

随着家用智能投影性能的不断升级&#xff0c;拥有便携、易用、护眼以及大屏等优势的智能投影仪已经逐步取代传统电视机&#xff0c;成为越来越多年轻人在租房、装修新家购置新电器时的第一选择。市面上的投影仪产品多如牛毛&#xff0c;对于刚接触投影仪的新手来说&#xff0c;…

iMazing2024汉化免费版苹果设备管理软件功能详解

一、软件简介 iMazing&#xff0c;被誉为Mac和PC上最佳的iOS设备管理软件&#xff0c;以其全面而细致的功能&#xff0c;赢得了全球苹果用户的喜爱。无论是备份恢复、文件传输还是设备管理&#xff0c;iMazing都能提供高效、安全、便捷的服务体验。 iMazing3Mac-最新绿色安装包…

全面升级!Apache HugeGraph 1.2.0版本发布

图数据库以独特的数据管理和分析能力&#xff0c;在企业数智化转型的过程中正在成为数据治理的核心&#xff0c;根据IDC调研显示&#xff0c;95%的企业认为图数据库是重要的数据管理工具&#xff0c;超过65%的厂商认为在业务上图数据库优于其他选择&#xff0c;尤其是在金融风控…

2024 值得推荐的免费开源 WAF

WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。区别于传统防火墙&#xff0c;WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击。 开源 WAF 和商用 WAF&#xff08;奇安信…

气体反应瓶适用光伏光电半导体坚固耐用PFA缓冲瓶

PFA冲击瓶&#xff0c;别名特氟龙缓冲瓶、可溶性聚四氟乙烯气体反应瓶。用于气体、固体或液体间的反应实验&#xff0c;广泛应用于光电、新材料、新能源、半导体、地矿、冶金、核工业等行业。 PFA冲击瓶相对于其他材质的反应瓶&#xff0c;不易碎&#xff0c;使用更加安全&…

星瑞格新篇:SinoDB V16.8启幕,技术盛宴

喜讯传来&#xff0c;令人心悦&#xff01;SinoDB V16.8版&#xff0c;如春风之翩翩&#xff0c;向众用户及开发者扬帆起航。此版相关技术&#xff0c;均于星瑞格社区(https://forum.sinoregal.cn/ )说明&#xff0c;社区之主页&#xff0c;设“试用活动”栏&#xff0c;以聚众…

【亚马逊云】跨AWS账号创建复制规则同步S3存储桶中的数据

文章目录 注意事项一、创建存储桶【创建方&接收方完成操作】二、上传数据至bucket-transmit待同步测试三、创建复制规则【创建方完成操作】四、接收复制的对象【接收方完成操作】五、创建复制任务【创建方操作】六、运行批处理操作【创建方完成操作】七、检查是否完成跨账号…

使用ffmpeg压缩视频

一、到ffmpeg官网下载文件包&#xff1a; Download FFmpeg 下载后找到 bin 下的3个exe文件&#xff0c;复制到自己本机的某个目录下, 如&#xff1a; 二、使用命令行压缩&#xff1a; ffmpeg -i input.mp4 -c:v libx265 -crf 28 -y output.mp4 这条命令使用 FFmpeg 工具对输…

【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(1)

1.model.py import torch.nn as nn import torch.nn.functional as F引入pytorch的两个模块 关于这两个模块的作用&#xff0c;可以参考下面 Pytorch官方文档 torch.nn包含了构成计算图的基本模块 torch,nn.function包括了计算图中的各种主要函数&#xff0c;包括&#…

等保2.0高风险项全解析:判定标准与应对方法

引言 所谓高风险项&#xff0c;就是等保测评时可以一票否决的整改项&#xff0c;如果不改&#xff0c;无论你多少分都会被定为不合格。全文共58页&#xff0c;写得比较细了&#xff0c;但是想到大家基本不会有耐心去仔细看的&#xff08;凭直觉&#xff09;。这几天挑里边相对…

全新抖音视频下载软件|批量视频下载工具

随着抖音平台上精彩视频的不断涌现&#xff0c;许多用户希望能够方便地保存自己喜欢的视频内容&#xff0c;以便随时观看或分享给朋友。为了满足这一需求&#xff0c;我们基于C#开发了一款全新的视频下载软件&#xff0c;为您提供便捷、高效的视频获取体验。 主要功能模块&…