Ящик пользовательских атрибутов Odin для спискаC#

Место общения программистов C#
Ответить
Anonymous
 Ящик пользовательских атрибутов Odin для списка

Сообщение Anonymous »

Я хочу создать собственный ящик для своего списка абстрактного типа с помощью C# Odin Unity.

Код: Выделить всё

[Serializable]
[InlineProperty]
public abstract class BaseEntry : ScriptableObject
{
public string _ID;
public string _Name;
}

[Serializable]
[InlineProperty]
public class Ability : BaseEntry
{
[HorizontalLabelHeader("Test")]
public string _Description;
}
А вот как выглядит мой тестовый скрипт:

Код: Выделить всё

public class TestScript : MonoBehaviour
{
[SerializeField]
[ClickableList("List")]
private List _ability;

[Button]
public void Load()
{
_ability = new List();
_ability.Clear();

_ability = Resources.LoadAll("").ToList();
}
}
Теперь атрибут и его ящик:

Код: Выделить всё

[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
[Conditional("UNITY_EDITOR")]
[DontApplyToListElements]
public class ClickableListAttribute : Attribute
{
public string Label;

public ClickableListAttribute(string label)
{
Label = label;
}
}

public class ClickableListDrawer : OdinAttributeDrawer where T: BaseEntry
{
protected override void DrawPropertyLayout(GUIContent label)
{
this.LogInfo("Drawing");
List entries = ValueEntry.SmartValue;

if (entries == null)
{
entries = new List();
ValueEntry.SmartValue = entries;
}

//
for (int i = 0; i < entries.Count; i++)
{
T entry = entries[i];

SirenixEditorGUI.BeginBox(entry ? entry._Name : "New Entry");
{
if (entry == null)
{
if (GUILayout.Button("Create New " + typeof(T).Name))
{
entry = ScriptableObject.CreateInstance();
AssetDatabase.CreateAsset(entry, $"Assets/New{typeof(T).Name}.asset");
AssetDatabase.SaveAssets();
entries[i] = entry;
}
}
else
{
entry._Name = EditorGUILayout.TextField("Name", entry._Name);
entry._ID = EditorGUILayout.TextField("ID", entry._ID);
}

if (GUILayout.Button("Remove"))
{
entries.RemoveAt(i);
break;
}
}
SirenixEditorGUI.EndBox();
}
}
}
К достоинству:

Атрибут «ClickableListAttribute» нельзя поместить в свойство «_ability» базового типа «Список».

Это информация, которую я получаю в инспекторе при проверке этого списка. Этот атрибут работает нормально, если я помещаю List в параметр TValue ClickableListDrawer, но перестает работать, если я хочу, чтобы он работал со всеми классами, которые наследуются от BaseEntry. Есть решение?

Подробнее здесь: https://stackoverflow.com/questions/795 ... r-for-list
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»