Нажмите «Событие» Всегда получайте только последний созданный объект (C# UNITY)

Я знаю, что это может быть дубликат Как обнаружить щелчок/ сенсорные события в пользовательском интерфейсе и 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;


person Ketskie    schedule 26.07.2018    source источник
comment
Я поставил Button button = o.GetComponent<Button>() под циклом for, правильно ли @Programmer   -  person Ketskie    schedule 26.07.2018
comment
@Programmer Кстати, сэр, это sprite, у которого есть ui button   -  person Ketskie    schedule 26.07.2018
comment
да, я использую NGUI, так что ваш код невозможен, сэр?   -  person Ketskie    schedule 26.07.2018
comment
Странно. Я не совсем уверен в 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);`, но это не имеет смысла.   -  person Milan Egon Votrubec    schedule 26.07.2018
comment
Вы должны опубликовать скриншот GameObject с прикрепленными к нему компонентами. Забудьте об этом, если вы используете NGUI, так как я давно с ним не работал и больше им не пользуюсь. Это будет работать только с пользовательским интерфейсом Unity.   -  person Programmer    schedule 26.07.2018
comment
Так что это все еще бесполезно, я думаю. Потому что я использую NGUI   -  person Ketskie    schedule 26.07.2018
comment
@Programmer Я видел этот пост, и ты действительно помог ему. https://stackoverflow.com/questions/44579727/raycast-wont-hit-collider-after-using-ngui . Но может понять остальную часть кода, который он использовал   -  person Ketskie    schedule 26.07.2018
comment
Я знаю, что вы нашли решение, но я думаю, что вам следует использовать встроенную систему событий вместо raycast при обнаружении кликов по объектам пользовательского интерфейса. Я копался в своем старом коде и кое-что нашел. Если это не сработает, используйте свой метод raycast   -  person Programmer    schedule 26.07.2018


Ответы (2)


Вы используете NGUI, и способ обнаружения события клика полностью отличается от того, как вы использовали бы пользовательский интерфейс Unity. При обнаружении клика может работать raycast, но это не рекомендуемый способ. Всегда используйте для этого события обратного вызова.

Вы можете сделать это с помощью 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, поэтому ожидайте, что вам придется пройти через множество вещей, чтобы выполнить простую задачу.

person Programmer    schedule 26.07.2018
comment
Я попробую это, потому что на коллайдере 2d мое решение не работает. - person Ketskie; 26.07.2018

Нашел свое решение вместо 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);
    }        
}
person Ketskie    schedule 26.07.2018