유니티 이벤트트리거 > 이벤트추가 질문입니다.
조회수 5395회
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
댓글 입력