Unity3D简单的UI系统
Unity3d的ugui如果用得不好,非常的影响性能,可能很多人都不知道,其实ugui是基于网格模型渲染的,一个ugui组件就是一个Mesh,ui组件的Material为空,其实他是用了默认的Material,我们在运行游戏的时候Canvas回把所有ui的Mesh合并成一个大的ShareMesh,用于渲染。所以一般情况下,ui的DrawCall会比较少,但是不一般的情况下,我们会用到动态的ui,导致cpu实时在合并网格顶点,gpu重新渲染整个ShareMesh,这就很卡了,所以我们要尽量不要用动态的ui,这怎么可能
扯了一下不相干的事,接下来我们来讲讲怎么来写一个简单的ui系统。
一个好的框架,底层少不了接口,所以我们创建一个UI的接口IView。
// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-15
// Desc:
// **********************************************************************using System.Collections;
using System.Collections.Generic;
using UnityEngine;public interface IView {/// <summary>/// 绑定组件/// </summary>void BindComponent();/// <summary>/// 注册事件/// </summary>void RegistrationEvent();/// <summary>/// 注销事件/// </summary>void UnregisterEvent();/// <summary>/// 初始化/// </summary>void Init();/// <summary>/// 关闭/// </summary>void Close();
}
2.接下来我们来创建一个ui的基类UIBase。
// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-15
// Desc:
// **********************************************************************using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIBase : Base, IView
{public object[] param;public UIType uiType;public PanelType panelType;protected void Awake(){BindComponent();RegistrationEvent();XMAwake();}protected void Start(){Init();}public virtual void XMAwake(){}/// <summary>/// 绑定组件/// </summary>public virtual void BindComponent(){}/// <summary>/// 注册事件/// </summary>public virtual void RegistrationEvent(){}/// <summary>/// 注销事件/// </summary>public virtual void UnregisterEvent(){}/// <summary>/// 关闭/// </summary>public virtual void Close(){}/// <summary>/// 初始化/// </summary>public virtual void Init(){}private void OnDestroy(){UnregisterEvent();Close();param = null;XMUtil.ClearMemory();//Debug.Log("~" + name + " was destroy!");}
}
UIBase根据你们的需求可以相应的扩展,这里只写了ui类型和层级类型。
3.然后我们随便创建一个界面UIMain
// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-18
// Desc:
// **********************************************************************using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class UIMain : UIBase {public Button btn_Attack;public override void BindComponent(){base.BindComponent();}public override void RegistrationEvent(){base.RegistrationEvent();btn_Attack.onClick.AddListener(Attack);}public override void UnregisterEvent(){base.UnregisterEvent();btn_Attack.onClick.RemoveListener(Attack);}public override void Close(){base.Close();}public override void Init(){base.Init();}private void Attack(){SendMessage(BattleEvent.Attack);}
}
每次创建新的界面我们都在UIType上添加新的类型,用于界面的创建和销毁。
public enum UIType
{UIMain,
}
4.最后我们写一个UIManager来管理所有的ui。
using System.Collections;
// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-13
// Desc:
// **********************************************************************using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 界面类型
/// </summary>
public enum PanelType
{MainPanel,BottomPanel,TopPanel,TipPanel,
}public class UIManager : Manager {Dictionary<UIType, GameObject> uiMap = new Dictionary<UIType, GameObject>();Transform MainPanel;Transform BottomPanel;Transform TopPanel;Transform TipPanel;void Awake(){Transform tr = AppFacade.Instance.GetManager<GameManager>(ManagerName.Game).uiRoot.transform;MainPanel = tr.Find("MainPanel");BottomPanel = tr.Find("BottomPanel");TopPanel = tr.Find("TopPanel");TipPanel = tr.Find("TipPanel");}/// <summary>/// 打开界面/// </summary>/// <param name="path"></param>/// <returns></returns>public GameObject Show(string path,object[] param = null){GameObject ui = ResManager.CreateAsset(path);UIBase uibase = ui.GetComponent<UIBase>();uibase.param = param;SetPanelParent(uibase);ui.transform.localScale = Vector3.one;ui.transform.localPosition = Vector3.zero;ui.transform.rectTransform().sizeDelta = new Vector2(0, 0);ui.transform.rectTransform().anchoredPosition = new Vector2(0, 0);AddUI(uibase.uiType, ui);return ui;}/// <summary>/// 设置ui的父对象/// </summary>/// <param name="go"></param>void SetPanelParent(UIBase uibase){if (uibase.panelType == PanelType.MainPanel){uibase.transform.SetParent(MainPanel);}else if (uibase.panelType == PanelType.BottomPanel){uibase.transform.SetParent(BottomPanel);}else if (uibase.panelType == PanelType.TopPanel){uibase.transform.SetParent(TopPanel);}else if (uibase.panelType == PanelType.TipPanel){uibase.transform.SetParent(TipPanel);}}void AddUI(UIType uiType, GameObject ui){uiMap.Add(uiType, ui);}void RemoveUI(UIType uiType){if (uiMap.ContainsKey(uiType)){Destroy(uiMap[uiType]);uiMap.Remove(uiType);}else{Debug.LogError("CloseUI Fail >>>> Not Find " + name);}}/// <summary>/// 关闭面板/// </summary>/// <param name="name"></param>public void Close(UIType uiType){RemoveUI(uiType);}void OnDestroy(){//Debug.Log("~UIManager was destroy!");}
}
我写的这个ui系统是很简单的,主要就是面向对象的思路展示,并不是作为一个框架中完整的UI系统来写的,所以有需要的朋友可以自行拓展。
如果有关注我的朋友,应该看过另一篇文章《Unity3D创建C#自定义模板快速实现基类接口》,我们可以创建一个UI的模版,每次创建新的界面都会自动帮我们实现基类的方法。
Unity3D简单的UI系统相关推荐
- (转)[Unity3D]UI方案及制作细节(NGUI/EZGUI/原生UI系统) 内附unused-assets清除实例
转载请留下本文原始链接,谢谢.本文会不定期更新维护,最近更新于2013.09.17. http://blog.sina.com.cn/s/blog_5b6cb9500101bplv.html 一.方案 ...
- Unity3D 实现简单的Buff系统
今天来考虑一下,想要实现一个buff系统需要什么功能. 能力不行,写的不好,请大家指正完善,谢谢~~ 在我们接到一个需求的时候,往往需要先分析一下需求,确定我们要实现什么样的功能,大部分的情况下需求功 ...
- 【Unity3d】 教会你如何做一个简单的电梯系统(升降平台)
博主第一次写博客,语言略俗,有不足之处还请指正! 由于自己还处在unity小白阶段,受2d升降平台的影响(后续我也会上传关于2d升降平台的文章),突发奇想如何用3d做一个电梯系统,查阅网上资料后,发现 ...
- 3D Game Programming Design:UI系统--Quest Log 公告牌
3D Game Programming & Design:UI系统--Quest Log 公告牌 UI系统概述 UGUI 基础 画布(Cavas) UI 布局基础 UI 组件与元素 编程实践 ...
- 二.UI系统 [Unity_Learn_RPG_1]
UI系统 [Unity_Learn_RPG_1] 讲解一个VR项目来学习. 一.VRTK 1.简介 其实就是 VRTK 帮我们做了硬件适配,当作一个中间层,让我们只需要调用它提供的方法即可. 为什么学 ...
- UGUI的优点新UI系统
UGUI的优点新UI系统 第1章 新UI系统概述 UGUI的优点新UI系统,新的UI系统相较于旧的UI系统而言,是一个巨大的飞跃!有过旧UI系统使用体验的开发者,大部分都对它没有任何好感,以至于在过 ...
- Unity4.6新UI系统初探(uGUI)
文章目录[点击展开](?)[+] 一引言 二Rect Transform 三排序 四控件 1 Image 2 Button 五事件 1 Event Trigger 2 Graphic Raycaste ...
- 3D游戏与编程——UI系统
目录 UI系统 Unity GUI简介 IMGUI UGUI 的产生与优势 作业要求 使用UGUI方法制作血条 制作预制 使用IMGUI方法制作血条 结果演示 代码传送门 UI系统 Unity GUI ...
- 简单的UI框架 | 一、UI界面的搭建
简单的UI框架 UI界面的搭建 文章目录 简单的UI框架 前言 一.UI资源的导入 二.游戏主界面设置 1.背景设置 2.游戏主玩法图标按钮 3.游戏主玩法界面 4.预制体 总结 前言 本文将会学习到 ...
最新文章
- HTML5的Video标签的属性,方法和事件汇总
- field module的on input和on request区别
- 【Android】事件传递:向下拦截,向上处理
- winscp登陆windows服务器_基于OpenSSH+WinSCP完成Windows服务器之间的文件传输
- ubuntu14.04matlab2015b 测试caffe的Matlab接口
- Java 并发编程之 FutureTask
- SQL2005性能分析一些细节功能你是否有用到?(二)
- MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份]
- 软件推荐:Microsoft To-Do
- 如何简化卷积神经网络_卷积神经网络:简化
- vb c语言入门教程,c语言和vb哪个简单
- 安利一款倒计时插件---雨滴桌面
- 【华为OD】【001-勾股数元组】
- 手机端H5页面时间插件
- SpringBoot 自动装配原理解析
- ubuntu安装软件失败无法安装其他软件的解决办法
- 谷歌的无痕模式有什么好处_为什么Google的新搜索结果设计是黑暗的模式
- 电子工程师入门宝典:最常用十大电子元器件-电子技术方案|电路图讲解
- nmap工具介绍及常用命令
- 程序员 520 表白方式