我希望能够在编辑模式下可视化“资源区域”的位置,因此我尝试创建一个工具来在场景视图中显示它们。这是编辑器的代码:
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;
}
您需要创建一个编辑器窗口脚本。该脚本将创建一个自定义编辑器窗口,用于侦听选择更改并在场景视图中绘制小控件。
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。