1.UI,中心点,画布,枚举值
//当前工程的窗口文件的枚举值
//UI
public enum WinType
{
BagWin,
ButtonWin,
HeadWin,
InfoDetalWin,
OptWin,
ToyStickWin
}
//挂载点
public enum HangPoint
{
LeftTop,
LeftMiddle,
LeftButton,
MiddleTop,
MiddleMidle,
MiddleButton,
RightTop,
RightMiddle,
RightButton
}
//画布
public enum CanvasType
{
NormalCanvas,
}
2.UI窗口管理类
using UnityEngine;
using System.Collections;
//UI窗口管理类
public class WinLoadMgr : Singleton<WinLoadMgr> //省七行代码
{
//用一个哈希表存放所有加载过得窗口
private Hashtable m_PrafabTables;
//构造函数
public WinLoadMgr ()
{
m_PrafabTables = new Hashtable ();
}
//面向用户的方法
//参数:win:表示加载那个窗口,hangPoint挂载的点,canvas画布,isCache是否缓存
public GameObject LoadWin (WinType win, HangPoint hangPoint = HangPoint.MiddleMidle,
CanvasType canvas = CanvasType.NormalCanvas, bool isCache = false)
{
//定义一个空物体
GameObject winObj = null;
//接收窗口名称
string winName = win.ToString ();
//接收画布名称
string canvasName = canvas.ToString ();
//1.寻找Canvas
GameObject can = GameObject.Find ("/" + canvasName);
if (can == null) {
can = GameObject.Find ("/" + canvasName + "(Clone)");
}
//2.加载窗口
//如果哈希表里面存在当前的UI窗口
if (m_PrafabTables.Contains (winName) && isCache) {
winObj = m_PrafabTables [winName]as GameObject;
} else {
//如果没有就通过名称和类型动态加载出来,ResourcesMgr是提前写好的动态加载类
winObj = ResourcesMgr.Instance.Load<GameObject> (win);
if (isCache) {
//缓存到哈希表里面
m_PrafabTables.Add (winName, winObj);
}
}
//3.实例化窗口(克隆)
winObj = GameObject.Instantiate (winObj);
//4.调整UI中心点
Vector2 pivot = new Vector2 (0.5f, 0.5f);
switch (hangPoint) {
case HangPoint.LeftTop://左上
{
pivot = new Vector2 (0, 1f);
break;
}
case HangPoint.LeftButton://左下
{
pivot = new Vector2 (0, 0);
break;
}
case HangPoint.LeftMiddle://左中
{
pivot = new Vector2 (0, 0.5f);
break;
}
case HangPoint.MiddleButton://中下
{
pivot = new Vector2 (0.5f, 0f);
break;
}
case HangPoint.MiddleMidle://中心
{
pivot = new Vector2 (0.5f, 0.5f);
break;
}
case HangPoint.MiddleTop://中上
{
pivot = new Vector2 (0.5f, 1f);
break;
}
case HangPoint.RightButton://右下
{
pivot = new Vector2 (1f, 0);
break;
}
case HangPoint.RightMiddle://有中
{
pivot = new Vector2 (1f, 0.5f);
break;
}
case HangPoint.RightTop://右上
{
pivot = new Vector2 (1f, 1f);
break;
}
default:
{
//默认中心
pivot = new Vector2 (0.5f, 0.5f);
break;
}
}
//最终赋值给UI窗口
winObj.GetComponent<RectTransform> ().pivot = pivot;
//6.设置挂点,挂电视提前设置好的预设体,名称要一致
Transform parent = can.transform.Find (hangPoint.ToString ());
//设置成挂点的子物体
winObj.transform.SetParent (parent);
//指定位置
winObj.transform.localPosition = Vector3.zero;
//规定大小
winObj.transform.localScale = Vector3.one;
return winObj;
}
public override void Dispose ()
{
base.Dispose ();
//清除哈希表,释放没有用到的资源
m_PrafabTables.Clear ();
Resources.UnloadUnusedAssets ();
}
}
3.资源加载类
using UnityEngine;
using System.Collections;
// 通过用户传递进来的枚举值, 自动的分析出该枚举值对应的资源在哪个路径下.
public class ResourcesMgr : Singleton<ResourcesMgr>
{
// 面向用户的方法: 方法名<T>指定类型
/// <summary>
/// 返回用户需要的资源.
/// </summary>
/// <param name="enumName">Enum name.</param>
/// <typeparam name="T">The 1st type parameter.</typeparam>
public T Load<T> (object enumName) where T : Object
{
// 获取枚举类型的字符串形式
string enumType = enumName.GetType ().Name;
//空的字符串
string filePath = string.Empty;
switch (enumType) {
case "Feeds":
{
filePath = "Music/Feeds/" + enumName.ToString ();
break;
}
case "Items":
{
filePath = "Music/Items/" + enumName.ToString ();
break;
}
case "Main":
{
filePath = "Music/Main/" + enumName.ToString ();
break;
}
case "Monsters":
{
filePath = "Music/Monsters/" + enumName.ToString ();
break;
}
case "Towers":
{
filePath = "Music/Towers/" + enumName.ToString ();
break;
}
case "WinType": //UI类型
{
filePath = "UIWin/" + enumName.ToString ();
break;
}
default:
{
break;
}
}
return Resources.Load<T> (filePath);
}
}
应用: