Unity的相机跟随和第三人称视角
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插件,其实还有很多也不举例子了,因为插件想要符合多种镜头模式需要长时间经历注入,所以我选择了手写一个。
感谢大家的支持和关注
相关文章:
Unity的相机跟随和第三人称视角
Unity相机跟随和第三人称视角 介绍镜头视角跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 思路跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 镜头旋转代码人物移动的参考代码注意 介绍 最近足球项目的镜头在做改动,观察了一下实况足球的视角&#x…...
哪个超声波清洗机品牌值得入手?销量榜品牌值得选购!
在科技日益发展的今天,超声波清洗技术以其高效、便捷和深度清洁的特点,已经深入到生活的诸多领域,从精密仪器到珠宝首饰,从眼镜框到假牙,甚至是厨房用品的日常护理,都能见到超声波清洗机的身影。面对市场上…...
Stwo:基于Circle STARK和M31的下一代STARK证明系统
1. 引言 StarkWare团队和Polygon Labs团队,历时数月,构造了基于Mersenne素数域M31的Circle STARK协议,通过使用M31 over a circle,可基于任意有限域构造高效STARKs,具体见2024年2月19日论文《Circle STARKs》。 基于…...
笔记本以太网集线器Hub充电可能导致网络异常(貌似是我把服务器网关写错了)
文章目录 笔记本以太网集线器(Hub)充电导致网络异常概述原理分析电源与信号干扰设备热度设备兼容性问题 解决方案升级固件提高设备散热效率选择兼容性好的设备 总结 今天用笔记本以太网直连服务器,一开始能连通,结果以太网hub插上…...
npm ERR! code ETIMEDOUT
在新建vue项目的时候报错 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/vue%2fcli failed, reason: connect ETIMEDOUT 104.16.2.35:443 npm ERR! network This is a problem relate…...
动态规划(算法竞赛、蓝桥杯)--分组背包DP
1、B站视频链接:E16 背包DP 分组背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数 int f[N][N]; // f[i,j]:前i组物品,能放…...
太阳能供电井盖-物联网智能井盖监测系统-旭华智能
在这个日新月异的科技时代,城市的每一个角落都在悄然发生变化。而在这场城市升级的浪潮中,智能井盖以其前瞻性的科技应用和卓越的安全性能,正悄然崭露头角,变身马路上的智能“眼睛”,守护城市安全。 传统的井盖监测系统…...
贪心 Leetcode 455 分发饼干
分发饼干 Leetcode 455 学习记录自代码随想录 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸࿱…...
策略开发:EMA如何计算
EMA的计算原理 EMA 是MA(平滑移动平均线)的另一种形式。全名“加权指数移动平均线”。 2/13就是12日移动平均线的平滑因子,他的意思是指:给予新价格 2/13的权重,给予过去的EMA 11/13的权重。 在计算的时候第一天的M…...
学习Android的第二十天
目录 Android Toast 吐司 常量 常用方法 例子 Android Notification 状态栏通知 Notification 的基本布局 扩展布局 Notification ( 状态栏通知 ) 相关的方法 例子: 参考文档 Android AlertDialog 弹出框 Android Dialog 继承图谱 AlertDialog 几种常…...
Linux技巧|centos7|重新认识和学习egrep和grep命令
前言: 相信提高文本检索工具,大家脑海里肯定有很多工具会自动跳出来,比如,grep,egrep,sed,cat,more,less,cut,awk,vim,vi…...
css实现背景渐变叠加
线性渐变效果图: .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#fff 30%),linear-gradient(to right,pink,skyblue);}径像渐变效果图: .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#…...
Unity(第二十四部)UI
在游戏开发中,用户界面(UI)是至关重要的一部分。它负责与玩家进行交互,提供信息,并增强游戏的整体体验。Unity 提供了强大的工具和功能来创建和管理 UI。 ui的底层就是画布,创建画布的时候会同时创建一个事…...
VSCode通过SSH连接Docker环境进行开发
文章目录 VSCode 插件Docker 镜像构建镜像部署环境 VSCode 连接本地Docker容器VSCode SSH连接Docker容器VSCode 打开容器内目录文件 VSCode 插件 Remote - SSH Docker 镜像 https://hub.docker.com/_/golang # Golang 镜像 docker pull golang:1.22构建镜像 Dockerfile F…...
【QT】QTableView或QTableWidget 搭配QLineEdit实现数据的搜索显示
在 Qt 中,QTableView 和 QTableWidget 都可以用来实现数据的搜索和显示,但它们的适用场景和实现方式有所不同: QTableView 适用场景:QTableView 适用于更复杂的场景,尤其是当需要处理大量数据或需要高度定制化的表格时…...
Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1
🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 编辑...
快速幂(c++题解)
题目描述 我们通常把a的b次方记作a^b,为了方便,我们经常直接使用C内置函数pow(a,b)来完成这个工作,但a的b次方就是把a垒乘b次,时间复杂度为O(b),当b值很大时,将会耗去大量时间,所以请同学们不能…...
C#单向链表实现:Append,Move,Delete,InsertAscending, InsertUnAscending,Clear
目录 一、链表定义 二、链表设计 1.先定义一个结点类(Node) 2.再定义链表类(LinkedList)并依次设计其方法 3.再实现删除方法 4.再实现Insert 的方法 5.再增加InsertAscending升序插入 6.再增加 InsertUnAscending 的方法…...
python基础-基本数据类型深入-2.1
目录 元组 什么是元组(tuple) 元组练习-1 元组的基本操作 元组常用内建函数 列表和元组的区别与总结 元组练习-2 元组练习-3 元组 什么是元组(tuple) 与列表(list)一样,元组࿰…...
Android LiveData Cannot add the same observer with different lifecycles
https://www.yxhuang.com/2022/05/29/livedata-add-some-observer-error/ 这篇文章已经解释的很好了。 其实在去年我写的文章, https://blog.csdn.net/jzlhll123/article/details/126593235 中提到了, 其实不论是java或者kotlin,不引用外部的…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
华为OD机考- 简单的自动曝光/平均像素
import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...
docker容器互联
1.docker可以通过网路访问 2.docker允许映射容器内应用的服务端口到本地宿主主机 3.互联机制实现多个容器间通过容器名来快速访问 一 、端口映射实现容器访问 1.从外部访问容器应用 我们先把之前的删掉吧(如果不删的话,容器就提不起来,因…...
