当前位置: 首页 > news >正文

【Unity高级】在编辑器中如何让物体围绕一个点旋转固定角度

在这里插入图片描述

本文介绍如何在编辑器里让物体围绕一个点旋转固定角度,比如上图里的Cube是围绕白色圆盘的中心旋转45度的。

目标:

创建一个在 Unity 编辑器中使用的旋转工具,使开发者能够在编辑模式下快速旋转一个物体。

实现思路:

  1. 编辑模式下操作:

    • 使用 ExecuteInEditMode 特性让脚本在编辑模式下执行,而不需要进入播放模式。这对于关卡设计或对象调整非常有用,因为可以实时看到编辑效果。
  2. 核心功能(旋转操作):

    • EditorRotateTool.cs 提供了旋转功能:通过 RotateAround 方法将目标物体围绕某个指定的中心点旋转一定角度。该操作仅在编辑模式下执行,并且可以设置旋转的轴(如绕 Y 轴旋转)。
  3. 自定义 Inspector 界面:

    • EditorRotateToolInspector.cs 用于自定义 EditorRotateTool 脚本的 Inspector 界面。通过重写 OnInspectorGUI(),在 Unity 编辑器面板中提供一个按钮 “旋转物体”,用户点击该按钮时触发旋转操作。
  4. 流程

    • 用户在 Unity 编辑器中将 EditorRotateTool.cs 脚本挂载到一个物体上。
    • 在 Inspector 中设置目标物体、旋转角度和旋转轴。
    • 用户点击 “旋转物体” 按钮时,EditorRotateToolInspector 会调用 EditorRotateTool 中的 RotateAroundTarget 方法,在编辑模式下旋转物体。

实现步骤:

  1. 编写旋转工具脚本(EditorRotateTool.cs

    • 创建一个可以旋转物体的工具,允许设置旋转的目标、角度和轴。
    • 使用 ExecuteInEditMode 使脚本在编辑模式下运行。
  2. 编写自定义 Inspector(EditorRotateToolInspector.cs

    • 为旋转工具脚本创建一个自定义的 Inspector 界面。
    • 增加一个按钮,在编辑器面板中触发旋转操作。
  3. 用户操作:

    • 用户在 Unity 编辑器中设置旋转目标,点击按钮触发旋转。

这个实现的核心思想是通过自定义编辑器扩展提高开发效率,使开发者在不进入播放模式的情况下快速查看物体的旋转效果,尤其适用于关卡设计和场景调整。

代码实现

文件 1: EditorRotateTool.cs

using UnityEngine;[ExecuteInEditMode] // 允许在编辑模式下运行
public class EditorRotateTool : MonoBehaviour
{public Transform target; // 目标物体(中心点)public float angle = 45f; // 旋转角度public Vector3 axis = Vector3.up; // 旋转轴/// <summary>/// 执行旋转/// </summary>public void RotateAroundTarget(){if (target != null){// 仅在编辑模式下执行if (!Application.isPlaying){transform.RotateAround(target.position, axis, angle);Debug.Log("编辑模式下旋转完成!");}}else{Debug.LogWarning("请设置目标物体!");}}
}

这是主脚本,用于定义一个旋转工具:

  1. 关键属性

    • target:目标对象(作为旋转中心点的物体)。
    • angle:旋转角度,默认为 45 度。
    • axis:旋转轴,默认为 Vector3.up(即围绕 Y 轴旋转)。
  2. 核心方法

    • RotateAroundTarget():用于实现目标物体的旋转。
      • 检查是否设置了 target
      • 在编辑模式下(非运行时),调用 transform.RotateAround 以目标位置为中心点、指定旋转轴和角度进行旋转。
      • 通过 Debug.Log 输出提示旋转是否完成或目标未设置。
  3. 使用 ExecuteInEditMode

    • 此脚本允许在编辑模式下执行(无需运行游戏),方便开发者操作。

文件 2: EditorRotateToolInspector.cs

using UnityEngine;
using UnityEditor;[CustomEditor(typeof(EditorRotateTool))]
public class EditorRotateToolInspector : Editor
{public override void OnInspectorGUI(){// 获取脚本引用EditorRotateTool tool = (EditorRotateTool)target;// 显示默认的 Inspector 字段DrawDefaultInspector();// 添加按钮if (GUILayout.Button("旋转物体")){tool.RotateAroundTarget();}}
}

这是一个自定义 Inspector 脚本,用于增强 Unity 编辑器中的用户界面:

  1. 核心功能

    • 扩展了 EditorRotateTool 脚本的 Inspector 面板。
    • 默认显示所有公共字段(target, angle, axis)。
    • 增加了一个按钮 “旋转物体”,当点击按钮时会调用 RotateAroundTarget() 方法,直接在编辑模式下旋转物体。
  2. 实现方式

    • 使用 [CustomEditor] 特性将这个 Inspector 关联到 EditorRotateTool
    • 重写了 OnInspectorGUI() 方法:
      • 调用 DrawDefaultInspector() 保持默认字段显示。
      • 添加按钮,用于触发旋转操作。

如何使用

  1. 挂载脚本

    • EditorRotateTool.cs 挂载到一个 GameObject(游戏对象)上。
  2. 设置参数

    • 在 Inspector 面板中设置:
      • Target:作为旋转中心点的物体。
      • Angle:旋转角度。
      • Axis:旋转轴(如 Vector3.up 表示 Y 轴)。
  3. 旋转操作

    • 在 Unity 编辑器中,脚本会通过 EditorRotateToolInspector 提供一个按钮 “旋转物体”。
    • 点击按钮,即可在编辑模式下让挂载脚本的物体绕指定目标旋转。

相关文章:

【Unity高级】在编辑器中如何让物体围绕一个点旋转固定角度

本文介绍如何在编辑器里让物体围绕一个点旋转固定角度&#xff0c;比如上图里的Cube是围绕白色圆盘的中心旋转45度的。 目标&#xff1a; 创建一个在 Unity 编辑器中使用的旋转工具&#xff0c;使开发者能够在编辑模式下快速旋转一个物体。 实现思路&#xff1a; 编辑模式下…...

2024.11.29——[HCTF 2018]WarmUp 1

拿到题&#xff0c;发现是一张图&#xff0c;查看源代码发现了被注释掉的提示 <!-- source.php--> step 1 在url传参看看这个文件&#xff0c;发现了这道题的源码 step 2 开始审计代码&#xff0c;分析关键函数 //mb_strpos($haystack,$needle,$offset,$encoding):int|…...

AGameModeBase和游戏模式方法

AGameModeBase和游戏模式方法有着密切的关系&#xff1a; AGameModeBase是游戏模式的基础类&#xff1a; 它提供了控制游戏规则的基本框架包含了一系列管理游戏流程的核心方法是所有自定义游戏模式类的父类 主要的游戏模式方法包括&#xff1a; // 游戏初始化时调用 virtua…...

Swift 扩展

Swift 扩展 Swift 是一种强大的编程语言&#xff0c;由苹果公司开发&#xff0c;用于iOS、macOS、watchOS和tvOS应用程序的开发。自2014年发布以来&#xff0c;Swift因其易于阅读和编写的语法、现代化的设计以及出色的性能而广受欢迎。本文将探讨Swift的一些关键特性&#xff…...

【NebulaGraph】官方查询语言nGQL教程1 (四)

【NebulaGraph】官方查询语言nGQL教程1 1. 课程信息2. 查找路径FIND PATH2.1 补充说明FIND PATH2.2 例子 1. 课程信息 课程地址: https://www.bilibili.com/video/BV1PT411P7w8/?spm_id_from333.337.search-card.all.click&vd_source240d9002f7c7e3da63cd9a975639409a …...

阿里云负载均衡SLB实践

基于上篇文章继续&#xff0c;如果你使用的是阿里云等云平台&#xff0c;通过配置nginxkeepAlived行不通&#xff0c;因为阿里云服务器不支持你虚拟出ip提供给外部访问&#xff0c;需要使用阿里云的负载均衡产品 对应的产品有三个系列 1、应用场景 ALB: 主要是对应应用层的7层…...

鸿蒙技术分享:❓❓[鸿蒙应用开发]怎么更好的管理模块生命周期?

鸿蒙HarmonyOS NEXT应用开发架构设计-模块生命周期管理 模块化开发 模块化开发已经是应用开发中的一个共识&#xff0c;一般对于公司级的应用开发&#xff0c;都会考虑是否可以进行模块化开发。 HarmonyOS NEXT系统应用开发目前使用的Stage模型其实就有涉及模块化开发的部分…...

深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(上)

文章目录 一、ansible的主要组成部分二、安装三、相关文件四、ansible配置文件五、ansible 系列 一、ansible的主要组成部分 ansible playbook&#xff1a;任务剧本&#xff08;任务集&#xff09;&#xff0c;编排定义ansible任务集的配置文件&#xff0c;由ansible顺序依次执…...

LabVIEW气缸摩擦力测试系统

基于LabVIEW的气缸摩擦力测试系统实现了气缸在不同工作状态下摩擦力的快速、准确测试。系统由硬件平台和软件两大部分组成&#xff0c;具有高自动化、精确测量和用户友好等特点&#xff0c;可广泛应用于精密机械和自动化领域。 ​ 项目背景&#xff1a; 气缸作为舵机关键部件…...

Leetcode. 688骑士在棋盘上的概率

题目描述 原题链接&#xff1a;Leetcode. 688骑士在棋盘上的概率 解题思路 多元dp 将dp[step][i][j])定义为从(i, j)出发&#xff0c;走step步之后骑士还在棋盘上的概率。 如果 ( i , j ) (i,j) (i,j)不在棋盘上&#xff0c;即非 0 < i < n 0<i<n 0<i<…...

TCP/IP 协议栈高效可靠的数据传输机制——以 Linux 4.19 内核为例

TCP/IP 协议栈是一种非常成熟且广泛使用的网络通信框架,它将复杂的网络通信任务分成多个层次,从而简化设计,使每一层的功能更加清晰和独立。在经典的 TCP/IP 协议栈中,常见的分层为链路层、网络层、传输层和应用层。本文将对每一层的基本功能进行描述,并列出对应于 Linux …...

Ubuntu22.04搭建LAMP环境(linux服务器学习笔记)

目录 引言&#xff1a; 一、系统更新 二、安装搭建Apache2 1.你可以通过以下命令安装它&#xff1a; 2.查看Apache2版本 3.查看Apache2运行状态 4.浏览器访问 三、安装搭建MySQL 1.安装MySQL 2.查看MySQL 版本 3.安全配置MySQL 3.1是否设置密码&#xff1f;(按y|Y表…...

鸿蒙面试---1208

HarmonyOS 三大技术理念 分布式架构&#xff1a;HarmonyOS 的分布式架构使得设备之间能够无缝协同工作。例如&#xff0c;它允许用户在不同的智能设备&#xff08;如手机、平板、智能手表等&#xff09;之间共享数据和功能。比如&#xff0c;用户可以在手机上开始编辑文档&…...

java基础教程第16篇( 正则表达式)

Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言&#xff0c;但是在每种语言中有细微的差别。 Java 提供了 java.util.regex 包&#xff0c;它包含了 Pattern 和 Matcher 类&#xff0c;用于处理正…...

Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)

文章目录 一、Gitlab提示升级信息二、老版本的docker运行gitlab命令三、备份老版本Gitlab数据四、确定升级路线五、升级(共分3个版本升级)5.1 升级第一步(17.1.2 > 17.3.7)5.2 升级第二步(17.3.7 > 17.5.3)5.3 升级第三步(17.5.3 > 17.6.1) 六、web端访问gitlab服务 一…...

【如何制定虚拟货币的补仓策略并计算回本和盈利】

在虚拟货币市场中,价格波动性极大,如何在波动中生存并获得盈利是每个投资者都在思考的问题。作为一种投资策略,补仓(又称“摊低成本”)常常被用来降低持仓成本,并在市场回升时获得更大的盈利。但如何科学地设定补仓计划,确定回本点和盈利目标呢? 本文将以 Dogecoin 为…...

给图像去除水印攻

去除水印的过程与添加水印相反&#xff0c;它涉及到图像修复、颜色匹配和区域填充等技术。OpenCV-Python 提供了多种方法来处理不同类型的水印&#xff0c;包括但不限于纯色水印、半透明水印以及复杂背景上的水印。下面将详细介绍几种常见的去水印策略&#xff0c;并给出具体的…...

Linux之封装线程库和线程的互斥

Linux之封装线程库和线程的互斥与同步 一.封装线程库二.线程的互斥2.1互斥量的概念2.2初始化和销毁互斥量2.3加锁和解锁2.4互斥量的原理2.5可重入和线程安全2.6死锁 一.封装线程库 其实在我们C内部也有一个线程库而C中的线程库也是封装的原生线程库的函数&#xff0c;所以我们…...

PH热榜 | 2024-12-08

1. Reforged Labs 标语&#xff1a;轻松为手游工作室制作AI广告。 介绍&#xff1a;Reforged Labs 推出了一款前所未有的AI视频制作服务。我们自动化了以往昂贵且耗时的创意流程&#xff0c;取而代之的是能快速、低成本地为各个工作室量身定制视频广告。 产品网站&#xff1…...

LeetCode刷题day20——贪心

LeetCode刷题day20——贪心 435. 无重叠区间763. 划分字母区间分析&#xff1a; 56. 合并区间分析&#xff1a; 435. 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 …...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...