Unityの新しいUI-GUI要素によって呼び出される機能を動的に変更します


17

OnClickボタンとOn Value Changedスライダーの値を動的に変更しようとしています 例1 例2

これがどのように行われたかを推測する必要がある場合は、button / gui要素への参照を取得します。次に、ボタンスクリプトコンポーネントを取得し、その関数呼び出しのリストにアクセスします。ただし、そのリストを変更する方法がわかりません。誰にもアイデアはありますか?

役立つ可能性のある詳細:

  • 呼び出される関数は、カスタムスクリプトコンポーネントの一部です
  • スライダーに「動的」変数オプションを使用する
  • 動的ボタンの作成に使用できます

回答:


23

イベントを変更する非常に簡単な方法があります。

編集

イベントのOnClickイベントのみをすばやく簡単に追加する方法については、他の回答を参照してください。他のイベントOnDragについては、以下をご覧ください。


さらに、デフォルトで提供されているイベント以上のものが必要な場合は、代わりEventTriggerにをゲームオブジェクトにアタッチすることをお勧めします。これにより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 14

そのとおりです。コードから追加されたハンドラーは、インスペクターに表示される「永続的な」ハンドラーとは別のものです。さらに、これらのハンドラーをクリーンアップする必要があります(Unityが処理する永続的なハンドラーとは異なります)。
ジョー・ストラウト

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イベント専用です。他のイベントを動的に追加するには、他の回答の指示に従う必要があります。
マイケルハウス

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を実装する方法は、他のユニティコンポーネントと同じです。GameObjectを追加し、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.