如何在Unity中使用C#为运行时创建的游戏对象分配点击监听器?

4

我创建了一个四边形对象。我将这个脚本分配给了包含游戏对象数组的四边形对象:

public class ShapeGrid : MonoBehaviour {
    public GameObject[] shapes;

    void Start(){
        GameObject[,] shapeGrid = new GameObject[3,3];
        StartCoroutine(UpdateGrid());
    }

    IEnumerator UpdateGrid(){
        while (true) {
            SetGrid ();
            yield return new WaitForSeconds(2);
        }
    }

    void SetGrid(){
        int col = 3, row = 3;
        for (int y = 0; y < row; y++) {
            for (int x = 0; x < col; x++) {
                int shapeId = (int)Random.Range (0, 4.9999f);
                GameObject shape = Instantiate (shapes[shapeId]);
                Vector3 pos = shapes [shapeId].transform.position;
                pos.x = (float)x*3;
                pos.y = (float)y*3;
                shapes [shapeId].transform.position = pos;
            }
        }
    }
}

我克隆了这些游戏对象,使它们像这样出现在网格上:

enter image description here

当用户点击一个对象时,它应该消失。我所做的是将此脚本放置在我的游戏对象数组中的每个元素上:

public class ShapeBehavior : MonoBehaviour {
    void Update(){
        if(Input.GetMouseButtonDown(0)){
            Destroy(this.gameObject);
        }
    }
}

但是问题在于,当我点击一个对象来销毁它时,所有克隆的该对象都会被销毁。我只想要销毁指定的克隆体,而不是全部销毁。我该怎么办呢?

1个回答

0
问题出在你的Input调用上,无论鼠标的位置如何,当你点击鼠标按钮时,“Input.GetMouseButtonDown(0)”在每个脚本中都会返回true。将任何类型的碰撞器附加到gameObject并进行设置,然后将脚本与OnMouseDown()方法放在一起,在这里查看更多信息:http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html 你也可以使用射线投射(raycasting),但这是一种更高级的解决方法。
另外,将this.gameObject替换为gameObject即可。

成功了!谢谢。但是它导致了另一个错误。MissingReferenceException:对象类型为“GameObject”的对象已被销毁,但您仍在尝试访问它。 您的脚本应该检查它是否为空,或者您不应该销毁该对象。 - jeanl
你从哪个脚本中获取的? - Neven Ignjic
我分配给Quad的脚本。它来自这一行:GameObject shape = Instantiate(shapes[shapeId]); - jeanl
没事了,我通过在运行时将脚本添加到克隆对象中来解决了它,而不是在运行之前将它们添加到原始对象中,使用这段代码 shape.AddComponent<ShapeBehavior>(); 但问题是,有时候 OnMouseDown() 方法会执行,有时候不会。我无法弄清楚它何时执行,何时不执行。 - jeanl
没事了,我已经解决了。是因为我没有设置Vector3 pos的所有参数。谢谢帮忙! :) - jeanl
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接