2017-02-24 34 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,shopexit變量已經是Button類型。不需要執行Start()函數中的所有GetComponent。那些是多餘的。您可以直接使用該公共變量:play.onClick.AddListener

其次,最好比較Button而不是string的實例,因爲速度更快。要做到這一點,您應該使加載功能以Button作爲參數而不是string

此外,Application.LoadLevel功能現在已經過時。現在應該使用SceneManager.LoadScene加載新場景。確保在頂部包含using UnityEngine.SceneManagement;,以便您可以使用SceneManager.LoadScene

最後,註冊到一個事件應在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();'之前保存或從網絡斷開連接。當你必須將所有這些操作填入lambda表達式時,它變得很難看。 – Programmer

+0

另外,如果你在'AddListener'函數中寫了這麼多的代碼,你將不得不在'RemoveListener'函數中編寫相同的代碼。在這種情況下,通過簡單地不使用函數就可以使代碼翻倍。 – Programmer

相關問題