我正尝试使用尽可能少的脚本,所以我将Button
中的buttonScript
预制的Spawner
实例化为spawnerScript
。在单击Button
时(在buttonScript
中检测到),我希望在spawnerScript
中调用特定的功能-但用户未在其中定义Spawner
或spawnerScript
buttonScript
。可以将它们注入此脚本中,但不能在脚本中键入或在Unity编辑器中定义。我该怎么做?
tl; dr-如何在其他脚本中调用函数而不在GetComponent中手动键入脚本名称?我正在寻找为GetComponent注入目标脚本。
答案 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();