本文介绍如何在编辑器里让物体围绕一个点旋转固定角度,比如上图里的Cube是围绕白色圆盘的中心旋转45度的。
目标:
创建一个在 Unity 编辑器中使用的旋转工具,使开发者能够在编辑模式下快速旋转一个物体。
实现思路:
-
编辑模式下操作:
- 使用
ExecuteInEditMode
特性让脚本在编辑模式下执行,而不需要进入播放模式。这对于关卡设计或对象调整非常有用,因为可以实时看到编辑效果。
- 使用
-
核心功能(旋转操作):
EditorRotateTool.cs
提供了旋转功能:通过RotateAround
方法将目标物体围绕某个指定的中心点旋转一定角度。该操作仅在编辑模式下执行,并且可以设置旋转的轴(如绕 Y 轴旋转)。
-
自定义 Inspector 界面:
EditorRotateToolInspector.cs
用于自定义EditorRotateTool
脚本的 Inspector 界面。通过重写OnInspectorGUI()
,在 Unity 编辑器面板中提供一个按钮 "旋转物体",用户点击该按钮时触发旋转操作。
-
流程:
- 用户在 Unity 编辑器中将
EditorRotateTool.cs
脚本挂载到一个物体上。 - 在 Inspector 中设置目标物体、旋转角度和旋转轴。
- 用户点击 "旋转物体" 按钮时,
EditorRotateToolInspector
会调用EditorRotateTool
中的RotateAroundTarget
方法,在编辑模式下旋转物体。
- 用户在 Unity 编辑器中将
实现步骤:
-
编写旋转工具脚本(
EditorRotateTool.cs
):- 创建一个可以旋转物体的工具,允许设置旋转的目标、角度和轴。
- 使用
ExecuteInEditMode
使脚本在编辑模式下运行。
-
编写自定义 Inspector(
EditorRotateToolInspector.cs
):- 为旋转工具脚本创建一个自定义的 Inspector 界面。
- 增加一个按钮,在编辑器面板中触发旋转操作。
-
用户操作:
- 用户在 Unity 编辑器中设置旋转目标,点击按钮触发旋转。
这个实现的核心思想是通过自定义编辑器扩展提高开发效率,使开发者在不进入播放模式的情况下快速查看物体的旋转效果,尤其适用于关卡设计和场景调整。
代码实现
文件 1: EditorRotateTool.cs
csharp
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("请设置目标物体!");
}
}
}
这是主脚本,用于定义一个旋转工具:
-
关键属性:
target
:目标对象(作为旋转中心点的物体)。angle
:旋转角度,默认为 45 度。axis
:旋转轴,默认为Vector3.up
(即围绕 Y 轴旋转)。
-
核心方法:
RotateAroundTarget()
:用于实现目标物体的旋转。- 检查是否设置了
target
。 - 在编辑模式下(非运行时),调用
transform.RotateAround
以目标位置为中心点、指定旋转轴和角度进行旋转。 - 通过
Debug.Log
输出提示旋转是否完成或目标未设置。
- 检查是否设置了
-
使用
ExecuteInEditMode
:- 此脚本允许在编辑模式下执行(无需运行游戏),方便开发者操作。
文件 2: EditorRotateToolInspector.cs
csharp
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 编辑器中的用户界面:
-
核心功能:
- 扩展了
EditorRotateTool
脚本的 Inspector 面板。 - 默认显示所有公共字段(
target
,angle
,axis
)。 - 增加了一个按钮 "旋转物体",当点击按钮时会调用
RotateAroundTarget()
方法,直接在编辑模式下旋转物体。
- 扩展了
-
实现方式:
- 使用
[CustomEditor]
特性将这个 Inspector 关联到EditorRotateTool
。 - 重写了
OnInspectorGUI()
方法:- 调用
DrawDefaultInspector()
保持默认字段显示。 - 添加按钮,用于触发旋转操作。
- 调用
- 使用
如何使用
-
挂载脚本:
- 将
EditorRotateTool.cs
挂载到一个 GameObject(游戏对象)上。
- 将
-
设置参数:
- 在 Inspector 面板中设置:
Target
:作为旋转中心点的物体。Angle
:旋转角度。Axis
:旋转轴(如Vector3.up
表示 Y 轴)。
- 在 Inspector 面板中设置:
-
旋转操作:
- 在 Unity 编辑器中,脚本会通过
EditorRotateToolInspector
提供一个按钮 "旋转物体"。 - 点击按钮,即可在编辑模式下让挂载脚本的物体绕指定目标旋转。
- 在 Unity 编辑器中,脚本会通过