当前位置: 首页 > 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 提供一个按钮 “旋转物体”。
    • 点击按钮,即可在编辑模式下让挂载脚本的物体绕指定目标旋转。
http://www.lryc.cn/news/499960.html

相关文章:

  • 2024.11.29——[HCTF 2018]WarmUp 1
  • AGameModeBase和游戏模式方法
  • Swift 扩展
  • 【NebulaGraph】官方查询语言nGQL教程1 (四)
  • 阿里云负载均衡SLB实践
  • 鸿蒙技术分享:❓❓[鸿蒙应用开发]怎么更好的管理模块生命周期?
  • 深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(上)
  • LabVIEW气缸摩擦力测试系统
  • Leetcode. 688骑士在棋盘上的概率
  • TCP/IP 协议栈高效可靠的数据传输机制——以 Linux 4.19 内核为例
  • Ubuntu22.04搭建LAMP环境(linux服务器学习笔记)
  • 鸿蒙面试---1208
  • java基础教程第16篇( 正则表达式)
  • Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)
  • 【如何制定虚拟货币的补仓策略并计算回本和盈利】
  • 给图像去除水印攻
  • Linux之封装线程库和线程的互斥
  • PH热榜 | 2024-12-08
  • LeetCode刷题day20——贪心
  • CCF编程能力等级认证GESP—C++3级—20241207
  • Microi 吾码:大数据浪潮中的智能领航者
  • Lua语言入门 - Lua 数组
  • gulp应该怎么用,前端批量自动化替换文件
  • 石岩湿地公园的停车场收费情况
  • A7157 基于Java+SSM+mysql+jsp的医院挂号系统的设计与实现 源码 文档 配置 全套资料
  • 数据处理与统计分析——11-Pandas-Seaborn可视化
  • 【计算机网络】实验13:运输层端口
  • STL之适配器(adapters)_下
  • 基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)
  • 安装 Zookeeper 和 Kafka