Редактор Unity не может редактировать несколько объектов

Я хочу создать собственный инспектор для одного из моих классов... ну... я думал, что начну с простого... и до сих пор не могу заставить его нарисовать базовый инспектор:

Мой сценарий редактора:

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

Любые предложения о том, как решить сообщение «Редактирование нескольких объектов не поддерживается», которое я получаю вместо моего красивого пользовательского редактора ??


person Sorade    schedule 15.11.2017    source источник
comment
Был ли AbilityBluePrintEditor.cs помещен в папку Editor?   -  person Foggzie    schedule 15.11.2017
comment
Да. На самом деле мне удалось заставить его работать. Мне просто нужно было разблокировать предмет в инспекторе. Выберите другой, а затем снова этот.   -  person Sorade    schedule 16.11.2017


Ответы (2)


Вам нужно использовать сериализованные свойства, если вы хотите использовать выпуск с несколькими объектами.

[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 ();
    ...
person joreldraw    schedule 16.11.2017
comment
Это неправда. Это проще, но не обязательно использовать сериализованные свойства. Я добавляю свой собственный ответ с примером. - person Darkgaze; 27.02.2020

Это не объясняется в документации, и я думаю, что это очень важно.

Помимо возможности использования сериализованных свойств, если вы не можете их использовать, если у вас есть собственные элементы, не использующие автоматически управляемые сериализованные свойства, вам необходимо использовать переменную «targets». вместо «цель».

Я заметил, что если вы выбираете разные типы объектов без общего сценария, он не показывает общие свойства, поэтому нам не нужно проверять, все ли цели одного типа, это всегда один или несколько. Затем вы делаете все, что хотите, вручную с каждым из них внутри цикла foreach.

Вот рабочий пример содержимого метода OnInspectorGUI внутри класса Editor с простым флажком, который меняется в нескольких сценариях. Надеюсь, поможет.

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();
person Darkgaze    schedule 27.02.2020
comment
Объясняется в документации, и ваше решение не является хорошим. Цели, используемые в OnInspectorGui, относятся только к первому из всех объектов selectef, и вам нужно вызвать его один раз для каждого из выбранных объектов. docs.unity3d.com/ScriptReference/Editor-target.html - person joreldraw; 28.02.2020
comment
@joreldraw Target — это не то же самое, что Targets. Мое объяснение говорит о другом. Targets возвращает МАССИВ, очевидно, вы не читали мой код. docs.unity3d.com/ScriptReference/Editor-targets.html Пожалуйста, убери свой минус. - person Darkgaze; 25.03.2020