【问题标题】:Click Event Always getting only the last instantiated object (C# UNITY)单击事件总是只获取最后一个实例化的对象(C# UNITY)
【发布时间】:2019-01-03 01:41:34
【问题描述】:

我知道这可能是 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

【问题讨论】:

  • 我把Button button = o.GetComponent&lt;Button&gt;()放在for循环下面是不是@Programmer
  • @Programmer 顺便说一句,先生,它是一个sprite,它有一个ui button
  • 是的,我正在使用 NGUI,所以您的代码是不可能的先生?
  • 这很奇怪。我不完全确定NGUI。但是代码中的某处调用了TestClickEvent()', which is being assigned to all buttons, pointing to the last instantiated object. If that's all your code, then it would seem it's in NGUITools.SetActive(o, true);`,但这没有任何意义。
  • 您必须张贴附有组件的游戏对象的屏幕截图。如果您使用的是 NGUI,请忘记它,因为我已经很长时间没有使用它并且不再使用它了。这仅适用于 Unity 的 UI

标签: c# unity3d ngui


【解决方案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 真的没有明确的例子,所以希望通过很多东西来完成一个简单的任务。

【讨论】:

  • 我会试试这个,因为在 box collider 2d 我的解决方案不起作用
【解决方案2】:

找到了我的解决方案而不是 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);
    }        
}

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    相关资源
    最近更新 更多