1. UIType类的创建
indexOf("/"):返回"/"字符在此实例中第一个出现的索引位置,实例的下标是从0开始,如果未找到则返回-1.
indexOf("/", 7):返回在此实例中从下标7开始的,第一次出现"/"的位置,如果未找到返回-1.
indexOf是从左向右,lastIndexOf是从右向左,尽管搜索方向不一样,但是字符下标依然从左向右加1,从0开始。
lastIndexOf("/"):返回"/"在此实例中最后一个出现的索引位置。即从右向左搜索,第一次出现的"/"的位置,如果未找到则返回-1.
lastIndexOf("/", 7):返回在此实例中从下标0开始到下标7结束的这一段子串中,最后一次出现"/"的位置 。即从右向左搜索,第一次出现的"/"的位置,如果未找到则返回-1.
subString:截取字符串。subString(7,2)表示从下标7开始,截取长度为2的字符串,subString(7)表示从下标7开始,一直截取到字符串末尾。Name = path.Substring(path.LastIndexOf('/') + 1);下标从/后的第一个字符开始截取,也就是我们的路径名字。
这是一个用于UI面板的类,其中的名称是通过地址来获取预设体中的名称。当我们把地址通过resources.load加载进去之后,我们可以通过path.Substring(path.LastIndexOf('/')+1)完美解决名称后面带clone的问题(通过实例化生成的预设体后面有一个clone)
/// <summary>
/// 存储单个Ui的信息,包括名字和路径
/// </summary>
public class UIType {
/// <summary>
/// UI名字
/// </summary>
public string Name { get; private set; }
/// <summary>
/// UI路径
/// </summary>
public string Path { get; private set; }
//构造函数获取路径
public UIType(string path) {
Path = path;
//找最后一个斜杠索引的位置, + 1为/后的位置,名字开头的第一个字符
Name = path.Substring(path.LastIndexOf('/') + 1);
}
}
2. BasePanel类的创建
/// <summary>
/// 所有UI面板的父类,包含UI面板的状态信息
/// </summary>
public abstract class BasePanel
{
/// <summary>
/// UI信息
/// </summary>
public UIType UIType { get; private set; }
/// <summary>
/// UI进行时所进行的操作,虚方法(方便继承),只会执行一次
/// </summary>
public virtual void OnEnter() {
}
/// <summary>
/// UI暂停时执行的操作
/// </summary>
public virtual void OnPuse() { }
/// <summary>
/// UI重新开始时执行的操作
/// </summary>
public virtual void OnResume() { }
/// <summary>
/// UI退出时执行的操作
/// </summary>
public virtual void OnExit() { }
}
3.UIManger类的创建
public class UIManager
{
/// <summary>
/// 存储所有UI信息的字典,每一个UI信息都会对应一个gameObj
/// </summary>
private Dictionary<UIType, GameObject> dicUI;
//构造函数对其进行初始化
public UIManager(){
dicUI = new Dictionary<UIType, GameObject>();
}
/// <summary>
/// 获取一个UI对象,传一个UUItype类,命名为type
/// </summary>
/// <param name="type">UI信息</param>
/// <returns></returns>
public GameObject GetSingleUI(UIType type) {
//设置一个游戏物体父对象,查找游戏画布的名字
GameObject parent = GameObject.Find("Canvas");
//判断是否为空物体
if(!parent){
Debug.LogError("画布不存在,请仔细查找有无这个对象,返回为空");
return null;
}
//单例:检查是否有,有就返回,没有就创建
if (dicUI.ContainsKey(type))
return dicUI[type];
GameObject ui = GameObject.Instantiate(Resources.Load<GameObject>(type.Path), parent.transform);
//则不带clone后缀(实例化生成会clone)
ui.name = type.Name;
return ui;
}
/// <summary>
/// 销毁一个UI对象
/// </summary>
/// <param name="type">UI信息</param>
public void DestroyUI(UIType type) {
//有问题,递归了,容易造成死循环,若不递归,则下列两行代码位置互换
if (dicUI.ContainsKey(type)) {
DestroyUI(type);
dicUI.Remove(type); }
}
}
(注意,有一个递归循环的错误)
注意:c#语言支持递归,即一个函数可以调用其自身,在使用递归时,需要定义一个从函数退出的条件,否则会进入死循环。
参考文章:
https://blog.csdn.net/qq_40182225/article/details/79202710
【Unity】有关字符串-LastIndexOf的用法(解决通过实例化生成的预设体后面的clone)_夜梦说开发(VR)的博客-CSDN博客