我正在尝试在我的 Unity 项目中实现编辑模式脚本。这个想法是可以将脚本附加到对象上,并且在对其进行编辑时,可以看到诸如比例/位置/旋转之类的属性正在更新。
无需编写编辑模式脚本,所有这些都是可能的,但在按下播放按钮之前,这些更改是不可见的。这就是这里的区别。
我正在使用此处提供的脚本的变体来执行此操作。
首先,我有一个 MonoBehavior 脚本附加到我的游戏对象 - 它看起来像这样:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class FlippersEditMode : MonoBehaviour {
public float extraScale = 1f;
public void updateEditorState() {
transform.localScale = (Vector3.up * extraScale);
}
}
updateEditorState
其次,我在编辑器文件夹中有一个脚本,只要按下“更新”按钮,它就会调用此方法:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(FlippersEditMode))]
public class FlipperEditModeMeta: Editor {
public override void OnInspectorGUI() {
base.OnInspectorGUI();
if (GUILayout.Button("Update")) {
if (target.GetType() == typeof(FlippersEditMode)) {
FlippersEditMode flippers = (FlippersEditMode)target;
flippers.updateEditorState();
}
}
}
}
这很好用,我很感激,但最后一段代码是纯样板文件。对于我想要影响编辑模式的每个脚本,我需要一个几乎相同的文件。
所以我开始尝试制作一个“元”编辑器脚本。这个想法是这个脚本将有一组插槽,开发人员可以将脚本拖入其中。拖到这里的每个脚本都会得到一个自定义编辑器类,如上图所示。当然,被拖到这里的类每个都需要实现updateEditorState
,但这是协议的唯一要求。
因此,如果我制作另一个如下所示的编辑器脚本:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(EditModeScripts))]
public class EditModeScriptsMeta : Editor {
public override void OnInspectorGUI() {
base.OnInspectorGUI();
if (GUILayout.Button("Update")) {
if (target.GetType() == typeof(EditModeScripts)) {
EditModeScripts edit_mode_scripts = (EditModeScripts)target;
edit_mode_scripts.updateEditorState()
}
}
}
}
然后我可以触发以下updateEditorState
功能:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class EditModeScripts : MonoBehaviour {
public MonoBehaviour[] scripts = {};
public void updateEditorState () {
for (int i = 0; i < scripts.Length; i++) {
MonoBehaviour script = scripts[i];
// How to generate an editor class here for each script?
}
}
}
但正如你所见,我不知道如何动态生成类。