【问题标题】:Unity Editor Can't Edit Multiple ObjectsUnity Editor 无法编辑多个对象
【发布时间】:2020-02-28 00:57:56
【问题描述】:

我想为我的一个类构建一个自定义检查器......嗯......我想我会从简单的开始......但我仍然无法绘制基本检查器:

我的编辑器脚本是:

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;
}

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

【问题讨论】:

  • AbilityBluePrintEditor.cs 是否放置在“编辑器”文件夹中?
  • 是的。实际上我已经设法让它工作了。我只需要在检查器中解锁该项目。选择另一个,然后再选择一个。

标签: unity3d inspector


【解决方案1】:

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

[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 ();
    ...

【讨论】:

  • 这不是真的。它更容易,但不强制使用序列化属性。我用一个例子添加我自己的答案。
【解决方案2】:

这在文档中没有解释,我认为这很重要。

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

我注意到如果你选择不同类型的对象没有共享脚本,它不会显示共享属性,所以我们不需要检查目标是否都是相同的类型,它总是一个或多个。然后,您可以在 foreach 循环中对它们中的每一个手动执行您想做的任何事情。

这是一个编辑器类中 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();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多