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

조회수 5367회
   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개의 버튼기능을 각각의 이벤트트리거에 추가하려는데 포인터클릭까지는 각각추가가 되는데 이벤트는 적용이안되어 질문올립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

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>();
    
    • 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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)