Unity3D之Prefab的制作

来源:互联网 发布:八爪鱼淘宝采集器贴吧 编辑:程序博客网 时间:2024/05/17 23:02

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【Unity3D(AR/VR) 334163814】【Unity3D(游戏) 119706192】 本文链接地址: 动态实例化Prefab


之前写过一篇“Unity3D NGUI动态创建按钮”不少人按照我文章中介绍的方法来动态创建按钮,文章那种做法并不好。现在写一遍新的文章来教大家用Prefab的方式来动态创建NGUI按钮(也可以是任何GameObject)。


1.首先要预制好我们要创建的物体:

a.首先创建一个游戏物体。


b.自定义样式并添加自己需要的脚本。


我添加了一个测试代码,当点击按钮的时候把按钮文字替换为buttonID。
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class TestButton : MonoBehaviour   
  5. {  
  6.     public int ButtonID = 0;  
  7.   
  8.     //点击把按钮问题替换为ButtonID  
  9.     void OnClick()  
  10.     {  
  11.         UILabel buttonLable = GetComponentInChildren<UILabel>();  
  12.         buttonLable.text = ButtonID.ToString();  
  13.     }  
  14. }  

c.讲制作好的物体创建为Prefab。


2.动态创建脚本。

a.脚本。

  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5. public class TestCreat : MonoBehaviour   
  6. {  
  7.     public GameObject ButtonPre;  
  8.     public int CreatCount = 3;  
  9.     public float PosY = 0;  
  10.     public float Padding = 40;  
  11.   
  12.     //存储所有动态添加的按钮  
  13.     [HideInInspector]  
  14.     public List<TestButton> Buttons = new List<TestButton>();  
  15.   
  16.   
  17.     void Start()  
  18.     {  
  19.         CreatButton();  
  20.     }  
  21.   
  22.     void Update()  
  23.     {  
  24.         //按下空格键,删除id为1的按钮  
  25.         if (Input.GetKeyDown(KeyCode.Space))  
  26.         {  
  27.             //不能在foreach里面直接删除元素,所以把要删除的元素先记录下来,foreach结束后再删除。  
  28.             TestButton deleteTB = null;  
  29.             foreach (TestButton item in Buttons)  
  30.             {  
  31.                 if (item.ButtonID == 1)  
  32.                 {  
  33.                     deleteTB = item;  
  34.                     break;  
  35.                 }  
  36.             }  
  37.             if (deleteTB != null)  
  38.                 Destroy(deleteTB.gameObject);  
  39.         }  
  40.     }  
  41.   
  42.     void CreatButton()  
  43.     {  
  44.         Buttons.Clear();  
  45.         for (int i = 0; i < CreatCount; i++)  
  46.         {  
  47.             Buttons.Add(AddButton());  
  48.         }  
  49.     }  
  50.   
  51.     TestButton AddButton()  
  52.     {  
  53.         GameObject go = NGUITools.AddChild(this.gameObject, ButtonPre);  
  54.         go.name = "动态" + Buttons.Count;  
  55.         go.transform.localPosition = new Vector3(go.transform.localPosition.x, PosY + Padding * Buttons.Count, go.transform.localPosition.z);  
  56.   
  57.         TestButton tb = go.GetComponent<TestButton>();  
  58.         tb.ButtonID = Buttons.Count;  
  59.         return tb;  
  60.     }  
  61. }  

b.赋值。

将TestCreat脚本绑定在要创建动态物体的父级。
将做好的Prefab绑定到ButtonPre属性。
之后隐藏掉场景内手动设置的那个原始物体。


3.结果测试。

a.开始运行,创建了CreatCount个按钮,分别取名,Y轴由PosY开始,每个按钮间距Padding。


b.点击按钮,按钮Label改变为ButtonID。


c.按下空格键删除ButtonID为1的按钮。

0 0
原创粉丝点击