原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【Unity3D(AR/VR) 334163814】【Unity3D(游戏) 119706192】 本文链接地址: 动态实例化Prefab
之前写过一篇“Unity3D NGUI动态创建按钮”不少人按照我文章中介绍的方法来动态创建按钮,文章那种做法并不好。现在写一遍新的文章来教大家用Prefab的方式来动态创建NGUI按钮(也可以是任何GameObject)。
1.首先要预制好我们要创建的物体:
a.首先创建一个游戏物体。
b.自定义样式并添加自己需要的脚本。
我添加了一个测试代码,当点击按钮的时候把按钮文字替换为buttonID。
using UnityEngine;
using System.Collections;
public class TestButton : MonoBehaviour
{
public int ButtonID = 0;
//点击把按钮问题替换为ButtonID
void OnClick()
{
UILabel buttonLable = GetComponentInChildren<UILabel>();
buttonLable.text = ButtonID.ToString();
}
}
c.讲制作好的物体创建为Prefab。
2.动态创建脚本。
a.脚本。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TestCreat : MonoBehaviour
{
public GameObject ButtonPre;
public int CreatCount = 3;
public float PosY = 0;
public float Padding = 40;
//存储所有动态添加的按钮
[HideInInspector]
public List<TestButton> Buttons = new List<TestButton>();
void Start()
{
CreatButton();
}
void Update()
{
//按下空格键,删除id为1的按钮
if (Input.GetKeyDown(KeyCode.Space))
{
//不能在foreach里面直接删除元素,所以把要删除的元素先记录下来,foreach结束后再删除。
TestButton deleteTB = null;
foreach (TestButton item in Buttons)
{
if (item.ButtonID == 1)
{
deleteTB = item;
break;
}
}
if (deleteTB != null)
Destroy(deleteTB.gameObject);
}
}
void CreatButton()
{
Buttons.Clear();
for (int i = 0; i < CreatCount; i++)
{
Buttons.Add(AddButton());
}
}
TestButton AddButton()
{
GameObject go = NGUITools.AddChild(this.gameObject, ButtonPre);
go.name = "动态" + Buttons.Count;
go.transform.localPosition = new Vector3(go.transform.localPosition.x, PosY + Padding * Buttons.Count, go.transform.localPosition.z);
TestButton tb = go.GetComponent<TestButton>();
tb.ButtonID = Buttons.Count;
return tb;
}
}
b.赋值。
将TestCreat脚本绑定在要创建动态物体的父级。
将做好的Prefab绑定到ButtonPre属性。
之后隐藏掉场景内手动设置的那个原始物体。