Могу ли я получить доступ к монобиховому скрипту из не монобихического скрипта? - PullRequest
0 голосов
/ 01 мая 2019

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

Есть идеи?

public class myClass1 : monoBehaviour
{
  public String text = "hello";
}

public class myClass2
{
  private myClass1 monoClass = new myClass1();

  private void Start()
  {
    Debug.Log(monoClass.text);
  }
}
//THIS DOES NOT WORK

Ответы [ 3 ]

0 голосов
/ 15 мая 2019

Ух ты, я не знал, что вы можете передать их в качестве параметров.Это полезно знать, однако в моем проекте это не сработало бы, так как я вызывал метод из другого сценария, отличного от MB, на который нигде не ссылался сценарий MB, чтобы я мог передать его.

Я создал пустой игровой объект и прикрепил скрипт в качестве компонента, а затем использовал класс из сценария non_MB.

3 строки кода:

GameObject obj = new GameObject();
obj.AddComponent<MyScript1>();
MyScript1 myscript1 = obj.GetComponent<MyScript1>();

Прекрасно работает какgameobjects не ограничен MB.

Надеюсь, что это поможет кому-то еще

0 голосов
/ 15 мая 2019

В качестве альтернативы GetComponent подхода @Zaine я бы хотел добавить шаблон синглтона в пул возможных ответов:

public class SomeClass : MonoBehaviour {
    private static SomeClass _instance;
    public String text = "singleton text";

    public static SomeClass Instance { get { return _instance; } }
    private void Awake()
    {
        if (_instance != null && _instance != this)
        {
            Destroy(this.gameObject);
        } else {
            _instance = this;
        }
    }
}

Это работает, только если у вас есть ровно один этих сценариев. Но из всех других скриптов вы можете легко получить к нему доступ:

public class SomeOtherClass : MonoBehaviour {
     private void Start(myClass1 mc1)
     {
         Debug.Log(SomeClass.Instance.text);
     }
}
0 голосов
/ 01 мая 2019

Да, но ...

Вы не можете вызвать new для любого сценария, который наследуется от MonoBehaviour из-за необходимости подключения к игровому объекту. Таким образом, вы не можете создавать ссылки, но вы можете абсолютно разослать их:

public class myClass1 : monoBehaviour
{
  public String text = "hello";
}

public class myClass2
{
  private void Start(myClass1 mc1)
  {
    Debug.Log(mc1.text);
  }
}

Теперь, myClass2#Start будет трудно вызвать в этом примере, но он скомпилируется.

Я делаю подобные вещи в своих проектах все время. У меня обычно есть один класс, который является компонентом MonoBehaviour, который присоединен к основной камере с статическим полем экземпляра , на который я могу ссылаться из любого другого места, хотя большинство сценариев не-MB не имеют дело с объектами Unity большую часть времени (они содержат только данные, и один из классов менеджера обрабатывает обновление игровых объектов этими данными, поддерживая словарь между ними). ​​

Хотя иногда объект содержит свою собственную ссылку GO (результат попытки разных вещей посмотреть, что сработало или желание избежать поиска в словаре - независимо от того, был ли он эффективным или нет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...