笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
在利用Unity3D引擎开发程序时,UI资源的加载,卸载,隐藏以及UI渐变动画等功能是UI架构设计必须考虑的。
做每一款游戏都需要将这些功能编写一遍非常耗时,在此给读者介绍一种快速的实现方式,因为我们这个是通用的
模块,所以必须要使用模板实现,而且我们的逻辑脚本是不挂接到对象上的。接下来首先设计一个管理类Manager,
代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/// <summary>
/// 抽象管理类
/// </summary>
/// <typeparam name="K"></typeparam>
/// <typeparam name="V"></typeparam>
public class Manager<T,K, V> : Singleton<T>
where V : class ,IDisposable
where T : Singleton<T>, new()
{
protected Dictionary<K, V> mMap = new Dictionary<K, V>();
/// <summary>
/// 获取 对应实体
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public V Get(K key)
{
if (key == null) return null;
return mMap.ContainsKey(key) ? mMap[key] : null;
}
/// <summary>
/// 获取类型T的 Value
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public U Get<U>(K key) where U : class,V
{
V v = Get(key);
return v as U;
}
/// <summary>
/// 获取类型T的Value
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Get<T>() where T : class,V
{
foreach(V value in mMap.Values)
{
if(value.GetType().Equals(typeof(T)))
{
return value as T;
}
}
return null;
}
/// <summary>
/// 添加对应实体
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public bool Put(K key, V value)
{
if (mMap.ContainsKey(key))
{
if (value == mMap[key])
{
return false;
}
V v = mMap[key];
mMap[key] = value;
v.Dispose();
}
else
{
mMap.Add(key, value);
}
return true;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Remove(K key)
{
if (mMap.ContainsKey(key))
{
V v = mMap[key];
mMap.Remove(key);
v.Dispose();
}
return true;
}
public Dictionary<K,V>.ValueCollection Values
{
get { return mMap.Values; }
}
/// <summary>
/// 清除所有管理的对象
/// </summary>
public void Clear()
{
foreach (V value in mMap.Values)
{
value.Dispose();
}
mMap.Clear();
}
}
public class ManagerT<K, V> : Manager<ManagerT<K,V>, K, V>
where V : class ,IDisposable
{
}
在这个类属于抽象类,它利用Dictionary实现了对象的管理操作,接下来需要实现UI的管理类了,先把代码给读者展示如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
/// <summary>
/// UI 服务类
/// </summary>
public class UIService : Manager<UIService, string, UIService.UI>,IDisposable
{
public void Dispose()
{
DestroyAll();
}
/// <summary>
/// 创建UI
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="name"></param>
/// <returns></returns>
private T _CreateUI<T>(string name) where T : UI
{
T ui = Activator.CreateInstance(typeof(T), name) as T;
return ui;
}
public class UIHolder : MonoBehaviour
{
public UI ui { get; set; }
}
public class UI : IDisposable
{
public UI(string name)
{
_Init(name);
}
public enum UIStyle
{
Normal,//默认类型
HideByTapScene,//点击空白处隐藏类型,和黑底不冲突
}
UIStyle mStyle = UIStyle.Normal;
public UIStyle Style
{
get { return mStyle; }
set { mStyle = value; }
}
internal GameObject mPrefab = null;
protected UIPanel mPanel = null;
#region 面板动画处理
protected UITweener[] mTweens = null;
protected UITweener mMainTween = null;
protected UITweener.ToggleStyle mMainToggleStyle = UITweener.ToggleStyle.normal;
private void _TweensInit()
{
mTweens