• NGUI学习笔记(四):动态加载UI和NGUI事件


    动态加载UI

    我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿、2.所有UI都在场景中导致占用大量的内存。

    所以我们需要对UI组件进行动态加载和销毁,当需要打开指定的UI时,动态的创建出这个UI对象,而当关闭这个UI对象之后,可以对其进行销毁从而释放出内存。

    将UI制作成一个预制件

    我们可以在场景中制作好一个UI,然后将其保存成一个预制件后从场景中移除,然后我们使用这个UI就可以和使用Unity中任意的预制件一样了。

    特别需要注意的是,当存在重复的UI时都要将其作为一个预制件来使用,比如背包的格子或各种列表的列表项。

    我们直接看一个简单的例子:

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 public class LoadUI : MonoBehaviour
     5 {
     6     //加载的 UI 的父对象
     7     public GameObject uiParent;
     8 
     9     //加载后创建的 UI 对象
    10     public GameObject ui;
    11 
    12     void Start()
    13     {
    14         //加载制作好的 UI 的预制件
    15         GameObject go = Resources.Load<GameObject>("UI/BagPlane");
    16 
    17         //添加到 uiParent 的第一种方法
    18         GameObject uiGO = Instantiate(go, uiParent.transform.position, uiParent.transform.rotation) as GameObject;
    19         uiGO.transform.SetParent(uiParent.transform);
    20 
    21         //添加到 uiParent 的第二种方法, 其实就是 NGUI 中对于第一种方法的封装
    22         GameObject uiGO = NGUITools.AddChild(uiParent, go);
    23 
    24         ui = uiGO;
    25     }
    26 
    27     void Destroy()
    28     {
    29         //销毁 UI 对象
    30         Destroy(ui);
    31     }
    32 }

    NGUI事件

    EventDelegate

    NGUI在3.x版本里对底层的事件进行了一次大的修改,其中最重要的就是将老版本的SendMessage修改为了EventDelegate(事件委托)。

    事件委托负责调用NGUI中的所有交互事件的回调,我们具体看下下面的例子:

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 public class LoadUI : MonoBehaviour
     5 {
     6     //按钮组件
     7     public UIButton button;
     8 
     9     void Start()
    10     {
    11         //第一种写法
    12         EventDelegate eventDelegate = new EventDelegate(this, "ButtonClickHandler");
    13         //第二种写法
    14         EventDelegate eventDelegate = new EventDelegate(ButtonClickHandler);
    15 
    16         //第一种添加回调的写法
    17         EventDelegate.Add(button.onClick, eventDelegate);
    18         //第二种添加回调的写法
    19         button.onClick.Add(eventDelegate);
    20     }
    21 
    22     public void ButtonClickHandler()
    23     {
    24         Debug.Log("我被点了!");
    25     }
    26 }

    而onClick其实是一个List.<EventDelegate>,我们对其进行增加和移除就可以管理所有的回调了。

    NGUI中的所有事件都是同样的写法。

    EventTrigger

    EventTrigger是一个组件,可以添加到任意UI上,其目的就是扩展该UI对象的事件类型,比如按钮中只有onClick的事件,这显然不能满足所有的需求,所以我们可以给该UI对象添加一个EventTrigger脚本,使其可以支持按下、移入、移出等事件。

  • 相关阅读:
    [LeetCode 049] Group Anagrams
    [LeetCode 033] Search in Rotated Sorted Array
    [LeetCode 024] Swap Nodes in Pairs
    [LeetCode 016] 3Sum Closest
    [LeetCode 015] 3Sum
    [LeetCode 013] Roman to Integer
    [LeetCode 008] String to Integer (atoi)
    [LeetCode 007] Reverse Integer
    第四课:文件操作【解密】
    第三课:文件操作【逐步浅入,深入加解法】
  • 原文地址:https://www.cnblogs.com/hammerc/p/4591933.html
Copyright © 2020-2023  润新知