UIFramework学习(零散记录)

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博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值