区块链技术博客
www.b2bchain.cn

Unity 游戏框架搭建 2019 (八十) UIRoot Prefab求职学习资料

D0b2wT.gif

本文介绍了Unity 游戏框架搭建 2019 (八十) UIRoot Prefab求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

在上一篇,我们解决了 GUIManager 的层级管理问题。并且在文章的尾部提出了一个问题,难道我们要在每个项目或场景中都手动去构造一遍 Canvas 的结构嘛?

当然不是。

大家都知道,Unity 提供了 Prefab 这样的好用的东西,所以呢,我们要把 Canvas 的一套结构制作成 Prefab,当然还要给他取一个合适的名字,叫做 UIRoot。
在下图中,需要做成 Prefab 的为 Canvas 加上 EventSystem,因为如果没有了 EventSystem 我们的 UI 界面就识别不到点击事件。
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
我们可以把 EventSystem 拖到 Canvas 下边,如下图所示:
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
而 Canvas 的名字,我们改成了,UIRoot。接着把 UIRoot 制作成 prefab,那么这个 prefab 需要进行加载,所以呢,要放在 Resources 目录下,在 我们的 Framework 目录内,创建一个 Resources 目录。并把 UIRoot 拖进来,瑞下图所示。
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
这样呢,我们就可以通过代码进行 Resources 的加载了。
接着呢,是要写一些加载 UIRoot 的代码。这部分我们也在 GUIManager 里写就好了。
加载的代码如下:

private static GameObject mPrivateUIRoot;  public static GameObject UIRoot {     get     {         if (mPrivateUIRoot == null)         {             var uirootPrefab = Resources.Load<GameObject>("UIRoot");             mPrivateUIRoot = GameObject.Instantiate(uirootPrefab);         }          return mPrivateUIRoot;     } }

非常简单,是一个很简单的单例实现。

这样我们的 GUIManager 中的 LoadPanel 方法,就需要改一下了,因为其实现和 UIRoot 有关系。
之前的代码如下:

        public static GameObject LoadPanel(string panelName, UILayer layer)         {             var panelPrefab = Resources.Load<GameObject>(panelName);             var panel = Instantiate(panelPrefab);             var canvasObj = GameObject.Find("Canvas");              switch (layer)             {                 case UILayer.Bg:                     panel.transform.SetParent(canvasObj.transform.Find("Bg"));                     break;                 case UILayer.Common:                     panel.transform.SetParent(canvasObj.transform.Find("Common"));                     break;                 case UILayer.Top:                     panel.transform.SetParent(canvasObj.transform.Find("Top"));                     break;             }              var panelRectTrans = panel.transform as RectTransform;              panelRectTrans.offsetMin = Vector2.zero;             panelRectTrans.offsetMax = Vector2.zero;             panelRectTrans.anchoredPosition3D = Vector3.zero;             panelRectTrans.anchorMin = Vector2.zero;             panelRectTrans.anchorMax = Vector2.one;              return panel;         }

更改后的代码如下:

        public static GameObject LoadPanel(string panelName, UILayer layer)         {             var panelPrefab = Resources.Load<GameObject>(panelName);             var panel = Instantiate(panelPrefab);              switch (layer)             {                 case UILayer.Bg:                     panel.transform.SetParent(UIRoot.transform.Find("Bg"));                     break;                 case UILayer.Common:                     panel.transform.SetParent(UIRoot.transform.Find("Common"));                     break;                 case UILayer.Top:                     panel.transform.SetParent(UIRoot.transform.Find("Top"));                     break;             }              var panelRectTrans = panel.transform as RectTransform;              panelRectTrans.offsetMin = Vector2.zero;             panelRectTrans.offsetMax = Vector2.zero;             panelRectTrans.anchoredPosition3D = Vector3.zero;             panelRectTrans.anchorMin = Vector2.zero;             panelRectTrans.anchorMax = Vector2.one;              return panel;         }

我们把所有的 Canvas 相关的代码,都改成了 UIRoot。

在上一篇,我们解决了 GUIManager 的层级管理问题。并且在文章的尾部提出了一个问题,难道我们要在每个项目或场景中都手动去构造一遍 Canvas 的结构嘛?

当然不是。

大家都知道,Unity 提供了 Prefab 这样的好用的东西,所以呢,我们要把 Canvas 的一套结构制作成 Prefab,当然还要给他取一个合适的名字,叫做 UIRoot。
在下图中,需要做成 Prefab 的为 Canvas 加上 EventSystem,因为如果没有了 EventSystem 我们的 UI 界面就识别不到点击事件。
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
我们可以把 EventSystem 拖到 Canvas 下边,如下图所示:
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
而 Canvas 的名字,我们改成了,UIRoot。接着把 UIRoot 制作成 prefab,那么这个 prefab 需要进行加载,所以呢,要放在 Resources 目录下,在 我们的 Framework 目录内,创建一个 Resources 目录。并把 UIRoot 拖进来,瑞下图所示。
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
这样呢,我们就可以通过代码进行 Resources 的加载了。
接着呢,是要写一些加载 UIRoot 的代码。这部分我们也在 GUIManager 里写就好了。
加载的代码如下:

private static GameObject mPrivateUIRoot;  public static GameObject UIRoot {     get     {         if (mPrivateUIRoot == null)         {             var uirootPrefab = Resources.Load<GameObject>("UIRoot");             mPrivateUIRoot = GameObject.Instantiate(uirootPrefab);         }          return mPrivateUIRoot;     } }

非常简单,是一个很简单的单例实现。

这样我们的 GUIManager 中的 LoadPanel 方法,就需要改一下了,因为其实现和 UIRoot 有关系。
之前的代码如下:

        public static GameObject LoadPanel(string panelName, UILayer layer)         {             var panelPrefab = Resources.Load<GameObject>(panelName);             var panel = Instantiate(panelPrefab);             var canvasObj = GameObject.Find("Canvas");              switch (layer)             {                 case UILayer.Bg:                     panel.transform.SetParent(canvasObj.transform.Find("Bg"));                     break;                 case UILayer.Common:                     panel.transform.SetParent(canvasObj.transform.Find("Common"));                     break;                 case UILayer.Top:                     panel.transform.SetParent(canvasObj.transform.Find("Top"));                     break;             }              var panelRectTrans = panel.transform as RectTransform;              panelRectTrans.offsetMin = Vector2.zero;             panelRectTrans.offsetMax = Vector2.zero;             panelRectTrans.anchoredPosition3D = Vector3.zero;             panelRectTrans.anchorMin = Vector2.zero;             panelRectTrans.anchorMax = Vector2.one;              return panel;         }

更改后的代码如下:

        public static GameObject LoadPanel(string panelName, UILayer layer)         {             var panelPrefab = Resources.Load<GameObject>(panelName);             var panel = Instantiate(panelPrefab);              switch (layer)             {                 case UILayer.Bg:                     panel.transform.SetParent(UIRoot.transform.Find("Bg"));                     break;                 case UILayer.Common:                     panel.transform.SetParent(UIRoot.transform.Find("Common"));                     break;                 case UILayer.Top:                     panel.transform.SetParent(UIRoot.transform.Find("Top"));                     break;             }              var panelRectTrans = panel.transform as RectTransform;              panelRectTrans.offsetMin = Vector2.zero;             panelRectTrans.offsetMax = Vector2.zero;             panelRectTrans.anchoredPosition3D = Vector3.zero;             panelRectTrans.anchorMin = Vector2.zero;             panelRectTrans.anchorMax = Vector2.one;              return panel;         }

我们把所有的 Canvas 相关的代码,都改成了 UIRoot。

在上一篇,我们解决了 GUIManager 的层级管理问题。并且在文章的尾部提出了一个问题,难道我们要在每个项目或场景中都手动去构造一遍 Canvas 的结构嘛?

当然不是。

大家都知道,Unity 提供了 Prefab 这样的好用的东西,所以呢,我们要把 Canvas 的一套结构制作成 Prefab,当然还要给他取一个合适的名字,叫做 UIRoot。
在下图中,需要做成 Prefab 的为 Canvas 加上 EventSystem,因为如果没有了 EventSystem 我们的 UI 界面就识别不到点击事件。
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
我们可以把 EventSystem 拖到 Canvas 下边,如下图所示:
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
而 Canvas 的名字,我们改成了,UIRoot。接着把 UIRoot 制作成 prefab,那么这个 prefab 需要进行加载,所以呢,要放在 Resources 目录下,在 我们的 Framework 目录内,创建一个 Resources 目录。并把 UIRoot 拖进来,瑞下图所示。
Unity 游戏框架搭建 2019 (八十) UIRoot Prefab
这样呢,我们就可以通过代码进行 Resources 的加载了。
接着呢,是要写一些加载 UIRoot 的代码。这部分我们也在 GUIManager 里写就好了。
加载的代码如下:

private static GameObject mPrivateUIRoot;  public static GameObject UIRoot {     get     {         if (mPrivateUIRoot == null)         {             var uirootPrefab = Resources.Load<GameObject>("UIRoot");             mPrivateUIRoot = GameObject.Instantiate(uirootPrefab);         }          return mPrivateUIRoot;     } }

非常简单,是一个很简单的单例实现。

这样我们的 GUIManager 中的 LoadPanel 方法,就需要改一下了,因为其实现和 UIRoot 有关系。
之前的代码如下:

        public static GameObject LoadPanel(string panelName, UILayer layer)         {             var panelPrefab = Resources.Load<GameObject>(panelName);             var panel = Instantiate(panelPrefab);             var canvasObj = GameObject.Find("Canvas");              switch (layer)             {                 case UILayer.Bg:                     panel.transform.SetParent(canvasObj.transform.Find("Bg"));                     break;                 case UILayer.Common:                     panel.transform.SetParent(canvasObj.transform.Find("Common"));                     break;                 case UILayer.Top:                     panel.transform.SetParent(canvasObj.transform.Find("Top"));                     break;             }              var panelRectTrans = panel.transform as RectTransform;              panelRectTrans.offsetMin = Vector2.zero;             panelRectTrans.offsetMax = Vector2.zero;             panelRectTrans.anchoredPosition3D = Vector3.zero;             panelRectTrans.anchorMin = Vector2.zero;             panelRectTrans.anchorMax = Vector2.one;              return panel;         }

更改后的代码如下:

        public static GameObject LoadPanel(string panelName, UILayer layer)         {             var panelPrefab = Resources.Load<GameObject>(panelName);             var panel = Instantiate(panelPrefab);              switch (layer)             {                 case UILayer.Bg:                     panel.transform.SetParent(UIRoot.transform.Find("Bg"));                     break;                 case UILayer.Common:                     panel.transform.SetParent(UIRoot.transform.Find("Common"));                     break;                 case UILayer.Top:                     panel.transform.SetParent(UIRoot.transform.Find("Top"));                     break;             }              var panelRectTrans = panel.transform as RectTransform;              panelRectTrans.offsetMin = Vector2.zero;             panelRectTrans.offsetMax = Vector2.zero;             panelRectTrans.anchoredPosition3D = Vector3.zero;             panelRectTrans.anchorMin = Vector2.zero;             panelRectTrans.anchorMax = Vector2.one;              return panel;         }

我们把所有的 Canvas 相关的代码,都改成了 UIRoot。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Unity 游戏框架搭建 2019 (八十) UIRoot Prefab求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们