You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity编辑器中创建类似粒子系统的自定义预览浮动窗口

实现Unity编辑器自定义浮动监控窗口(类粒子系统面板)

一、核心思路

基于Unity编辑器的EditorWindow类构建浮动窗口,结合EditorGUILayout的折叠面板、字段绘制能力,实现类似粒子系统的分组式变量监控,同时通过窗口的Update方法触发实时刷新。

二、分步实现

1. 创建基础浮动窗口框架

继承EditorWindow,添加菜单入口让用户快速打开窗口:

using UnityEditor;
using UnityEngine;

public class CustomMonitorWindow : EditorWindow
{
    // 添加编辑器菜单入口
    [MenuItem("Window/Custom Monitor")]
    public static void ShowWindow()
    {
        // 打开或聚焦窗口
        GetWindow<CustomMonitorWindow>("Custom Monitor");
    }
}

2. 绑定监控目标与变量

在窗口类中定义目标对象,支持选中对象时自动绑定,同时准备序列化对象用于读取变量:

private GameObject targetObj;
private SerializedObject serializedObj;

// 折叠面板状态控制
private bool positionFoldout = true;
private bool physicsFoldout = true;

private void OnEnable()
{
    // 编辑器选中对象时自动赋值
    if (Selection.activeGameObject != null)
    {
        targetObj = Selection.activeGameObject;
        serializedObj = new SerializedObject(targetObj);
    }
}

3. 绘制类粒子系统的折叠面板UI

在OnGUI方法中,用EditorGUILayout.Foldout创建分组,内部绘制对应监控变量:

private void OnGUI()
{
    // 选择监控目标
    targetObj = (GameObject)EditorGUILayout.ObjectField("监控目标", targetObj, typeof(GameObject), true);
    
    if (targetObj == null) return;
    
    serializedObj.Update();

    // 位置信息折叠组
    positionFoldout = EditorGUILayout.Foldout(positionFoldout, "位置信息");
    if (positionFoldout)
    {
        EditorGUI.indentLevel++;
        EditorGUILayout.PropertyField(serializedObj.FindProperty("transform.localPosition"), new GUIContent("本地位置"));
        EditorGUILayout.PropertyField(serializedObj.FindProperty("transform.position"), new GUIContent("世界位置"));
        EditorGUI.indentLevel--;
    }

    // 物理信息折叠组(需目标带有Rigidbody组件)
    Rigidbody rb = targetObj.GetComponent<Rigidbody>();
    if (rb != null)
    {
        physicsFoldout = EditorGUILayout.Foldout(physicsFoldout, "物理信息");
        if (physicsFoldout)
        {
            EditorGUI.indentLevel++;
            EditorGUILayout.Vector3Field("当前速度", rb.velocity);
            EditorGUILayout.FloatField("角速度", rb.angularVelocity.magnitude);
            EditorGUI.indentLevel--;
        }
    }

    serializedObj.ApplyModifiedProperties();
}

4. 实现实时刷新

重写Update方法,每帧触发窗口重绘,保证变量实时更新:

private void Update()
{
    // 仅当有监控目标时刷新UI
    if (targetObj != null)
    {
        Repaint();
    }
}

三、扩展优化方向

  • 自定义变量列表:用List<string>存储变量路径,支持用户手动添加/删除监控项
  • 样式定制:用GUIStyle调整折叠面板、字段的外观,贴近粒子系统面板风格
  • 多对象监控:添加列表控件,支持同时监控多个对象的同类型变量

内容的提问来源于stack exchange,提问作者Ron James Theron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:45:35