Свойство Reference Scriptable Object в Инспекторе Unity3d

Я пытаюсь создать контент для стратегической игры, которую я создаю в Unity3d. В настоящее время я использую Scriptable Objects для создания ресурсов, однако у меня возникла проблема с получением именно того, что мне нужно, когда дело доходит до связывания активов.

Позвольте мне привести хороший пример с некоторым кодом. Допустим, у меня есть здание, которое принимает ресурсы. Так что мой строительный SCO может выглядеть так:

public class buildingSCO : ScriptableObject {
    public string Name;
    public string ID;
    public string Res;
}

И мой ресурс SCO будет выглядеть так:

public class resourceSCO : ScriptableObject {
    public string Name;
    public string ID;
}

Поэтому, когда я создаю ресурс для здания, я бы вручную вводил идентификатор ресурса (или копировал / вставлял). Но меня беспокоит то, что по мере того, как я буду создавать все больше активов, я начну делать ошибки. Я хотел бы иметь возможность открывать селектор объектов и просто выбирать ресурсный ресурс, идентификатор которого я хочу.

1 ответ

Решение

Я не думаю, что Unity будет создавать копии и копии ваших SCO. Просто назовите их так, как вас ожидает Unity, и у вас все будет хорошо.

public class buildingSCO : ScriptableObject
{
    public string Name;
    public string ID;
    public resourceSco Res;
}

Первое правило оптимизации: не оптимизируйте.

Если вам действительно нужно работать с идентификаторами и поисками, вы можете сделать это, создав специальный инспектор.

[CustomEditor(typeof(buildingSCO))]
public class BuildingSCOInspector : Editor
{
    public override void OnInspectorGUI()
    {
        buildingSCO building = target as buildingSCO;

        building.Name = EditorGUILayout.TextField("Name", building.Name);
        building.ID = EditorGUILayout.TextField("ID", building.ID); // or whatever

        // this only shows currently selected resourceSCO.ID
        EditorGUILayout.LabelField("Res (current)", building.Res);

        // this allows selection of another resourceSCO
        resourceSCO resource = EditorGUILayout.ObjectField("Res", null, typeof(resourceSCO), false) as resourceSCO;
        if (resource != null)
        {
            building.Res = resource.ID;
        }
    }
}
Другие вопросы по тегам