Свойство 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;
}
}
}