原创文章如需转载请注明:转载自 脱莫柔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属性。
之后隐藏掉场景内手动设置的那个原始物体。