유니티 이벤트트리거 > 이벤트추가 질문입니다.


   public void CreateObject()
    {
        int randomType = UnityEngine.Random.Range(0, 2);

        GameObject temp = (GameObject)Instantiate(Resources.Load("Prefabs/Object"));

        int randomItem;
        temp.AddComponent<ItemScript>();
        ItemScript newItem = temp.GetComponent<ItemScript>();
        switch (randomType)
        {
            case 0:
                randomItem = UnityEngine.Random.Range(0, ObjectManager.Instance.ItemContainer.Foods.Count);
                newItem.Item = ObjectManager.Instance.ItemContainer.Foods[randomItem];

                break;
            case 1:
                randomItem = UnityEngine.Random.Range(0, ObjectManager.Instance.ItemContainer.Rides.Count);
                newItem.Item = ObjectManager.Instance.ItemContainer.Rides[randomItem];

                break;
        }
        temp.transform.SetParent(GameObject.Find("ObjectCanvas").gameObject.transform);
    }

버튼 클릭시 오브젝트가 생성됩니다. 오브젝트가 생성되며 아래와같은 itemscript 스크립트를 추가해주고요. itemscript에는 아이템에 따라 저장되어있는 정보가 담겨지게됩니다. 아래는 itemscript의 일부입니다.

  void Start()
    {
        transform.name = Item.ItemName;
        transform.localPosition = new Vector3(200, 100);
        actionPanel = transform.GetChild(2).gameObject;
        speechBubble = transform.GetChild(1).gameObject;

        for (int i = 0; i < transform.GetChild(2).childCount; i++)
        {
            string[] str = transform.GetChild(2).GetChild(i).name.Split( );
            string order = str[0];

            EventTrigger trigger = actionPanel.transform.GetChild(i).GetComponent<EventTrigger>();
            EventTrigger.Entry entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerClick;
            if (i == 0)
            {
                entry.callback.AddListener((eventData) => { EAT(); });
                trigger.triggers.Add(entry);
            }
            else if (i == 1)
            {
                entry.callback.AddListener((eventData) => { this.GetComponent<ItemScript>().GRAB(); });
                trigger.triggers.Add(entry);
            }
            else if (i == 2)
            {
                entry.callback.AddListener((eventData) => { this.GetComponent<ItemScript>().TALK(); });
                trigger.triggers.Add(entry);
            }
            else if (i == 3)
            {
                entry.callback.AddListener((eventData) => { transform.GetComponent<ItemScript>().USE(); });
                trigger.triggers.Add(entry);
            }

        }
    }

오브젝트의 자식에는 4개의 선택지가 딸려있습니다. itemscript에 있는 4개의 버튼기능을 각각의 이벤트트리거에 추가하려는데 포인터클릭까지는 각각추가가 되는데 이벤트는 적용이안되어 질문올립니다.

  • 2016년 08월 04일에 작성됨

조회수 478


1 답변


추가 답변

다른 예제를 찾아보니 아래와 같이 명시적으로 callback에 TriggerEvent 객체를 생성해 주더군요. 이 방법으로 한 번 시도해 보세요.

    public EventTrigger et;

    void Start () {
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerClick;
        entry.callback = new EventTrigger.TriggerEvent();
        UnityEngine.Events.UnityAction<BaseEventData> call = new UnityEngine.Events.UnityAction<BaseEventData>(abc);
        entry.callback.AddListener(call);

        et.triggers.Add(entry);
    }

    void abc(UnityEngine.EventSystems.BaseEventData baseEvent){
        Debug.Log ("abc");
    }

기존 답변

포인터클릭까지는 각각 추가가 되는데 이벤트는 적용이 안된다는게 이렇게 inspector view에서 포인터 클릭까지는 나온다는 말인가요?

이미지

작성하신 코드대로라면 EAT();, GRAB()등의 메소드가 호출이 되어야 하는데요.

의심할 수 있는 부분은

(1) i < transform.GetChild(2).childCount이 실행 조건인 for문이 제대로 도는게 맞는지 확인해 보세요.

(2) 클릭 이벤트를 먼저 가져가는 다른 UI Element가 있는지 확인해 보세요. 예를들어 두개의 버튼이 겹쳐 있는경우 뒤에 있는 버튼이 안눌릴 수 있습니다.


추가로 AddComponent를 하면 추가된 Component를 return해 주기 때문에 Component를 추가하는 부분은 이렇게 줄일 수 있습니다.

//temp.AddComponent<ItemScript>();
//ItemScript newItem = temp.GetComponent<ItemScript>();
//아래와 같이 한 줄로 
ItemScript newItem = temp.AddComponent<ItemScript>();
  • 2016년 08월 05일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 1. 총 4개의 자식으로 4개 모두 포인터클릭 추가가 됩니다. 디버그도 확인했구요. 2. 모든 트리거에 이벤트 데이타가 추가가 안되어 버튼 클릭 역시 모두 안됩니다. 이상합니다. 인스펙터 상으로 수동으로 넣어주면 이상없이 들어가는데요    정우진   2016.8.5 10:00     
  • 답변을 수정했습니다.    정두식   2016.8.5 13:58     
  • 다른 방법으로 처리했습니다. 감사합니다.    정우진   2016.8.9 15:42     
  • @정우진님 어떤 문제였는지 알려주실 수 있나요? 궁금하네요.    정두식   2016.8.10 01:54     
  • @정두식님 정확한 원인을 찾지못하였고 중요한 부분은 아니기에 무식한 방법으로 우선 처리했습니다.    정우진   2016.8.12 12:55     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close