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

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

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

相关文章

npm digital envelope routines::unsupported

问题描述&#xff1a;npm运行命令报错&#xff1a;digital envelope routines::unsupported 原因&#xff1a;node版本过高 解决方案&#xff1a;在运行命令之前加上 SET NODE_OPTIONS--openssl-legacy-provider && SET NODE_OPTIONS--openssl-legacy-provider &&a…

阿里云服务器免费6个月,居然又出了企业版

我之前收到了阿里云的免费6个月服务器&#xff0c;现在上面挂着一些网页。 由于带宽只有1M&#xff0c;所以用得不多。 今晚本来打算买台新服务器&#xff0c;发现阿里云6个月免费促销居然出了企业版。 之前只有一个版本。 我手头正好有资源&#xff0c;于是又免费来了一台服…

Eslint在Vscode中使用技巧的相关技巧

ps :该文章会详细记录构建一个脚手架遇到的问题&#xff0c;会持续更新&#xff0c;请定时查看 Eslint相关​ 在vscode中使用eslint插件 在vscode中用户配置没有开启eslint.enable 在vscode中工作区配置开启eslint.enable settings.json中没有做eslint相关配置 在编写的vue…

敏捷方法简介

敏捷方法简介 特点 适应性&#xff0c;应对变化以人为本&#xff0c;发挥人的特性迭代增量式开发&#xff0c;逐版本更新 实践 极限编程 特点 加强交流从简单做起寻求反馈实事求是 水晶系列方法 特点 以人为中心&#xff0c;机动性一组经过证明、对不同类型项目非常有效…

【QT】Qt Charts概述

目录 1 QtCharts模块 2 图表的主要组成部分 2.1 QChartView的功能 2.2 序列 2.3 坐标轴 2.4 图例 3 一个简单的QChart绘图程序 QtCharts是Qt提供的图表模块&#xff0c;在Qt5.7以前只有商业版才有Qt Charts&#xff0c;但是从Qt5.7开始&#xff0c;社区版本也包含了Qt C…

蓝桥杯倒计时41天!DFS进阶1——回溯

DFS进阶1——回溯 先说一下回溯的板子 dfs(){ for(......){标记信息dfs()撤销标记 } }回溯模板——递归实现排列型枚举 题目分析 其实就是对1~n的数字全排列&#xff0c;这里就可以用dfs去做&#xff0c;1~n全排列我其实是确定每一个位置我应该放哪一个数字&#xff0c;那么…

Qt程序设计-解析和生成json详解

目录 概述 JSON的两种结构 解析和生成json 解析对象结构 生成对象结构

【MySQL】mvcc以及三个重要日志

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;【】数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 MVCC关键概念&#xff1a; MVCC机制的优点&#xff1a; 三个重要的日志&#xff1a; 重做日志&#xff1a; 回滚日志&am…

【Java项目介绍和界面搭建】拼图小游戏——打乱图片顺序

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

再次走到了个人发展的十字路口

人生有非常多的十字路口 诸如&#xff1a;大学选择专业、毕业选择公司、选择技术方向、两年发展方向、三年发展方向、五年发展方向。 在之前&#xff0c;我选择深入做elasticsearch&#xff0c;做专精es搜索和优化。做了大概4年时间。 但是现在又走到了很难抉择的十字路口 第…

网络仿真(一)

网络仿真的意义 在网络规划和设计、网络设备研发、网络协议开发中&#xff0c;需要一种手段来反映和预测网络的性能 网络仿真可以提高网络规划设计的可靠性和准确性&#xff0c;明显降低网络投资风险&#xff0c;减少不必要的浪费 Ns-2 is a discrete event simulator Sched…

持安科技亮相张江高科895创业营,总评分第三名荣获「最具创新性企业」!

近日&#xff0c;张江高科895创业营&#xff08;第十三季&#xff09;信息安全专场Demo day&结营仪式在上海集成电路设计产业园圆满落幕。本季创业营通过多种渠道在海内外甄选优秀创业项目&#xff0c;一共择优录取了29家入营&#xff0c;最终甄选出9家代表参加Demo day路演…

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the ‘ssl‘报错解决

安装labelme出错了 根据爆栈的提示信息&#xff0c;我在cmd运行以下命令之后一切正常了&#xff0c;解决了问题&#xff01; pip install urllib31.26.6参考网址&#xff1a;ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ‘ssl’ module is compile…

一文彻底搞懂基于数组和链表分别实现LRU算法

文章目录 1. LRU算法2. 基于数组实现LRU算法3. 基于链表实现LRU算法 1. LRU算法 常见的缓存淘汰策略有三种&#xff0c;分别是&#xff1a;先进先出策略FIFO&#xff08;First In&#xff0c;First Out&#xff09;、最少使用策略LFU&#xff08;Least Frequently Used&#x…

董兆祥出席工业废水资源化,开创变废为宝新途径演讲

演讲嘉宾&#xff1a;董兆祥 董事长 河北奥博水处理有限公司 演讲题目&#xff1a;工业废水资源化&#xff0c;开创变废为宝新途径 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确“低碳经济”新的战略目标&#xff0c;热…

springcloud:3.2测试超时机制

服务提供者 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 PaymentController【控制层】 /*** 测试超时机制** return*/GetMapping("/timeout")public String TimeOut() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {…

应用层DDoS防护:理解、必要性与实现策略

一、应用层简介 应用层&#xff0c;也称作第七层&#xff0c;是OSI&#xff08;开放系统互联&#xff09;模型中的最高层。在这一层&#xff0c;数据以特定的应用程序协议格式进行传输&#xff0c;如HTTP、FTP、SMTP等。应用层的主要职责是为用户提供网络服务&#xff0c;如文…

【笔记】Android Telephony 获取SubscriptionManager和TelephonyManager

背景 早期的手机只有单卡 &#xff0c;基本用默认卡&#xff08;代码如下&#xff09;&#xff0c;那么双卡手机的业务逻辑就会存在问题。 //手动搜网的功能案例&#xff0c;根据卡槽/Phone对象直接获取信息private Context mcontext context; private Phone mPhone PhoneF…

LeetCode 560. 和为 K 的子数组

由于题目要求子数组必须连续&#xff0c;也就是需要一个和为K的区间&#xff0c;可以利用前缀和预处理后&#xff0c;枚举找到这些区间段[l,r]&#xff0c;使之满足s[r] - s[l] k。 不理解前缀和的可以先看这里。 class Solution { public:int subarraySum(vector<int>…

MongoDB聚合运算符:$count

文章目录 语法使用举例在$group阶段中使用在$setWindowFields阶段使用 $count聚合运算符返回分组中文档的数量。从5.0开始支持。 语法 { $count: { } }$count不需要参数 使用 $count可以用于下列聚合阶段&#xff1a; $bucket$bucket$group$setWindowFields 在$group阶段中…