Как добавить динамический метод из одного класса в другой Unity?

В классе кнопки нужно выполнить метод из другого класса. Два варианта:

  1. Сделать другой класс статичным, но это не даёт сделать gameObject.name в свиче.

    public void Start()
    {
     Statistic.inGameStatistic();
     switch (gameObject.name)
     {
         //case "lvlTxt":
         //    value = SeePerson.monsterId;
         //    break;
    
         case "mHealthTxt":
             value = SeePerson.monsterHealth;
             break;
    
         //case "mArmorTxt":
         //    value = SeePerson.monsterArmor;
         //    break;
    
         case "mStrengthTxt":
             value = SeePerson.monsterStrength;
             break;
     }
    
     text.text = value.ToString();
    }
    
  2. Оставить этот метод динамическим, тут снова два варианта развития событый:

2.1 MonsterStatistic.Start(); код не запускается, ошибка: An object reference is required for the non-static field, method, or property 'MonsterStatistic.Start()'

2.2MonsterStatistic mnS = new MonsterStatistic(); mnS.Start();, здесь код запускается, unity выдаёт предупреждение: You are trying to create a MonoBehaviour using the 'new' keyword., и код выполняется неправильно


Ответы (1 шт):

Автор решения: Yaroslav

На тему ваших вариантов... нет! Их не два и уж явно не те, что вы написали.

У Button есть событие OnClick где можно указать ссылку на любой компонент и его публичный метод с аргументом или без.

Компоненты (MonoBehaviour) привязаны к GameObject и никак не могут быть статическими по своей природе. Но класс может тупо содержать статическую ссылку на один экземпляр.

public class Foo : MonoBehaviour 
{
    public static Foo Main { get; private set; }

    public void Awake () 
    {
        Main = this;
    }

    public void DoSomething () { }
}

if (Foo.Main != null)
    Foo.Main.DoSomething();

Вариантов много, вопрос только в том чё вы хотите сделать... Насколько можно понять, у вас есть некий класс отвечающий за статистику, но не понятно почему он MonoBehaviour... Вам скорее нужен Singleton.

public class Statistics
{
    private static Statistics _instance;

    public static Statistics Instance
    {
        get {
            if (_instance == null)
                _instance = new Statistics();
            return _instance;
        }
    }

    private Statistics ()
    {
        Load();
    }

    public void DoSomething () { }

    private void Load () { }

    private void Save () { }
}

Statistics.Instance.DoSomething();
→ Ссылка