Unity的滑动控制相机跟随和第三人称视角三

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

  • 第三人称相机优化
  • 介绍
  • 讲解
  • 拖动事件
  • 相机逻辑
  • 人物移动逻辑
  • 总结

第三人称相机优化

Unity第三人称相机视角一
Unity第三人称相机视角二

介绍

之前相机视角讲过了两篇文章了,但是都是自动旋转视角,今天来了新需求,自动视角的时候,人没办法看全场上所有的景象,所以可以自己控制相机的视口方向,说白了就是做一个拖拽事件,再根据拖动的大小来控制相机视口旋转量,这样就完成了相机的可控视口旋转。
请添加图片描述

讲解

我上面的那个Gif可以看到,我创建了一个有拖动事件的UI,开始拖拽,拖拽中,结束拖拽。
在开始的时候我们采集他的开始拖拽点,然后在拖拽中进行插值运算计算进行镜头的左右旋转。
这个Gif里面我代码也加入了原来的人物中心点的位移,比如偏左一点或者偏右一点又或者是在正中心,这里我所使用的是Dotween这个插件,这里按键Q是切换镜头,ERT是镜头左侧,右侧,正中心的设置按键。

拖动事件

这里创建了一个UI来继承拖拽事件,可以把这个UI的透明通道调整到看不到的程度,我这里是为了大家方便看到我没有设置为0。

在这里插入图片描述MoveTouch.cs

using UnityEngine;
using UnityEngine.EventSystems;public class MoveTouchTest : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{/// <summary>/// 跟随相机/// </summary>public FollowCameraTest followCameraTest;/// <summary>/// 是否在拖拽中/// </summary>public bool IsDrag = false;/// <summary>/// 开始位置/// </summary>private float startPosX;/// <summary>/// 旋转的角度/// </summary>public float angle = 1;public void OnBeginDrag(PointerEventData eventData){IsDrag = true;startPosX = eventData.position.x;}public void OnDrag(PointerEventData eventData){if (!followCameraTest.IsHasBall) return;if (!IsDrag) return;followCameraTest.transform.localEulerAngles += new Vector3(0, (eventData.position.x - startPosX) * angle, 0);startPosX = eventData.position.x;}public void OnEndDrag(PointerEventData eventData){IsDrag = false;}private void OnEnable(){IsDrag = false;}private void OnDisable(){IsDrag = false;}
}

相机逻辑

我用电脑测试的所以下面代码加了个鼠标滚轮控制镜头的旋转。

FollowCameraTest .cs

using DG.Tweening;
using Unity.VisualScripting;
using UnityEngine;public class FollowCameraTest : MonoBehaviour
{public Transform target; // 要跟随的目标对象public Transform football; // 其次要跟随的目标public Vector3 camPosOffset = new Vector3(0, 1.5f, -5);   // 相机与目标之间的距离偏移量public Vector3 camEulerOffset = new Vector3(6, 0, 0);   // 相机与目标之间的距离偏移量public float smoothSpeed = 0.05f; // 相机跟随平滑度public float rotateSpeed = 0.08f; // 相机旋转平滑度public float fov = 45;public bool IsHasBall = true;public Camera m_cam;public float moveTime = 1f;public float angle = 5;private void Start(){m_cam.transform.localPosition = camPosOffset;m_cam.transform.localEulerAngles = camEulerOffset;transform.position = target.transform.position;m_cam.fieldOfView = fov;}public void LateUpdate(){if (target == null) return;if (Input.GetKeyDown(KeyCode.Q)) {IsHasBall = !IsHasBall;}if (Input.GetKeyDown(KeyCode.E)) {if (m_cam != null) m_cam.transform.DOLocalMoveX(-1, moveTime);}if (Input.GetKeyDown(KeyCode.R)){if (m_cam != null) m_cam.transform.DOLocalMoveX(1, moveTime);}if (Input.GetKeyDown(KeyCode.T)){if (m_cam != null) m_cam.transform.DOLocalMoveX(0, moveTime);}//相机缓动过程transform.position = Vector3.Lerp(transform.position, target.transform.position, smoothSpeed);if (IsHasBall){//这里我用的电脑方便测试加了一个滚轮的方式去旋转镜头,需要可以打开 不需要就不用管//float mouseWheel = Input.GetAxis("Mouse ScrollWheel");//transform.localEulerAngles += mouseWheel * angle * Vector3.up;}else{Vector3 tar = ((target.position + football.position) * 0.5f - target.transform.position).normalized;tar.y = 0;transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(tar), rotateSpeed);}}
}

人物移动逻辑

RoleCtrlTest.cs

using UnityEngine;public class RoleCtrlTest : MonoBehaviour
{public float moveSpeed = 5f; // 人物移动速度public float rotateSpeed = 5f;public FollowCameraTest followCamera;void Update(){Vector3 moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));moveDir = RotateRound(moveDir, Vector3.zero, Vector3.up, followCamera.transform.localEulerAngles.y);if (followCamera.IsHasBall){transform.position += moveDir * moveSpeed * Time.deltaTime;transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(moveDir), rotateSpeed);}else{if (moveDir == Vector3.zero) return;transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(moveDir), rotateSpeed);transform.position += transform.forward * moveSpeed * Time.deltaTime;}}protected Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle){Vector3 point = Quaternion.AngleAxis(angle, axis) * (position - center);Vector3 resultVec3 = center + point;return resultVec3;}
}

总结

对比之前自动旋转的,这个版我觉着会更舒服一些,因为这个版的镜头更加可控制一些,但是这个也会让你操作变得复杂,无疑增加了一种操作负担。

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

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

相关文章

支部管理系统微信小程序(管理端+用户端)flask+vue+mysql+微信小程序

系统架构如图所示 高校D支部管理系统 由web端和微信小程序端组成&#xff0c;由web端负责管理&#xff0c;能够收缴费用、发布信息、发布问卷、发布通知等功能 部分功能页面如图所示 微信小程序端 包含所有源码和远程部署&#xff0c;可作为毕设课设

Java 数据结构之链表

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA null || headB null) return null;ListNode pA headA, pB headB;while (pA ! pB) {pA pA null ? headB : pA.next;pB pB null ? headA : pB.next;}return pA;} public ListNode rev…

数据库系列之:什么是 SAP HANA?

数据库系列之&#xff1a;什么是 SAP HANA&#xff1f; 一、什么是 SAP HANA&#xff1f;二、什么是内存数据库&#xff1f;三、SAP HANA 有多快&#xff1f;四、SAP HANA 的十大优势五、SAP HANA 架构六、数据库设计七、数据库管理八、应用开发九、高级分析十、数据虚拟化 一、…

1-安装rabbitmq

rabbitmq官网&#xff1a; https://www.rabbitmq.com/docs/download 本机环境&#xff1a;mac&#xff0c;使用orbstack提供的docker 使用docker部署rabbitmq docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management 然后报错&#xf…

信息安全服务规范包括哪些方面

信息安全服务规范是确保信息系统安全稳定运行的重要指导原则和操作准则。在信息化高速发展的今天&#xff0c;信息安全已经成为国家、企业乃至个人不可忽视的重要议题。因此&#xff0c;制定和执行信息安全服务规范对于保障信息安全、维护社会秩序具有重要意义。 信息安全服务规…

VScode+Zotero+Latex文献引用联动

一、VScodeLatex联动 1、VScode的安装 2、texlive.iso安装 可以参考以下&#xff0c;也可以忽略所有直接一步一步默认安装 https://zhuanlan.zhihu.com/p/442308176 3、Vscode的插件安装&#xff1a;【latex workshop】 4、打开设置&#xff0c;搜索json&#xff0c;然后点击…

MIT 6.S081---Lab: Multithreading

Uthread: switching between threads (moderate) 修改uthread.c&#xff0c;在thread中新增context字段&#xff1a; 修改uthread.c&#xff0c;在thread_create函数中新增以下逻辑&#xff1a; 修改uthread.c中的thread_switch函数定义&#xff1a; 修改uthread.c中的th…

你不得不知道的Python AI库

Python是人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;领域中使用最广泛的编程语言之一&#xff0c;拥有丰富的库支持各种AI和ML任务。本文介绍一些经典的Python AI库。 1. NumPy 简介&#xff1a;NumPy&#xff08;Numerical Python&#xff09;…

centos7中python3.10找不到openssl解决方案

如果有用其他方法安装了其他版本openssl&#xff0c;记得卸载其他的openssl&#xff0c;删除其他的openssl相关文件。 yum remove openssl* rm -rf ***下载最新版的openssl文件 按照官网安装方法安装openssl 官方安装地址https://docs.python.org/3/using/unix.html#on-linu…

代码随想录算法训练营第13天

239. 滑动窗口最大值 &#xff08;一刷至少需要理解思路&#xff09; 方法&#xff1a;暴力法 &#xff08;时间超出限制&#xff09; 注意&#xff1a; 代码&#xff1a; class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k…

数据分析方法(一)|认知数据

在进行数据分析时&#xff0c;很多人拿到数据之后没有头绪&#xff0c;在没有需求的情况下不知道从何做起&#xff0c;此时我们不妨先动起脑来理解数据。 分析数据之前&#xff0c;清晰的认识数据是非常重要的&#xff0c;通常我们可以从以下几个角度对数据进行深入了解&#x…

推荐5款极具效率的实用工具软件

​ 每次分享实用的软件,都会给人一种踏实和喜悦的感觉,这也是我热衷于搜集和推荐高效工具软件的原因。 1.个人日记软件——EDiary ​ EDiary是一款功能丰富的个人日记软件&#xff0c;用户可以在不联网的状态下使用&#xff0c;保护隐私。它支持日记、记事本、日历、事件提醒…

word如何实现不同章节显示不同页眉

一、问题描述 写论文时遇到如下情形&#xff0c;第二章页眉跟第一章一样&#xff0c;如下图 二、解决方法 在第二章前一页空白处&#xff0c;选择依次布局→分隔符→下一页&#xff0c;如下图 双击第二章页眉&#xff0c;进入页眉编辑状态&#xff0c;点击链接到前一节按钮&a…

chrome浏览器插件content.js和background.js还有popup都是什么,怎么通讯

popup 在用户点击扩展程序图标时&#xff08;下图中的下载图标&#xff09;&#xff0c;都可以设置弹出一个popup页面。而这个页面中自然是可以包含运行的js脚本的&#xff08;比如就叫popup.js&#xff09;。它会在每次点击插件图标——popup页面弹出时&#xff0c;重新载入。…

Spring之Bean详解

Spring之Bean详解 什么是Bean&#xff1f; 在Spring中&#xff0c;Bean是指由Spring容器管理的对象&#xff0c;这些对象是由Spring IoC容器负责创建、组装和管理的。Bean可以是Java类的实例&#xff0c;也可以是其他Spring管理的组件&#xff0c;例如数据源、事务管理器等。…

FPGA——三速自适应以太网设计(2)GMII与RGMII接口

FPGA——以太网设计&#xff08;2&#xff09;GMII与RGMII 基础知识&#xff08;1&#xff09;GMII&#xff08;2&#xff09;RGMII&#xff08;3&#xff09;IDDR GMII设计转RGMII接口跨时钟传输模块 基础知识 &#xff08;1&#xff09;GMII GMII:发送端时钟由MAC端提供 下…

NextJs教程系列(三):路由layout

可复用的布局 Next.js的layout是一个可复用的布局&#xff0c;不同的子页面可以共享布局容器&#xff0c;页面跳转时&#xff0c;layout容器不会重新渲染。 children props export default function RootLayout({ children }) {return (<html lang"en"><…

怎么做加密文件二维码?分享文件更安全

怎么做一个加密文件二维码&#xff1f;在日常的工作和生活中&#xff0c;通过扫描二维码来查看或者下载文件的方式&#xff0c;被越来越多的人所使用&#xff0c;一方面是二维码的成本低&#xff0c;另一方面有利于提升便捷性和用户体验。 为了保证内容的隐私性和安全性&#…

【XR806开发板试用】串口驱动JQ8900播放音乐

一、硬件连接 1.JQ8900引脚定义 通过阅读JQ8900的数据手册&#xff0c;可以了解到驱动JQ8900有许多种方式&#xff0c;IO驱动&#xff0c;一线串口驱动&#xff08;VPP&#xff09;&#xff0c;两线串口驱动&#xff08;RX&#xff0c;TX&#xff09;&#xff0c;这里我使用两…

Unity性能优化篇(八) 导入的模型网格优化设置

模型导入Unity后&#xff0c;可以选中这个模型&#xff0c;在Inspector窗口设置它的属性。下面说的都是可自定义选择优化的地方 Model选择卡: 1.在Model选项卡&#xff0c;启用Mesh Compression可以压缩模型&#xff0c;压缩程度越高&#xff0c;模型精度越低&#xff0c;但是…