2017-10-31 7 views
1

OnSelect()ドロップダウン要素のイベントに機能を追加したいとします。Unity3d - 別のスクリプトでイベントを定義する

通常、私はただ、特定のドロップダウンゲームオブジェクトに新しいスクリプトを追加します。

Dropdown script

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using UnityEngine.EventSystems; 

public class LanguageDropdown : MonoBehaviour, ISelectHandler// required interface when using the OnSelect method. 
{ 
    //Do this when the selectable UI object is selected. 
    public void OnSelect(BaseEventData eventData) 
    { 
     Debug.Log(this.gameObject.name + " was selected"); 
    } 
} 

ヒント:ドロップダウンを選択し取得した場合、スクリプトは、単にメッセージを出力します。


質問:それは別のスクリプト内の機能を定義することは可能ですか? など。私は、この特定のドロップダウンゲームオブジェクトを参照している親の親「Menue」にスクリプトを添付しています。

別のスクリプト内でOnSelectを定義するにはどうすればよいですか?

PS:これは正しい質問ですか、代わりにgamedevelopementで質問してください。

+0

良いですがユニティイベントは遅いですし、私はそれがなぜEventTriggerが遅いのかと思いますそれはおそらくそこに使用されているnce – Programmer

+1

@プログラマー、私はあなたのコメントが間違ったセクションに着地したと思う;) – Black

+1

笑そうです。これは、[Unity Marty]を使用する[Ed Marty](https://stackoverflow.com/a/47040648/3785314)の回答に対して行われたもので、私は急いでいました。私は彼がそれを見たと思う。 – Programmer

答えて

2

使用イベントとデリゲート。新しい場合は、hereの簡易チュートリアルをご覧ください。

それはこのようなものでなければなりません:あなたのLanguageDropdownスクリプトにそれを追加し、この取得する必要

public delegate void SelectAction(GameObject target); 
public static event SelectAction OnSelectedEvent; 

:今

public class LanguageDropdown : MonoBehaviour, ISelectHandler// required interface when using the OnSelect method. 
{ 
    public delegate void SelectAction(GameObject target); 
    public static event SelectAction OnSelectedEvent; 

    //Do this when the selectable UI object is selected. 
    public void OnSelect(BaseEventData eventData) 
    { 
     Debug.Log(this.gameObject.name + " was selected"); 

     //Invoke Event 
     if (OnSelectedEvent != null) 
     { 
      OnSelectedEvent(this.gameObject); 
     } 
    } 
} 

を、あなたが購読することができますし、中にイベントに非購読OnEnableおよびOnDisableはそれぞれ別のスクリプトのスクリプトです:

void OnEnable() 
{ 
    //subscribe to event 
    LanguageDropdown.OnSelectedEvent += SelectAction; 
} 

void OnDisable() 
{ 
    //Un-subscribe to event 
    LanguageDropdown.OnSelectedEvent -= SelectAction; 
} 

//This will be called when invoked 
void SelectAction(GameObject target) 
{ 
    Debug.Log(target.name + " was selected"); 
} 

は基本的に私は、私はゲームオブジェクトにスクリプト LanguageDropdownを添付することを強制していた場合、またはこれがその 特定のドロップダウンに接続されていない別のスクリプトから 缶セットアップのすべてを必要とし、Iされていない場合は知りたいと思いました。

いいえ、あなたは以下のようなイベントを登録するEventTriggerクラスを使用することができますし、それぞれのオブジェクトに添付する必要はありません。

EventTrigger.Entry entry = new EventTrigger.Entry(); 
entry.eventID = EventTriggerType.Select; 
entry.callback.AddListener((eventData) => { SelectAction(); }); 

してください、はそれを使用しません。それは遅いですし、私は複数の人々からもこれを確認しました。

+0

私は私の質問ではっきりしていなかったと思います。基本的に私はドロップダウンゲームオブジェクトにスクリプト 'LanguageDropdown'を付ける必要があるかどうかを知りたかったのですが、これが必須ではなく、ドロップダウンを参照するだけでその特定のドロップダウンにはない別のスクリプトそのスクリプトからgameオブジェクトを削除します。 – Black

1

publicメソッドを別のスクリプトで定義し、それをint OnSelect()という実装と呼び出すことができます。例えば

public interface IDropdownContext 
{ 
    void OnDropdownSelected(BaseEventData eventData); 
} 

public class Test : MonoBehaviour, IDropdownContext 
{ 

    public void OnDropdownSelected(BaseEventData eventData) 
    { 
     Debug.Log("OnDropdownSelected"); 
    } 
} 


public class LanguageDropdown : MonoBehaviour, ISelectHandler// required interface when using the OnSelect method. 
{ 
    [SerializeField] 
    public Test context; 

    //Do this when the selectable UI object is selected. 
    public void OnSelect(BaseEventData eventData) 
    { 
     Debug.Log(this.gameObject.name + " was selected"); 

     context.OnDropdownSelected(eventData); 
    } 
} 
2

ユニティ中心の解決策は、UnityEventを使用して、インスペクタでこれらの変更を行うことです。

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using UnityEngine.EventSystems; 

public class LanguageDropdown : MonoBehaviour, ISelectHandler// required interface when using the OnSelect method. 
{ 
    public UnityEvent Selected; 

    //Do this when the selectable UI object is selected. 
    public void OnSelect(BaseEventData eventData) 
    { 
     Debug.Log(this.gameObject.name + " was selected"); 
     Selected.Invoke(); 
    } 
} 

そしてLanguageDropdownコンポーネントは、次いで、(多くのボタンのように)オブジェクト及びメソッドターゲットを割り当てることができるインスペクタの可視選択さ部材を有するであろう。

Component with *Selected()* member visible

注:ソースオブジェクトを作成する場合、UnityEvent<LanguageDropdown>UnityEventを変更することができます。

public class LanguageDropdown : MonoBehaviour, ISelectHandler// required interface when using the OnSelect method. 
{ 
    public UnityEvent<LanguageDropdown> Selected; 

    //Do this when the selectable UI object is selected. 
    public void OnSelect(BaseEventData eventData) 
    { 
     Debug.Log(this.gameObject.name + " was selected"); 
     Selected.Invoke(this); 
    } 
} 

ターゲットメソッドは、すなわち(正しいパラメータリストに

を持っている必要がありますpublic void method(LanguageDropdown dropdown)

関連する問題