Unity编辑器无法编辑多个对象

时间:2017-11-15 19:38:00

标签: unity3d inspector

我想为我的一个班级建立一个自定义检查员......而且......我想我会开始简单......我仍然无法得到它来绘制基本检查员:

我的编辑器脚本是:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(AbilityBluePrint))]
[CanEditMultipleObjects]
public class AbilityBluePrintEditor : Editor
{

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        // Show default inspector property editor
        DrawDefaultInspector();
    }
}

我要编辑的课程是:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[CreateAssetMenu(fileName = "New Ability BluePrint", menuName = "Ability BluePrint")]
public class AbilityBluePrint : ScriptableObject {
    public AbilityName abilityName;
    public Characteristic[] characteritics;
    public Effect[] effects;
    public float coolDown;
    public Sprite icon;
    public string description;
}

关于如何解决“不支持多对象编辑”消息的任何建议,而不是我漂亮的自定义编辑器?

2 个答案:

答案 0 :(得分:0)

如果要使用多个对象版本,则需要使用序列化属性。

[CustomEditor(typeof(AbilityBluePrint))]
[CanEditMultipleObjects]
public class AbilityBluePrintEditor : Editor
{
    var AbilityName : SerializedProperty;


    function OnEnable () 
    {
    // Setup the SerializedProperties
    AbilityName = serializedObject.FindProperty ("Ability");

    }

    function OnInspectorGUI()
    {
    // Update the serializedProperty - always do this in the beginning of OnInspectorGUI.
    serializedObject.Update ();
    ...

答案 1 :(得分:-1)

文档中没有对此进行解释,我认为它非常重要。

除了使用序列化属性的选项之外,如果您不能使用这些属性,如果您有自己的项目,则不使用自动管理的序列化属性,则必须使用“ 目标 >”变量而不是“目标”。

我注意到,如果您选择没有共享脚本的不同类型的对象,那么它不会显示共享属性,因此我们不需要检查目标是否都是同一类型,它总是一个或多个。然后,您可以在一个foreach循环中手动处理每个对象。

这是一个在Editor类中的OnInspectorGUI方法的内容的工作示例,其中带有一个简单的复选框,该复选框可在多个脚本中进行更改。希望对您有所帮助。

var myScript = (UnityTerrainWrapper)target;
var allSelectedScripts = targets;

EditorGUI.BeginChangeCheck();
var value = GUILayout.Toggle(myScript.ShowNativeTerrain, "Draw Unity Terrain");
if (EditorGUI.EndChangeCheck())
{
   foreach (var script in allSelectedScripts)
        ((UnityTerrainWrapper)script).ShowNativeTerrain = value;

   SceneView.RepaintAll();
 }
 DrawDefaultInspector();