首页 > 解决方案 > 设置 Instatiated 按钮的 OnClick,以设置游戏对象变量?统一 C#

问题描述

大家好!由于我的问题的独特性,第一次使用 Stack Overflow。

我目前正在根据场景中有多少带有特定脚本的游戏对象来实例化一个按钮。我将如何确保实例化按钮的 onClick,将父脚本的空游戏对象 var 设置为(i)游戏对象(物理炮塔)?

private void Start()
{
    Turret_Script[] turretsOnTank = FindObjectsOfType<Turret_Script>();

    for (int i = 0; i < turretsOnTank.Length; i++)
    {
        GameObject turretButton = Instantiate(testingTurretButton, gameObject.transform.GetChild(0).GetChild(0).gameObject.transform);
        turretButton.transform.GetChild(0).GetComponent<Text>().text = turretsOnTank[i].name;
        turretButton.transform.position = new Vector3(150 + (100 * i), 330);

        //This is where I assume I'd make a button var based off of the turretButton var.

        //This is where I assume I'd change the OnClick of the button.
    }
}

标签: c#unity3d

解决方案


如果您使用的按钮是Button,您可以这样做:

for (int i = 0; i < turretsOnTank.Length; i++)
{
    GameObject turretButton = Instantiate(testingTurretButton, gameObject.transform.GetChild(0).GetChild(0).gameObject.transform);
    turretButton.transform.GetChild(0).GetComponent<Text>().text = turretsOnTank[i].name;
    turretButton.transform.position = new Vector3(150 + (100 * i), 330);
    turretButton.GetComponent<Button>().onClick.AddListner(
        () => turretHolder = turretsOnTank[i]);
}

() => turretHolder = turretsOnTank[i]是将turretHolder字段设置为 的 lambda turretsOnTank[i],它i是炮塔的索引。

顺便说一句,您的代码看起来需要一些改革。GetChild()返回变换,所以你不需要做GetChild(0).gameObject.transform变换。就够GetChild(0)了。

而且,transform字段已经存在于 中MonoBehaviour,因此您无需transform通过gameObject.

并且,Instantiate可以返回Transform类型,如果 prefab 是Transform. 因此,您的代码将是:

    Transform turretButton = Instantiate(testingTurretButton.transform, gameObject.transform.GetChild(0).GetChild(0));
    turretButton.GetChild(0).GetComponent<Text>().text = turretsOnTank[i].name;
    turretButton.position = new Vector3(150 + (100 * i), 330);
    turretButton.GetComponent<Button>().onClick.AddListner(
        () => turretHolder = turretsOnTank[i]);

哪个冗余更少。


推荐阅读