유니티 새로운 UI-GUI 요소에 의해 호출되는 기능을 동적으로 변경


17

버튼 OnClick 및 슬라이더 On Value Changed의 값을 동적으로 변경하려고 예 1 예 2합니다.

이것이 어떻게 수행되었는지 추측해야한다면, button / gui 요소에 대한 참조를 얻으십시오. 그런 다음 Button 스크립트 구성 요소를 가져와 해당 함수 호출 목록에 액세스하십시오. 그러나 해당 목록을 수정하는 방법을 잘 모르겠습니다. 누구든지 아이디어가 있습니까?

도움이 될 수있는 추가 정보 :

  • 호출되는 함수는 사용자 정의 스크립트 구성 요소와 별개입니다.
  • 슬라이더에 '동적'변수 옵션 사용
  • 동적 버튼을 만드는 데 사용할 수 있습니다

답변:


23

이벤트를 변경하는 매우 간단한 방법이 있습니다.

편집하다

OnClick이벤트 전용 이벤트를 빠르고 쉽게 추가 할 수있는 다른 답변을 참조하십시오 . 다른 이벤트의 경우 OnDrag아래를 참조하십시오.


또한 기본적으로 제공되는 이벤트 이상의 것을 필요로하는 경우 대신 EventTrigger게임 오브젝트에 a 를 첨부하는 것이 좋습니다 . 이를 통해 BaseEventData이벤트에서 반환 된 객체에 액세스 하여 이벤트를 생성 한 객체와 같은 정보를 얻을 수 있습니다. 그런 다음 다음과 같은 작업을 수행 할 수 있습니다.

//Create an event delegate that will be used for creating methods that respond to events
public delegate void EventDelegate(UnityEngine.EventSystems.BaseEventData baseEvent);

그런 다음 이벤트 처리 방법을 만들 수 있으며 서명은 대리인의 서명과 일치해야합니다. 따라서 첫 번째 유일한 매개 변수로 반환 void하고 수락 해야합니다 BaseEventData.

public void DropEventMethod(UnityEngine.EventSystems.BaseEventData baseEvent) {
    Debug.Log(baseEvent.selectedObject.name + " triggered an event!");
    //baseEvent.selectedObject is the GameObject that triggered the event,
    // so we can access its components, destroy it, or do whatever.
}

마지막으로 이벤트를 동적으로 추가하려면 다음을 수행하십시오.

//Get the event trigger attached to the UI object
EventTrigger eventTrigger = buttonObject.GetComponent<EventTrigger>();

//Create a new entry. This entry will describe the kind of event we're looking for
// and how to respond to it
EventTrigger.Entry entry = new EventTrigger.Entry();

//This event will respond to a drop event
entry.eventID = EventTriggerType.Drop;

//Create a new trigger to hold our callback methods
entry.callback = new EventTrigger.TriggerEvent();

//Create a new UnityAction, it contains our DropEventMethod delegate to respond to events
UnityEngine.Events.UnityAction<BaseEventData> callback =
    new UnityEngine.Events.UnityAction<BaseEventData>(DropEventMethod);

//Add our callback to the listeners
entry.callback.AddListener(callback);

//Add the EventTrigger entry to the event trigger component
eventTrigger.delegates.Add(entry);

버전 5.3.3 이상을 사용하는 경우 위의 마지막 줄 대신이 줄을 사용하면 델리게이트가 감가 상각됩니다 .

eventTrigger.triggers.Add(entry); 

핸들러를 동적으로 추가하면 관리자에 나타나지 않는 것 같습니다. 대표 여전히 쇼 "빈 목록"서랍
vexe

맞습니다. 코드에서 추가 된 처리기는 관리자에 표시된 "지속적"처리기와는 별개입니다. 또한 Unity가 처리하는 영구 핸들러와 달리 이러한 처리기를 정리해야합니다.
Joe Strout

11

그 단어는 delegate{} 이전 답변에서 찾은 구문이 더 이상 사용되지 않는다는 것입니다. 람다 표기법을 사용 하여이 작업을 수행하는 다른 방법이 있습니다.

void buttonSetup(Button button) {
    //Remove the existing events
    button.onClick.RemoveAllListeners();
    //Add your new event using lambda notation
    button.onClick.AddListener (handleButton);
}

void handleButton() {
    Debug.Log("Button pressed!");
}

또는 버튼을 전달하여 좀 더 역동적으로 만들 수 있습니다.

void buttonSetup(Button button) {
    button.onClick.RemoveAllListeners();
    //Add your new event
    button.onClick.AddListener(() => handleButton(button));
}

void handleButton(Button b) {
    Debug.Log("Button '" + b.name + "' pressed!");
}

이 전략은 OnClick이벤트 전용입니다 . 다른 이벤트를 동적으로 추가하려면 다른 답변의 지침을 따라야합니다.
MichaelHouse

0

다음 라인을 따라 새 스크립트를 작성하십시오.

public class EventHandler : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Element: " +
                   eventData.selectedObject.name +
                   " was clicked at " +
                   eventData.position.ToString());
    }
}

이 스크립트는 IPointerClickHandler 인터페이스에서 구현됩니다 ( 사용 가능한 다른 많은 인터페이스 중에서) . 이 스크립트를 UI 요소에 연결하기 만하면이 스크립트가 클릭 이벤트 (또는 인터페이스를 구현하는 모든 이벤트)를 가로 챌 수 있습니다.

다음 단계는이 스크립트를 원하는 UI 요소에 컴포넌트로 동적으로 추가하는 것입니다.

myButton.AddComponent<EventHandler>();

스크립트를 구성 요소로 추가합니다. myButton 다음에 버튼을 클릭하면 클릭 한 버튼과 클릭이 발생한 위치에 대한 정보가 표시됩니다.

이것은 다른 답변과 비교하여 이벤트에 대한 가장 많은 정보를 제공합니다.


0

유니티가 UI를 구현하는 방법은 다른 유니티 구성 요소와 같습니다. 게임 오브젝트를 추가하고 UI 컴포넌트를 부착합니다. 게임 오브젝트가 있으면 UI 컴포넌트를 가져 와서 속성을 변경할 수 있습니다.

UI에 대한 API 참조는 UnityEngine.UI 네임 스페이스에서 찾을 수 있으며, BUtton에 대한 API 참조는 http://docs.unity3d.com/ScriptReference/UI.Button.html입니다.

C # 스크립트에서 UI에 액세스하는 방법에 대한 자세한 내용은 http://blog.trsquarelab.com/2015/03/new-ui-implementation-using-c-scripts.html 게시물을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.