接着上一篇的介绍,这一篇就该干点实事了—上代码。但是在这之前,我先给出UI框架在Unity中的资源文件的截图,方便大家理解(其中的预制体和代码是根据上一篇博客的讲解给出):
1.存储面板类型和面板预设路径的Json文本如下:
{
"infoList":
[
{"panelTypeString":"ItemMessage",
"path":"UIPanel/ItemMessagePanel"},
{"panelTypeString":"Knapsack",
"path":"UIPanel/KnapsackPanel"},
{"panelTypeString":"MainMenu",
"path":"UIPanel/MainMenuPanel"},
{"panelTypeString":"Shop",
"path":"UIPanel/ShopPanel"},
{"panelTypeString":"Skill",
"path":"UIPanel/SkillPanel"},
{"panelTypeString":"System",
"path":"UIPanel/SystemPanel"},
{"panelTypeString":"Task",
"path":"UIPanel/TaskPanel"}
]
}
2.每个面板对应的枚举如下:
using UnityEngine;
using System.Collections;
public enum UIPanelType
{
MainMenu,
Knapsack,
Shop,
Skill,
Task,
System,
ItemMessage
}
3.每个UI界面信息对应的类(也就是解析出来的Json对应的类):
using UnityEngine;
using System.Collections;
using System;
[Serializable]
public class UIPanelInfo : ISerializationCallbackReceiver{
//和json文件信息对应的一个类
//不可序列化的,因为这里unity解析json文件时没办法解析枚举类型,所以下面定义了一个string类型的字段panelTypeString,用于两者的转化
[NonSerialized]
public UIPanelType panelType;//面板类型
public string panelTypeString;
public string path;//面板所在路径
//实现ISerializationCallbackReceiver的接口, 反序列化方法,从文本信息到对象
public void OnAfterDeserialize()
{
UIPanelType type = (UIPanelType)System.Enum.Parse(typeof(UIPanelType), panelTypeString);//把一个字符串转化为一个枚举
panelType = type;
}
//实现接口, 序列化方法,从对象到文本信息
public void OnBeforeSerialize(){}
}
4.(重点)UIManager管理各个UI面板的核心类:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 单例模式的核心:
/// 1.只在该类内定义一个静态的对象,该对象在外界访问,在内部构造
/// 2.构造函数私有化
/// </summary>
public class UIManager{
//此类作为一个单例模式,即只有一个实例的模式
private static UIManager _instance;
public static UIManager Instance
{
get
{
if (_instance == null)
{
_instance = new UIManager();
}
return _instance;
}
}
private UIManager() //构造函数私有化(单例模式)
{
ParseUIP