Переменные внутри интерфейса или альтернативный способ добавления / требования переменных для различных классов? - PullRequest
1 голос
/ 11 июля 2020

У меня есть проект Unity с постоянно растущим количеством «ресурсов-заполнителей» (таких как ScriptableObjects for Items and Enemies). Так что я подумал, что было бы здорово, если бы я мог как-нибудь; (1) отметьте их как заполнители, а также (2) дайте им ориентировочную стоимость производства. Чтобы проанализировать их все во время сборки / воспроизведения и вывести в журнале что-то вроде этого: «Сборка содержит 125 заполнителей, по оценочной стоимости 3275 долларов США».

Я надеялся, что это будет так же просто, как создание интерфейса, который я мог бы реализовать во всех моих различных классах, которые представляют активы / контент, чтобы дать мне эти дополнительные поля (например, bool isPlaceholder и float costEstimate). Вот так:

namespace PlaceholderInfo
{
    public interface IPlaceholderInfo
    {
        bool isPlaceholder = false;
        float costEstimate = 0f;
    }
}

А затем в Инспекторе появляется что-то вроде этого, которое я мог бы легко редактировать для всех активов:

enter image description here

And later to parse through that data, perhaps using this method https://answers.unity.com/questions/863509/how-can-i-find-all-objects-that-have-a-script-that.html - но сейчас я застрял на ПЕРВОМ шаге, так как я только что узнал (на собственном горьком опыте), что интерфейсы не могут даже иметь поля! : (

Что мне делать? Могу ли я воспользоваться другим подходом?

1 Ответ

0 голосов
/ 11 июля 2020

Вы можете создать класс, наследующий IPlaceholderInfo, следующим образом:

[Serializable]
public class SomeInfo : IPlaceholderInfo 
{
   public bool isPlaceholder = false;
   public float costEstimate = 0f;
}

И после этого просто добавьте эту информацию в некоторый класс MonoBehavior, который наследует некоторый интерфейс, например:

public interface IDataContainer
{
    IPlaceholderInfo[] GetInfo();
}

public class JustAnotherContainer : MonoBehavior, IDataContainer
{
   [SerializedField] private SomeInfo[] someInfo;

   public IPlaceholderInfo[] GetInfo()
   {
      return someInfo;
   }
}

И после этого вы можете найти эти данные так:

public Start()
{
  var data = FindObjectsOfType<MonoBehaviour>().OfType<IDataContainer>();

  //or you can use this if you have only 1 object with data
  var info = gameObject.GetComponentsInChildren<IDataContainer>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...