Unity 旋转跟随

Unity 使用任意一个局部轴指向目标

效果:

主要用于在编辑器中可视化对象的朝向,同时提供了选择不同轴向的功能。在运行时,物体将根据所选择的轴向朝向目标,并在 Scene 视图中绘制一个带箭头的圆环。
请添加图片描述

定义轴向枚举:

public enum OnlyAxis
{x_Axis,y_Axis,z_Axis
}
  • 这是一个用于表示轴向的枚举,包括 x 轴、y 轴和 z 轴。

定义变量:

public Transform target; // 要指向的目标物体
[Header("追踪轴向")]
public OnlyAxis Axis = OnlyAxis.x_Axis; // 选择旋转的轴向
private OnlyAxis CurrentAxis = OnlyAxis.x_Axis; // 当前轴向
  • target: 用于指定需要朝向的目标物体。
  • Axis: 用于在 Inspector 窗口中选择旋转的轴向。
  • CurrentAxis: 用于在运行时跟踪当前的轴向。

主要计算:

private void Update()
{SetAxis(Axis);// 获取目标方向Vector3 targetDirection = target.position - transform.position;Vector3 RotateAxis = transform.up;// 根据选择的轴向,获取目标方向在对应轴上的投影Vector3 axisDirection = Vector3.zero;switch (CurrentAxis){case OnlyAxis.x_Axis:axisDirection = Vector3.ProjectOnPlane(targetDirection, transform.right);break;case OnlyAxis.y_Axis:axisDirection = Vector3.ProjectOnPlane(targetDirection, transform.up);break;case OnlyAxis.z_Axis:axisDirection = transform.forward;Vector3 dirTemp = transform.forward.normalized;RotateAxis = Vector3.ProjectOnPlane(targetDirection, dirTemp);break;}// 计算旋转角度Quaternion newRotation = Quaternion.LookRotation(axisDirection, RotateAxis);transform.rotation = newRotation;
}
  • SetAxis 方法用于在运行时更新 CurrentAxis,确保在不同的轴向之间正确切换。
  • 在 Update 方法中,获取目标方向,并根据当前选择的轴向计算相应的旋转。最后,将物体的旋转设为新的旋转。

OnDrawGizmosSelected 方法(仅在编辑器中生效):

#if UNITY_EDITORprivate void OnDrawGizmosSelected(){DrawCircle();}public bool is3DDraw = false;public float radius = 0.1f;public float arrowLength = 0.01f;int segments = 20;private void DrawCircle(){float Radius = is3DDraw ? radius : radius * Vector3.Distance(transform.position, SceneView.lastActiveSceneView.camera.transform.position);float ArrowLength = is3DDraw ? arrowLength : arrowLength * Vector3.Distance(transform.position, SceneView.lastActiveSceneView.camera.transform.position);Gizmos.color = Color.green;Vector3 center = transform.position;Quaternion rotation = transform.rotation;float angleIncrement = 360f / segments;for (int i = 0; i < segments; i++){float angle = i * angleIncrement;Vector3 point = Vector3.zero;float nextAngle = (i + 1) * angleIncrement;Vector3 nextPoint = Vector3.zero;// 根据所选轴向,调整旋转switch (Axis){case OnlyAxis.x_Axis:point = center + rotation * Quaternion.Euler(angle, 0, 0) * (Vector3.up * Radius);nextPoint = center + rotation * Quaternion.Euler(nextAngle, 0, 0) * (Vector3.up * Radius);if (i == 0){Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(angle + angleIncrement / 2, 0, 0) * (Vector3.up * (Radius + ArrowLength)));Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(angle + angleIncrement / 2, 0, 0) * (Vector3.up * (Radius - ArrowLength)));}break;case OnlyAxis.y_Axis:point = center + rotation * Quaternion.Euler(0, angle, 0) * (Vector3.right * Radius);nextPoint = center + rotation * Quaternion.Euler(0, nextAngle, 0) * (Vector3.right * Radius);if (i == 0){Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, angle + angleIncrement / 2, 0) * (Vector3.right * (Radius + ArrowLength)));Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, angle + angleIncrement / 2, 0) * (Vector3.right * (Radius + -ArrowLength)));}break;case OnlyAxis.z_Axis:point = center + rotation * Quaternion.Euler(0, 0, angle) * (Vector3.right * Radius);nextPoint = center + rotation * Quaternion.Euler(0, 0, nextAngle) * (Vector3.right * Radius);if (i == 0){Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, 0, angle + angleIncrement / 2) * (Vector3.right * (Radius + ArrowLength)));Gizmos.DrawLine(nextPoint, center + rotation * Quaternion.Euler(0, 0, angle + angleIncrement / 2) * (Vector3.right * (Radius + -ArrowLength)));}break;}if (i != 1) Gizmos.DrawLine(point, nextPoint);}}
#endif
  • OnDrawGizmosSelected 方法用于在 Scene 视图中绘制圆环。
  • DrawCircle 方法根据选择的轴向,绘制一个圆环并在第一个点上画一个箭头。

点击下载Demo

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

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

相关文章

一起玩儿物联网人工智能小车(ESP32)——13. 用ESP32的GPIO控制智能小车运动起来(一)

摘要&#xff1a;本文更深入的讲述了GPIO的相关知识&#xff0c;并完成了导线连接工作&#xff0c;为下一步的软件开发做好了准备。 通用输入输出端口&#xff08;GPIO&#xff1a;General Purpose Input/Output Port&#xff09;&#xff0c;在前面已经有了初步的介绍&#xf…

三天吃透Spring面试八股文

目录&#xff1a; Spring的优点Spring 用到了哪些设计模式&#xff1f;什么是AOP&#xff1f;AOP有哪些实现方式&#xff1f;Spring AOP的实现原理JDK动态代理和CGLIB动态代理的区别&#xff1f;Spring AOP相关术语Spring通知有哪些类型&#xff1f;什么是IOC&#xff1f;IOC的…

svn外网打不开url地址怎么解决

在家或者出差在外经常会有连接到公司内部SVN服务器的需求&#xff0c; 但是 svn外网打不开url地址怎么解决&#xff1f;如何才能连接到公司内部SVN服务器&#xff1f;今天小编教你一招&#xff0c;在本地SVN服务的内网IP端口用快解析软件添加映射&#xff0c;一步就可以提供让公…

缺失的第一个正数(LeetCode 41)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力4.2 排序4.3 哈希表4.4 空间复杂度为 O(1) 的哈希表4.5 置换 参考文献 1.问题描述 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级…

WPF Button使用漂亮 控件模板ControlTemplate 按钮使用控制模板实例及源代码 设计一个具有圆角边框、鼠标悬停时颜色变化的按钮模板

续前两篇模板文章 模板介绍1 模板介绍2 WPF中的Button控件默认样式简洁&#xff0c;但可以通过设置模板来实现更丰富的视觉效果和交互体验。按钮模板主要包括背景、边框、内容&#xff08;通常为文本或图像&#xff09;等元素。通过自定义模板&#xff0c;我们可以改…

会议室占用时间段 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间, 格式为: [[会议1开始时间,会议1结束时间],[会议2开始时间,会议2结束时间]] 请计算会议室占用时间段。 输入描述 [[会议1开始时间,…

this和static和const关键字

1. this指针 1.1 基本认识 C中成员函数的特性&#xff0c;在类的非静态成员函数中都会存在一个this指针&#xff0c;来指向当前类&#xff0c;它是隐式的不可见的&#xff0c;是作为函数的第一个参数可以通过this指针来解决二义性的问题 是的&#xff0c;this指针是与类的实例相…

最快速度与最简代码搭建卷积神经网络,并快速训练模型,每日坚持手撕默写代码

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下最快速度与最简代码搭建卷积神经网络&#xff0c;并快速训练模型&#xff0c;每日坚持手撕默写代码。随着人工智能的快速发展&#xff0c;去年有强大的大模型ChatGPT横空出世&#xff0c;国内的大模型也紧追其后的发…

基于ssm西安旅游管理系统论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对西安旅游信息管理的提升&#x…

Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计

一、前言 大约两年前&#xff0c;基于自己的理解我曾写了几篇关于Mediapipe的文章&#xff0c;似乎帮助到了一些人。这两年&#xff0c;忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论&#xff0c;请原谅无法一一回复了。我将尝…

Redis缓存与数据库如何保证一致性

数据库和缓存如何保证一致性&#xff1f; 目录 数据库和缓存如何保证一致性&#xff1f;背景方案先更新数据库&#xff0c;还是先更新缓存&#xff1f;先更新数据库&#xff0c;再更新缓存先更新缓存&#xff0c;再更新数据库 先更新数据库&#xff0c;还是先删除缓存&#xff…

安装 PyQt5 保姆级教程

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 博主之前做应用层开发用的一直是 Qt&#xff0c;这次尝试一下在 python 中使用 Pyqt5 模块来开发 UI 界面&#xff0c;这里做一些…

certum的ip证书购买流程

Certum是成立于欧洲的CA认证机构&#xff0c;经过二十几年的发展Certum已经成为欧洲知名的CA认证机构之一&#xff0c;拥有广泛的客户群体和合作伙伴。IP证书是Certum为只有公网IP地址的网站准备的数字加密服务。今天就随SSL盾小编了解购买Certum旗下的IP证书流程。 第一步&am…

数据库进阶教学——读写分离(Mycat1.6+Ubuntu22.04主+Win10从)

目录 1、概述 2、环境准备 3、读写分离实验 3.1、安装jdk 3.2、安装Mycat 3.3、配置Mycat 3.3.1、配置schema.xml ​​​​3.3.2、配置server.xml 3.4、修改主从机远程登陆权限 3.4.1、主机 3.4.2、从机 3.5、启动Mycat 3.6、登录Mycat 3.7、验证 1、概述 读写分…

如何合理配置云服务器的CPU和内存?

​  提到云服务器性能&#xff0c;大抵有两个主要影响因素&#xff0c;CPU 核心数量和内存容量 &#xff0c;它们决定了云服务器的速度和可靠性。日常运用中&#xff0c;我们如何判断网站需要需要更多或更少?如何扩大或缩小它们以优化网站的性能? 一般来说&#xff0c;您拥…

视频遥测终端机的设计需求

目录 1.目的 2.参考文件 3.总体描述 4.硬件资源描述 4.1微控制单元 4.2视频处理单元 4.3性能指标 5.功能要求 5.1系统参数要求 5.1.1系统管理 5.1.2系统配置 5.1.2.1一般参数 5.1.2.2编码参数 5.1.2.3网络参数 5.1.2.4网络服务 5.1.2.5OSD参数 5.1.2.6抓拍 5.…

java设计模式学习之【访问者模式】

文章目录 引言访问者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用电脑示例代码地址 引言 设想你是一个艺术馆的管理员&#xff0c;艺术馆里有各种各样的艺术品。每当有游客来访时&#xff0c;根据他们的兴趣&#xff0c;他们可能只想看画、雕塑或特定的…

【开源】基于Vue+SpringBoot的房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

spring security oauth2搭建认证服务器

如图&#xff08;上面图片的代码在业务项目中&#xff09;&#xff0c;第一步在独立的业务项目中&#xff0c;先获取授权码&#xff08;也叫jsessionId&#xff09;、获取授权码的路径就是 /oauth2/authorize&#xff0c;这个路径是oauth2的框架中被OAuth2AuthorizationEndpoin…

如何从RTP包的AP类型包,获取h265的PPS、SPS、VPS信息

ffmpeg播放rtp流&#xff0c;为了降低首开延迟&#xff0c;需要在SDP文件中指定PPS、SPS、VPS信息。抓包后发现wireshark无法解析AP包。需要自己进行AP包解析。RTP协议AP包格式如下&#xff1a; 根据如上信息&#xff0c;我们可以解析AP包&#xff0c;效果如下 40 01&#xff…