GetComponent Unity по строке (или другим методом, передаваемым из другого скрипта) - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь использовать как можно меньше сценариев, поэтому я создаю экземпляр (пример :) Button с buttonScript prefab из Spawner с spawnerScript.При нажатии Button (обнаруженном в buttonScript) я хочу, чтобы определенная функция вызывалась в spawnerScript - но без определения Spawner или spawnerScript пользователем в buttonScript.Они могут быть введены в этот скрипт, но не могут быть напечатаны в скрипте или определены в редакторе Unity.Как мне это сделать?

tl; dr - как вызвать функцию в другом скрипте, не вводя имя скрипта в GetComponent вручную?Я ищу целевой скрипт для GetComponent.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вы можете передать делегата кнопке

 public class Spawner : MonoBehaviour{

       void Start(){
             GameObject btn = Instantiate<GameObject>(btnPrefab);
             btn.GetComponent<Button>().onClick.AddListener(Method);
        }
        void Method(){}
 }

РЕДАКТИРОВАТЬ на основе комментария:

"кнопка содержит очень простой скрипт, содержащий только один GameObject ( назначенный при создании экземпляра)) "

Итак, вы передаете GameObject при создании экземпляра.Давайте рассмотрим в следующем примере, что эта цель дается из GetTarget () (я не знаю, как вы ее получили)

void Start()
{
    for(int i = 0 ; i < 100; i++)
    {
         GameObject btn = Instantiate<GameObject>(btnPrefab);
         GameObject target = GetTarget();
         btn.GetComponent<Button>().onClick.AddListener(()=>
         {
             Method(target);
         });
    }
}
void Method(GameObject obj)
{
    Debug.Log(obj.name);
}

Концепция, которую нужно захватить, - это лямбда-выражение со стрелкой.Это можно понимать как метод без имени, который используется только там (так как у него нет имени, его нельзя вызывать в другом месте).Этот метод возвращает void и не имеет параметров, поэтому он соответствует требованиям прослушивателя Button.В этом безымянном методе вы вызываете другой метод, который принимает цель GameObject.Здесь создается замыкание, поэтому даже объект Button не знает о цели, он находит его.

Сначала не все так просто, но вы его получите.

0 голосов
/ 19 сентября 2018

Сделайте ваш скрипт Spawner статическим, чтобы всегда был только один, и вы можете получить к нему доступ с помощью класса вместо переменной.

, а затем

GameObject.GetComponent (). DoMethod();

его

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