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://xiahunao.cn/news/2661532.html

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

相关文章

车联网的安全风险与应对措施

安全风险 1、恶意软件 攻击者可以通过入侵厂商或供应商网络&#xff0c;用恶意软件&#xff08;如病毒、木马、勒索软件等&#xff09;感染车联网系统组件&#xff0c;从而获得对车辆的控制权或窃取敏感信息。例如&#xff0c;一名安全研究人员成功入侵了特斯拉&#xff08;T…

校园安全风险管理系统

随着社会的不断发展和进步&#xff0c;教育行业也逐渐走向了信息化、智能化管理。校园作为教育事业的重要场所&#xff0c;其安全和管理问题一直备受关注。为了确保校园的安全和管理&#xff0c;各种校园管理平台应运而生。 其中&#xff0c;凡尔码搭建的校园安全管理系统为校园…

CodeWhisperer:编码世界中的声音启迪者

人烟 导语&#xff1a; 在数字化时代&#xff0c;编码已经成为了一种不可或缺的技能。而 CodeWhisperer&#xff08;编码世界中的声音启迪者&#xff09;则以其卓越的技术和深厚的知识为人们带来了独特的启发和指导。本文将介绍 CodeWhisperer 的背景和成就&#xff0c;探讨他是…

PowerShell Instal 一键部署gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

土壤侵蚀模型地形因子计算工具(2.0版本)

土壤侵蚀模型地形因子计算工具&#xff08;2.0版本&#xff09; 土壤侵蚀模型地形因子计算工具&#xff08;2.0版本)。该软件为符素华老师、刘宝元老师和周贵云老师开发的。2.0 版本在 1.0 版本的基础上修改了当坡长大于临界坡长后的坡长因子算法。2.0 中用整坡坡长因子计算公式…

nfs高可用部署

一、前言 为了避免nfs单点问题导致的服务不可用&#xff0c;使用以下架构实现nfs的高可用&#xff0c;keepalivedinotifyrsyncnfs&#xff0c;keepalived实现nfs的高可用&#xff0c;inotify持续监控nfs数据目录的变化&#xff0c;发生变化后通过rsync进行同步到备节点&#xf…

【北亚服务器数据恢复】san环境下LUN Mapping出错导致文件系统一致性出错的数据恢复案例

服务器数据恢复环境&#xff1a; san环境下的存储上一组由6块硬盘组建的RAID6&#xff0c;划分为若干LUN&#xff0c;MAP到跑不同业务的服务器上&#xff0c;服务器上层是SOLARIS操作系统UFS文件系统。 服务器故障&#xff1a; 业务需求需要增加一台服务器跑新增的应用&#xf…

如何实现h5的抽奖功能

示例: 使用的是一个插件可以在多种环境下运行的插件:九宫格 LuckyGrid | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫格 & 老虎机】抽奖插件 安装插件 # npm 安装 npm install lucky-canvas/vuelatest# 或者 yarn 安装 yarn add lu…

秋招复习篇之代码规范

目录 前言 1、变量命名 2、代码空格 1&#xff09;操作符左右一定有空格&#xff0c; 2&#xff09;分隔符&#xff08;, 和;&#xff09;前一位没有空格&#xff0c;后一位保持空格&#xff0c;例如&#xff1a; 3&#xff09;大括号和函数保持同一行&#xff0c;并有一个空格…

复数值神经网络可能是深度学习的未来

一、说明 复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。

Frappe Charts:数据可视化的强大工具

一、产品简介&#xff1a; 一个简单、零依赖、响应式的 开源SVG 图表库。这个图表库无论是数据更新还是屏幕大小变化&#xff0c;都能快速响应并更新图表。数据生成和悬停查看都有舒服的交互动效&#xff0c;体验感很好。不仅支持配置颜色&#xff0c;外观定制也很方便。还支持…

MYSQL分库分表常见问题

什么是分库 分库&#xff1a;是将一个数据库分成多个数据库&#xff0c;但是总表数不变&#xff0c;部署到不同机器&#xff0c;这样可以分担数据库的读写压力&#xff0c;提高系统的吞吐能力。 什么是分表 分表&#xff1a;就是一个表分成多个表&#xff0c;但是总体的库不…

k8s之陈述式资源管理

1.kubectl命令 kubectl version 查看k8s的版本 kubectl api-resources 查看所有api的资源对象的名称 kubectl cluster-info 查看k8s的集群信息 kubectl get cs 查看master节点的状态 kubectl get pod 查看默认命名空间内的pod的信息 kubectl get ns 查看当前集群所有的命…

[Python进阶] 操作注册表:winreg

5.22 操作注册表&#xff1a;winreg 5.22.1 注册表概念 在Windows系统中&#xff0c;注册表本质上就是一个数据库&#xff0c;其中存放着硬件、软件、用户、操作系统以及程序相关设置信息。我们除了使用Windows系统自带的regedit程序&#xff0c;也可以通过Python编程读取并操…

【React】echarts-for-react 的使用

文章目录 echarts-for-react &#xff1a;一个简单的 Apache echarts 的 React 封装配置项手册&#xff1a;https://echarts.apache.org/zh/option.html#title 安装依赖 $ npm install --save echarts-for-react# echarts 是 echarts-for-react的对等依赖,您可以使用自己的版本…

MCEWMDRMNDBootstrap.dll文件丢失,软件游戏无法启动,怎样下载修复

不少小伙伴反馈&#xff0c;在打开某些游戏或软件的时候&#xff0c;Windows会提示“MCEWMDRMNDBootstrap.dll文件丢失&#xff0c;软件无法启动”&#xff0c;不知道应该怎样办&#xff1f; 首先&#xff0c;我们先来了解“MCEWMDRMNDBootstrap.dll文件”是什么&#xff1f; …

Qt/C++音视频开发61-多屏渲染/一个解码渲染到多个窗口/画面实时同步

一、前言 多屏渲染就是一个解码线程对应多个渲染界面&#xff0c;通过addrender这种方式添加多个绘制窗体&#xff0c;我们经常可以在展会或者卖电视机的地方可以看到很多电视播放的同一个画面&#xff0c;原理应该类似&#xff0c;一个地方负责打开解码播放&#xff0c;将画面…

geemap学习笔记037:分析地理空间数据--坐标格网和渔网

前言 坐标格网&#xff08;Coordinate Grid&#xff09;简称“坐标网”&#xff0c;是按一定纵横坐标间距&#xff0c;在地图上划分的格网&#xff0c;坐标网是任何地图上不可缺少的要素之一。下面将详细介绍一下坐标格网和渔网。 1 导入库并显示地图 import ee import geem…

请问仿写arkts摇杆功能,为什么我的代码,TouchType.Up 时候摇杆动画不能还原呢?请求大佬指点一下

仿照黑马的arkts 写个摇杆功能&#xff0c;但是为什么我的代码&#xff0c;TouchType.Up 时候摇杆动画不能还原&#xff0c; 请求大佬指点一下 import router from ohos.router import curves from ohos.curvesEntry Component struct ItemPage7 {// 小鱼坐标State fishX: nu…

java代码审计 - OutputStream.write() 期间持续发生 XSS 攻击

** java - OutputStream.write() 期间持续发生 XSS 攻击 ** 1 漏洞概述 我一直在研究有关持久 XSS 攻击的安全问题 将未经验证的数据发送到网络浏览器&#xff0c;这可能会导致浏览器执行恶意代码。 代码采用 Java 语言。 void output(OutputStream out){out.write(byteDa…