prefabのbuttonをCanvasに追加する

「prefabのbuttonをCanvasに追加する」の編集履歴(バックアップ)一覧に戻る

prefabのbuttonをCanvasに追加する - (2015/09/03 (木) 14:10:16) のソース

	GameObject canvas;
	void Start ()
	{
		canvas = GameObject.Find("Canvas");
		Button bt=Resources.Load<Button>("Button");
		Button bt1 = Instantiate( bt );
		bt1.onClick.AddListener( ()=> onButtonClick(1) );
		bt1.transform.SetParent( canvas.transform,false );
	}
	void onButtonClick(int no)
	{
		if(no==1)
			Debug.Log("click!");
	}

AddListenerに引数を追加する方法をググったけどやり方が分からず
ということで、UnityActionとして、関数を呼び出す手続きを登録する手法で上手く行きました。
これで、ボタンを動的に生成しつつ、クリックした時の処理は一つの関数でまとめて定義できます。


動的にボタンを複数作って、位置も指定する
	GameObject canvas;
	void Start ()
	{
		canvas = GameObject.Find("Canvas");
		Button bt=Resources.Load<Button>("Button");
		Button[] btt=new Button[10];

		for(int i=0;i<=4;i++)
		{
			btt[i] = makeButton(bt,"Ans"+i.ToString(),0f,50f*i);
			btt[i].onClick.AddListener( ()=> onButtonClick(i) );
		}
}
	void Update () {
	}
	Button makeButton(Button bt,string s,float x,float y)
	{
		Button bt1 = Instantiate( bt );
		bt1.transform.SetParent( canvas.transform,false );
		RectTransform _rt = bt1.GetComponent<RectTransform>();
		Vector2 pos = _rt.anchoredPosition;
		pos.y = Screen.height * 0.5f - _rt.rect.height * 0.5f - y;
		pos.x = x;
		_rt.anchoredPosition = pos;

		foreach (Transform child in bt1.transform){
			if(child.name == "Text"){
				Text target = child.gameObject.GetComponent<Text>();
				target.text = s;
			}
		}

		return bt1;
	}
	void onButtonClick(int no)
	{
		if(no==1)
			Debug.Log("click!");
	}