单击事件始终仅获取最后一个实例化的对象(C#UNITY)

时间:2018-07-26 06:34:51

标签: c# unity3d ngui

我知道这可能是How to detect click/touch events on UI and GameObjects的副本,但实际上我尝试了其中的内容。但是我的问题仍然存在。

这是我的代码

GameObject o = null;
private void Start()
{
    for (int i = 0; i < 6; i++)
    {
        o = Instantiate(obj) as GameObject;
        o.transform.SetParent(pos_obj);
        o.transform.localScale = Vector3.one;
        o.transform.name = "chips " + i;

        o.transform.localPosition = new Vector3(0, 0, 0);
        NGUITools.SetActive(o, true);

        UIGridReposition(UIGrid.Sorting.Vertical, true);
    }
}

上面的代码行是我实例化精灵的方式,就像在我的继承体系中一样

  

筹码1

     

筹码2

     

筹码3

     

筹码4

     

筹码5

现在,当我尝试将这段代码放入UI Button

中时
public void TestClickEvent(){
   Debug.Log("This object is :" + o.transform.gameobject.name);
}

现在,当我单击“实例化”对象时,只有chips 5将仅是控制台上的输出。即使我单击第一,第二等Instantiated Object

有人可以帮我吗?

我想做的是获取每个Intantiated Object的指定号码

如果我单击chips 1,它将输出This object is : 1;

2 个答案:

答案 0 :(得分:1)

您正在使用NGUI,检测点击事件的方式与使用Unity UI的方式完全不同。当检测到单击时,可以进行光线投射,但不是推荐的方法。始终为此使用回调事件。

您可以使用UIEventListener进行此操作。

GameObject o = null;
private void Start()
{
    for (int i = 0; i < 6; i++)
    {
        o = Instantiate(obj) as GameObject;
        o.transform.SetParent(pos_obj);
        o.transform.localScale = Vector3.one;
        o.transform.name = "chips " + i;

        o.transform.localPosition = new Vector3(0, 0, 0);
        NGUITools.SetActive(o, true);

        UIEventListener.Get(o).onClick += TestClickEvent;

        UIGridReposition(UIGrid.Sorting.Vertical, true);
    }
}

void TestClickEvent(GameObject sender) 
{ 
    Debug.Log("Clicked: " + sender.name); 
}

那里确实没有NGUI的明确示例,因此希望通过很多工作来完成一个简单的任务。

答案 1 :(得分:0)

找到了解决方案,而不是Camera.main,而尝试了UICamera.currentCamera

public void TestClickEvent()
{
    Vector2 point = UICamera.currentCamera.ScreenToWorldPoint(Input.mousePosition);
    Ray ray = UICamera.currentCamera.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit, 100))
    {
        Debug.Log("I hit something :" + hit.collider.gameObject.name);
    }        
}