选择 ScriptableObject 文件时如何在场景视图中绘制 Gizmos?

问题描述 投票:0回答:1

我希望能够在编辑模式下可视化“资源区域”的位置,因此我尝试创建一个工具来在场景视图中显示它们。这是编辑器的代码:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(ResourceAreas))]
public class ResourceAreasEditor : Editor
{
    void OnSceneGUI()
    {
        ResourceAreas resourceAreas = (ResourceAreas)target;

        foreach (ResourceArea area in resourceAreas.resourceAreas)
        {
            Handles.color = Color.red;
            Handles.DrawWireDisc(area.center, new Vector3(0,1,0), area.radius);

            EditorGUI.BeginChangeCheck();
            Vector3 newCenter = Handles.PositionHandle(area.center, Quaternion.identity);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(resourceAreas, "Move Resource Area Center");
                area.center = newCenter;
                EditorUtility.SetDirty(resourceAreas);
            }
        }
    }
}

但是,在选择我的 ResourceAreas 可编写脚本的对象后,场景视图中不会出现小控件。这是可编写脚本的对象的代码以及检查器中的样子:

using UnityEngine;

[System.Serializable]
public class ResourceArea
{
    public string resourceName;
    public Vector3 center;  // Center point in terrain space
    public float radius;    // Radius of the resource area
    public int resourceCount;
}

[CreateAssetMenu(fileName = "ResourceAreas", menuName = "ScriptableObjects/ResourceAreas", order = 1)]
public class ResourceAreas : ScriptableObject
{
    public ResourceArea[] resourceAreas;
}

enter image description here

unity-game-engine
1个回答
0
投票

您需要创建一个编辑器窗口脚本。该脚本将创建一个自定义编辑器窗口,用于侦听选择更改并在场景视图中绘制小控件。

using UnityEditor;
using UnityEngine;

public class ResourceAreasEditorWindow : EditorWindow
{
   private ResourceAreas resourceAreas;

   [MenuItem("Window/Resource Areas Editor")]
   public static void ShowWindow()
   {
       GetWindow<ResourceAreasEditorWindow>("Resource Areas Editor");
   }

   private void OnEnable()
   {
       Selection.selectionChanged += OnSelectionChanged;
       SceneView.duringSceneGui += OnSceneGUI;
   }

   private void OnDisable()
   {
       Selection.selectionChanged -= OnSelectionChanged;
       SceneView.duringSceneGui -= OnSceneGUI;
   }

   private void OnSelectionChanged()
   {
       if (Selection.activeObject is ResourceAreas)
       {
        resourceAreas = Selection.activeObject as ResourceAreas;
       }
   }

   private void OnSceneGUI(SceneView sceneView)
   {
       if(resourceAreas == null)
         return;

       foreach (ResourceArea area in resourceAreas.resourceAreas)
       {
           Handles.color = Color.red;
           Handles.DrawWireDisc(area.center, new Vector3(0,1,0), area.radius);
           SceneView.RepaintAll();
       }
   }

   private void OnGUI()
   {
       EditorGUILayout.LabelField("Selected ResourceAreas:", EditorStyles.boldLabel);
       if (resourceAreas != null)
       {
           EditorGUILayout.LabelField("Name: ", resourceAreas.name);
           // Display other properties of resourceAreas if needed
       }
       else
           EditorGUILayout.LabelField("No ResourceAreas selected.");
 
   }
 }

然后,通过“窗口”>“资源区域编辑器”打开自定义编辑器窗口。在“项目”窗口中选择一个 ResourceAreas ScriptableObject。当选择 ResourceAreas ScriptableObject 时,它将在场景视图中绘制wiredisc。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.