Unity3D快速实现UI架构设计二
来源:互联网 发布:java实现文件加密 编辑:程序博客网 时间:2024/05/19 03:44
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
在快速实现UI架构设计一中已经实现了两个类,这两个类都是通用的类,它们把UI的大部分功能都实现了,接下来继续类的编写,我们使用PluginManager类中的方法,所以这个类也需要实现一下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using UnityEngine;/// <summary>/// 插件管理器/// </summary>public class PluginManager : Manager<PluginManager, string, PluginManager.Plugin>{ public class Plugin : IDisposable { public delegate void EventHandler(string eventName, GameObject sender, object arg); EventHandler nEventHandler; /// <summary> /// 初始化 /// </summary> public virtual void Init() {} /// <summary> /// 退出 /// </summary> public virtual void Exit() {} /// <summary> /// 插件事件分发器 /// </summary> /// <param name="eventName"></param> /// <param name="sender"></param> /// <param name="args"></param> public void OnEvent(string eventName,GameObject sender, object args) { if(nEventHandler != null) { nEventHandler(eventName,sender,args); } } /// <summary> /// 设置事件监听 /// </summary> /// <param name="handler"></param> public void SetEventHandler(EventHandler handler) { nEventHandler= handler; } /// <summary> /// 销毁 /// </summary> public void Dispose() { Exit(); } } /// <summary> /// 初始化 /// </summary> public void Init() { this.Put("NGUI",new NGUIExt()); // this.Put("FingerGuestures", new FingerGuesturesExt()); //this.Put("TwoDExt", new TwoDExt()); foreach(Plugin plugin in Values) { plugin.Init(); } } /// <summary> /// 退出 /// </summary> public void Exit() { foreach (Plugin plugin in Values) { plugin.Exit(); } }}
该类也是继承于Manager类,设置了事件监听函数,在UIService函数中还有一个NGUIExt类的调用,下面再把该函数实现如下如下所示;
using UnityEngine;using System.Collections;/// <summary>/// NGUI 插件管理器 /// </summary>public class NGUIExt : PluginManager.Plugin{ /// <summary> /// 初始化 /// </summary> public override void Init() { bool success = _CreateUI(true, (int)LayerUtils.ELayerIndex.ui); if (!success) Looper.Log("_CreateRoot called more the one!!"); Looper.Log("NGUIExt Init"); CreateUI3D((int)LayerUtils.ELayerIndex.UIInScene); } /// <summary> /// 退出 /// </summary> public override void Exit() { Looper.Log("NGUIExt Exit"); } /// <summary> /// 手指是否触摸到GUI上面了 /// </summary> public bool IsFingerHoverGUI { get { return (UICamera.lastHit.collider != null); } } public bool IsFingerHoverGUI3D() { return UICamera.lastHit.collider != null && UICamera.lastHit.collider.gameObject.layer == (int)LayerUtils.ELayerIndex.UIInScene; } public bool IsFingerHoverGUIWithout3D() { return UICamera.lastHit.collider != null && UICamera.lastHit.collider.gameObject.layer != (int)LayerUtils.ELayerIndex.UIInScene; } public bool IsPrefab(GameObject ui_prefab) { if (UICamera.lastHit.collider != null) { Transform hit = UICamera.lastHit.collider.transform; while (hit != null) { if (hit.gameObject == ui_prefab) { return true; } hit = hit.parent; } } return false; } GameObject mUICamera = null; public Camera UICamera3D { get; private set; } public Transform PlaceRoot { get; private set; } public GameObject GetRoot() { if (mUICamera == null) { UIRoot root = UIRoot.list[0]; if (root == null) { return null; } UICamera camera = root.GetComponentInChildren<UICamera>(); if(camera == null) { } mUICamera = camera.gameObject; } return mUICamera; } public UIRoot GetUIRoot() { return UIRoot.list[0]; } /// <summary> /// 获取NGUI的对应的屏幕宽高 /// </summary> /// <returns></returns> public Vector2 GetSize() { UIRoot root = UIRoot.list[0]; float s = (float)root.activeHeight / Screen.height; int height = Mathf.CeilToInt(Screen.height * s); int width = Mathf.CeilToInt(Screen.width * s); return new Vector2(width, height); } /// <summary> /// 获取当前控件的根面板(UI是以) /// </summary> /// <param name="obj"></param> /// <returns>obj 所在的根面板</returns> public GameObject GetRootPanel(GameObject obj) { Transform parent = obj.transform.parent; UIPanel panel = null; while (parent != null) { if (mHudPanel != null) { if (parent.gameObject == mHudPanel.gameObject) break; } if (parent.gameObject.GetComponent<UICamera>() != null) break; UIPanel tempPanel = parent.GetComponent<UIPanel>(); if (tempPanel != null) { panel = tempPanel; } parent = parent.parent; } if (panel == null) { return null; } return panel.gameObject; } /// <summary> /// 添加NGUI子对象 /// </summary> /// <param name="prefab"></param> /// <returns></returns> public GameObject AddChild(GameObject prefab) { return NGUITools.AddChild(mUICamera.gameObject, prefab); } static public UIPanel AddPanel(GameObject go,string name = "panel") { if (go == null) return null; int depth = UIPanel.nextUnusedDepth; UIPanel panel = NGUITools.AddChild<UIPanel>(go); panel.name = name; panel.depth = depth; return panel; } UIPanel mEffectPanel; public UIPanel GetEffectPanel() { if (mEffectPanel == null) { mEffectPanel = AddPanel(GetRoot()); if (mEffectPanel != null) { mEffectPanel.depth = 0; } } return mEffectPanel; } public UIPanel GetHudPanel() { if (mHudPanel == null) { mHudPanel = AddPanel(GetRoot()); if(mHudPanel != null) { mHudPanel.depth = -2; } } return mHudPanel; } public void ApplyHud(GameObject panel, Transform target) { panel.transform.parent = GetHudPanel().transform; UIFollowTarget uifollow = panel.gameObject.GetComponent<UIFollowTarget>(); if (uifollow == null) { uifollow = panel.gameObject.AddComponent<UIFollowTarget>(); } if (uifollow != null) { uifollow.target = target; uifollow.enabled = true; uifollow.SetVisible(true); } } UIPanel mHudPanel; /// <summary> ///创建UI /// </summary> /// <param name="is2D"></param> /// <param name="layer"></param> /// <returns></returns> private bool _CreateUI(bool is2D,int layer) { if (UIRoot.list.Count == 0) { UIPanel root = NGUITools.CreateUI(!is2D, layer); { UIRoot.list[0].scalingStyle = UIRoot.Scaling.FixedSizeOnMobiles; } //UIRoot.list[0].adjustByDPI = true; UIRoot.list[0].maximumHeight = UIRoot.list[0].minimumHeight = UIRoot.list[0].manualHeight = 768; Camera cam = UIRoot.list[0].gameObject.GetComponentInChildren<Camera>();// //cam.transform.position = new Vector3(0,0,9999); cam.clearFlags = CameraClearFlags.Depth; cam.farClipPlane = 100f; cam.depth = 3; cam.GetComponent<UICamera>().eventReceiverMask = 1 << layer; mUICamera = cam.gameObject; mHudPanel = AddPanel(mUICamera,"panel_hub"); return true; } return false; } void CreateUI3D(int layer) { }}给读者封装这些类的目的是提供一种编写思路,接下来我们将它们应用到项目开发中。
0 0
- Unity3D快速实现UI架构设计二
- Unity3D快速实现UI架构设计一
- Unity3D自学笔记——UGUI背包系统(二)UI设计实现及数据绑定
- Unity3d UI设计简述
- Unity3D之UI设计
- Unity3D架构系列之- FSM有限状态机设计(二)
- Unity3D架构系列之- FSM有限状态机设计二
- Unity3D游戏架构设计之对象管理【二】
- Unity3D问题之简单UI框架设计和实现
- iOS UI架构设计
- Unity3D研究:Unity3D引擎架构设计
- Unity3D研究:Unity3D引擎架构设计
- Unity3D研究:Unity3D引擎架构设计
- Unity3D研究:Unity3D引擎架构设计
- Unity3D架构设计NavMesh寻路
- Unity3D架构设计NavMesh寻路
- unity3d 快速拼ui工具 psd2ugui
- Unity3d 面向对象设计思想(二)(动态UI的分配与调度)
- JAVA中的抽象类(abstract class)
- 防止上传webshell的PHP代码
- 在循环画图中设置线形
- Spark日志清洗一般流程
- HDU 1062 Text Reverse
- Unity3D快速实现UI架构设计二
- LINQ需要select多个值时怎么办?
- CTSC2017游记
- 第18章 信号的频域分析
- 【面向对象】这些基本概念,你都了解了吗(下)
- 修改分区类型和卷标
- 算法导论 思考题 13-3(AVL树)
- JVM之内存分配与回收策略
- 图的深度优先遍历和广度优先遍历