0

我正在尝试在我的 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?
        }
    }
}

但正如你所见,我不知道如何动态生成类。

4

1 回答 1

1

我认为您的方法不会纯粹动态地工作。每次您更改某些内容并返回统一时,Unity 都会编译您的代码。编译后,Unity 使用反射来确定哪些编辑器可用。

理论上,您可以创建包含编辑器代码的新源文件。我不知道它是否会自动重新导入脚本,或者您需要手动触发重新导入。

对于手动重新导入,您可以使用组合,AssetDatabase.Refresh()如果这还不够,请通过Selection类选择脚本资产并使用触发重新导入菜单条目EditorApplication.ExecuteMenuItem

于 2017-09-20T19:53:25.203 回答