1. 需求
通过名称跳转场景,手动拼写可能导致拼写错误。
2. 原理
通过EditorBuildSettings获取场景名称,重新绘制脚本的 Inspector 面板的图形界面。
(效果图)
3.示例代码
public class Test : MonoBehaviour
{
[HideInInspector] [SerializeField] private string sceneName;
[HideInInspector] [SerializeField] private int selectedSceneIndex;
}
using UnityEditor;
[CustomEditor(typeof(Test))]
public class TestInspector : Editor
{
private string[] m_SceneNames;
private SerializedProperty m_SceneNameProperty;
private SerializedProperty m_SelectedSceneIndexProperty;
private void OnEnable()
{
// 查找并获取场景名称属性
m_SceneNameProperty = serializedObject.FindProperty("sceneName");
// 查找并获取选定场景索引属性
m_SelectedSceneIndexProperty = serializedObject.FindProperty("selectedSceneIndex");
// 获取场景数量
int sceneCount = EditorBuildSettings.scenes.Length;
// 创建场景名称数组
m_SceneNames = new string[sceneCount];
// 遍历场景列表
for (int i = 0; i < sceneCount; i++)
{
// 获取场景路径
string scenePath = EditorBuildSettings.scenes[i].path;
// 获取场景名称(不包含扩展名)
string sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath);
// 将场景名称存入数组
m_SceneNames[i] = sceneName;
}
}
// 在 inspector 面板中绘制图形用户界面的方法
public override void OnInspectorGUI()
{
// 调用基类的 OnInspectorGUI 方法
base.OnInspectorGUI();
// 更新序列化对象
serializedObject.Update();
// 开始编辑器更改检查
EditorGUI.BeginChangeCheck();
// 显示场景选择弹窗,并将选中的场景索引赋值给属性
m_SelectedSceneIndexProperty.intValue = EditorGUILayout.Popup("Scenes", m_SelectedSceneIndexProperty.intValue, m_SceneNames);
// 检查是否有编辑器更改
if (EditorGUI.EndChangeCheck())
{
// 将选中的场景名称赋值给属性
m_SceneNameProperty.stringValue = m_SceneNames[m_SelectedSceneIndexProperty.intValue];
// 应用属性的修改
serializedObject.ApplyModifiedProperties();
}
}
private void OnDisable()
{
m_SceneNameProperty = null;
}
}