最近一個項目用到了需要動態創建Button用來顯示點擊按鈕和項目中設備的名字。下面我講一下對於動態生成需要哪幾步。
1.首先,在Unity3D工程Asset下創建一個空文件夾Resources(注意:名字不要寫錯,這個是特殊文件夾);

2. 然后將想要加載的游戲物體放入到Resources中,本次舉例子就用一個Button進行說明,將Button創建好設置好之后,添加在Resources文件夾中,作為Prefabs;

3.創建腳本,掛載在任意一個游戲物體上均可,這里掛載在了Canvas。並且在Panel上添加了Grid Layout Group組建,只是為了方便動態加載Button,Button能自動排列。腳本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ListButton : MonoBehaviour
{
// 創建panel,方便作為Button的父類物體
public GameObject panel;
// 定義一個字符串
[HideInInspector]
public string data = "a,b,c,d,e,f,g,h";
// 定義一個用來分割data存放數據的數組
[HideInInspector]
public string[] datas;
void Awake()
{
// 一般動態資源加載放在Awake中
GameObject button = Resources.Load("Button", typeof(GameObject)) as GameObject;
// 將字符串分割開放在datas數組中
datas = data.Split(',');
for (int i = 0; i < datas.Length; i++)
{
// 給生成的Button賦值
button.name = i.ToString();
// 打印button的名字便於控制台觀看
Debug.Log(button.name);
// 用於給Button子物體Text賦值
string x = datas[i];
button.GetComponentInChildren<Text>().text = x;
// 實例化出button,並設置其父物體
Instantiate(button,panel.transform);
}
}
}
4.然后給腳本組件拖入相對應的物體,此例子讓其父物體設置為了Panel,這樣生成的Button可以得到自動排列;

5.然后點擊運行,結果如下:

可以看出,生成的預設體直接Debug.Log()打印出來的名字是不帶(Clone)的。但是我做的項目中是需要檢測到物體的名字進行判斷的。於是,怎么也檢測不正確。后來我用射線檢測,然后直接打印出射線檢測到的這個物體的名字,發現是有(Clone)的。頓時覺得智商被玩弄了。這也是個小細節,大家注意下。

如有錯誤或者更加好的方法,歡迎大家給我評論。小強會和大家一起進步!
