2017-02-24 5 views
0

これを行う正しい方法は何ですか?ユニティ固有の同じタイプのコンポーネントへのアクセス方法?

は、ここに私のコードですが、私は、これはそれ

public class buttons : MonoBehaviour { 

    public Button play; 
    public Button shop; 
    public Button exit; 

    // Use this for initialization 
    void Start() { 
     Button bplay=play.GetComponent<Button>(); 
     Button bshop=shop.GetComponent<Button>(); 
     Button bexit=exit.GetComponent<Button>(); 
     bplay.onClick.AddListener(()=>loads("level")); 
     bshop.onClick.AddListener(()=>loads("shop")); 
     bexit.onClick.AddListener(()=>loads("exit")); 


    } 
    void loads(System.String scenename) 
    { 
     if(scenename=="level") 
     Application.LoadLevel("level_1"); 
     else if(scenename=="shop") 
      Application.LoadLevel("Shop_menu"); 
     else if(scenename=="exit") 
      Application.Quit(); 
    } 
} 

答えて

1

に最初の問題を行うための正しい方法は、あなたがStart()機能で行ったすべてがされているとは思いません。 play,shopおよびexitの変数はすでにButtonタイプです。 Start()機能で実行したGetComponentのすべてを実行する必要はありません。それらは冗長です。その公共変数を直接使用することができます:play.onClick.AddListener

第2に、stringの代わりにButtonのインスタンスを比較するとよいでしょう。これを行うには、負荷機能をstringではなく、パラメータとしてButtonにする必要があります。

また、Application.LoadLevel関数は非推奨です。新しいシーンを読み込むためにSceneManager.LoadSceneを使用する必要があります。 SceneManager.LoadSceneを使用できるように、先頭にusing UnityEngine.SceneManagement;を含めてください。

最後に、イベントへの登録はOnEnable関数で行う必要があります。 Button.onClick.RemoveListener機能のOnDisable機能でも登録を解除する必要があります。

public class buttons : MonoBehaviour 
{ 
    public Button play; 
    public Button shop; 
    public Button exit; 

    void OnEnable() 
    { 
     play.onClick.AddListener(() => loads(play)); 
     shop.onClick.AddListener(() => loads(shop)); 
     exit.onClick.AddListener(() => loads(exit)); 
    } 

    void OnDisable() 
    { 
     play.onClick.RemoveListener(() => loads(play)); 
     shop.onClick.RemoveListener(() => loads(shop)); 
     exit.onClick.RemoveListener(() => loads(exit)); 
    } 

    void loads(Button buttonPressed) 
    { 
     if (buttonPressed == play) 
      SceneManager.LoadScene("level_1"); 
     else if (buttonPressed == shop) 
      SceneManager.LoadScene("Shop_menu"); 
     else if (buttonPressed == exit) 
      Application.Quit(); 
    } 
} 
+1

ニースの答え。私はあなたがそれをオーバーライドするか、または私がちょうどplay.onClick.AddListener(()=> SceneManager.LoadScene( "level_1"))のような何かをやっていない限り、関数は少し役に立たないと思う。 –

+0

@JuanBayonaBerisoありがとうございました。将来OPは、ボタンを押したときにもっと*のものをやりたいかもしれません。例えば、 'Application.Quit();'の前に保存するか、ネットワークから切断します。これらのすべてのアクションをラムダ式に詰め込む必要があるときは、醜い状態になります。 – Programmer

+0

また、 'AddListener'関数に非常に多くのコードを書く場合、' RemoveListener'関数に同じコードを書く必要があります。この場合、単純に関数を使用しないでコードを2倍にしました。 – Programmer

関連する問題