博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
U3D设计模式之UI框架
阅读量:5264 次
发布时间:2019-06-14

本文共 4641 字,大约阅读时间需要 15 分钟。

  每个游戏的有UI,合理的UI管理可以更加节省游戏资源。本篇是对UI框架的总结。

  UI框架就是把所有的UI做成Prefab存进Json文件中,等触发的时候再通过点击事件实例化出相应的UI预制体。这样做的好处是,游戏面板上什么都没有,用到什么就生成什么,为了避免重复生成,采用单例的方式来实现。

  一、搭建UI界面。

 

 

 二、写代码:

 

using System.Collections;using System.Collections.Generic;using UnityEngine;using System;//转化枚举信息给json解析提供值[Serializable]//序列化信息(把对象转化为文本,转换为二进制)public class UIPanelInfo : ISerializationCallbackReceiver//序列化接口{    [NonSerialized]    public UIPanelType type;//定义枚举    public string PanelTypeString;    public string path;//json解析时要把该类信息都传递过去,所以path信息也要获取    public void OnAfterDeserialize()//反序列化之后执行的内容就是文本变对象    {           UIPanelType typeinfo=(UIPanelType)Enum.Parse(typeof(UIPanelType),PanelTypeString);           type = typeinfo;    }    public void OnBeforeSerialize()    {           }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class TaskPanel: BasePanel{    private CanvasGroup cg;    // Use this for initialization    void Start () {        if (cg == null)        {            cg = GetComponent
(); } cg = GetComponent
(); } //重写显示界面 public override void OnEnter() { if (cg==null) { cg = GetComponent
(); } cg.blocksRaycasts = true; cg.alpha = 1; } public void ClosePanel() { UIManager.Instance.PopPanel(); } public override void OnExit() { cg.blocksRaycasts = false; cg.alpha = 0; }}--------------------------------------------------------------------------------using System.Collections;using System.Collections.Generic;using UnityEngine;public class BasePanel : MonoBehaviour{ ///
/// 显示界面 /// public virtual void OnEnter() { } ///
/// 暂停界面 /// public virtual void OnPause() { } ///
/// 继续界面(恢复交互) /// public virtual void OnResume() { } ///
/// 退出界面(移除) /// public virtual void OnExit() { }}-------------------------------------------------------------------------------- //定义一个栈(Stack) Stack
stack; ///
/// 把某个界面进栈,用于显示当前的界面 /// public void PushPanel(UIPanelType panelType) { if (stack==null) { stack = new Stack
(); } if (stack.Count>0) { Debug.Log(1231456); BasePanel basePanel= stack.Peek();//检测里面最上面的界面,然后去暂停 basePanel.OnPause(); } Debug.Log(6666); BasePanel bp = GetPanel(panelType); bp.OnEnter(); stack.Push(bp); } ///
/// 出栈就是把这个界面移除 /// public void PopPanel() { Debug.Log("看一看"); if (stack == null) { stack = new Stack
(); } if (stack.Count <= 0) return; //关闭栈顶的界面(peek的东西) BasePanel bp= stack.Pop();//出栈//关闭子界面(预示着原来的老界面要继续激活) bp.OnExit(); if (stack.Count <= 0) return; BasePanel basePanel= stack.Peek();//老界面(之前暂停的界面)拿出来激活 basePanel.OnResume();//可以继续交互了 }}--------------------------------------------------------------------------------using System.Collections;using System.Collections.Generic;using UnityEngine;using System;public class MainmenuPanel : BasePanel{ private CanvasGroup cg;void Start () { if (cg == null) { cg = GetComponent
(); } cg = GetComponent
();} //告诉UImanger我想要哪个界面,你就给我生成或者直接拿给我 public void OnClickType(string type) { UIPanelType panelType= (UIPanelType)Enum.Parse(typeof(UIPanelType),type); UIManager.Instance.PushPanel(panelType); Debug.Log(type); } public override void OnPause() { if (cg == null) { cg = GetComponent
(); } cg.blocksRaycasts = false; Debug.Log(888); } public override void OnResume() { base.OnResume(); cg.blocksRaycasts = true; } }--------------------------------------------------------------------------------using System.Collections;using System.Collections.Generic;using UnityEngine;public class KnapsackPanel : BasePanel{private CanvasGroup cg; // Use this for initialization void Start() { if (cg == null) { cg = GetComponent
(); } } //重写显示界面 public override void OnEnter() { if (cg == null) { cg = GetComponent
(); } cg.blocksRaycasts = true; cg.alpha = 1; } public override void OnPause() { Debug.Log("调用"); cg.blocksRaycasts = false; } public override void OnResume() { cg.blocksRaycasts = true; } public void ClosePanel() { UIManager.Instance.PopPanel(); } public override void OnExit() { cg.blocksRaycasts = false; cg.alpha = 0; } public void OnClickItem() { UIManager.Instance.PushPanel(UIPanelType.ItemMessage); }}

遇到的坑:

Json文件虽然可以读出来,但是无法在面板上显示,是因为Json文件里的变量名称要和代码里的变量名称一致,不然无法实别到。

转载于:https://www.cnblogs.com/shuanglu/p/8343511.html

你可能感兴趣的文章
线程androidAndroid ConditionVariable的用法
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>
MacOS copy图标shell脚本
查看>>
国外常见互联网盈利创新模式
查看>>
Oracle-05
查看>>
linux grep 搜索查找
查看>>
Not enough free disk space on disk '/boot'(转载)
查看>>
android 签名
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>