Unity的GetComponent按字符串(或通过其他脚本传递的其他方法)(c#)

时间:2018-09-19 17:34:39

标签: c# unity3d unityscript

我正尝试使用尽可能少的脚本,所以我将Button中的buttonScript预制的Spawner实例化为spawnerScript。在单击Button时(在buttonScript中检测到),我希望在spawnerScript中调用特定的功能-但用户未在其中定义SpawnerspawnerScript buttonScript。可以将它们注入此脚本中,但不能在脚本中键入或在Unity编辑器中定义。我该怎么做?

tl; dr-如何在其他脚本中调用函数而不在GetComponent中手动键入脚本名称?我正在寻找为GetComponent注入目标脚本。

2 个答案:

答案 0 :(得分:2)

您可以将委托传递给Button

 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);
}

这里要抓住的概念是带有箭头的lambda表达式。这可以理解为一种没有名称的方法,只能在其中使用(因为它没有名称,因此您无法在其他地方调用它)。该方法返回void并且没有参数,因此它符合Button侦听器的要求。在该无名方法中,您调用另一个采用GameObject目标的方法。在这里创建了一个闭包,因此即使Button对象也不知道目标,它也会找到它。

起初并不那么简单,但是您会明白的。

答案 1 :(得分:1)

将Spawner脚本设为静态,因此始终只有一个脚本,您可以使用Class(而不是可变版本)来访问它。

然后代替

GameObject.GetComponent()。doMethod();

Spawner.doMethod();