技术笔记(5)MMORPG

技术笔记(5)MMORPG

  • 希望实现的功能或目标:

    • 搞定UI系统
    • 搞定人物选择系统

  • 学习笔记:

    • RawImage在登陆界面中负责将某些特定模型渲染出来,比如:人物、怪物

    • UIMask是可以拦截穿透的,即点击上层覆盖的UI界面时,下层是点不到的

    • UISystem类

      • 字典:private Dictionary<string, BasePanel> panelDict = new Dictionary<string, BasePanel>();​​​

      • CanvasTrans:private Transform canvasTrans;​​​

      • 初始化方法:调用所有面板的注册方法,并打开LoginPanel

      • 注册面板方法:字典里没有,就在Canvas的transform之下实例化这个面板预制体,并把这个面板的类add进字典里,并调用该类的OnInit方法

        • 关于BasePanel的OnInit方法:使用扩展方法this.GetSystem获得UISystem之后,把面板gameObject的active设置为false;

          • 关于扩展方法GetSystem:调用单例类StartArchitecture的GetArchitecture方法,获得当前游戏框架,并调用当前框架的GetSystem方法。
      • 移除面板方法:字典里有的话,就把类从字典里remove出来,并把面板gameObject摧毁掉

      • 打开面板方法:调用字典内该面板类的OnShow方法

      • 关闭面板方法:调用字典内该面板类的OnClose方法

      • 其与其他Panel类之间的关系:

        • - UISystem
            - GameUI
              - GamePanel
            - MainUI
              - CharacterCreatPanel
              - ChiocePanel
              - LoadPanel
              - MaskPanel
              - RegisterPanel
              - TipPanel
          
      • 面板渐变方法:如下

    • UI模块之间渐变切换方法

      • 打开MaskPanel

      • 获取MaskPanel的Image组件

      • 调用DOTween.To方法,其中四个参数分别为,getter、setter、endValue、duration实现渐变黑屏

      • 再调用其回调函数OnComplete(()=>{}),实现等待渐变完成之后再开启新Panel,并关闭旧的Panel

      • 在OnComplete内再次调用DOTween.To方法实现黑屏渐变消失,并关闭MaskPanel

      • 具体代码(归属于UISystem):

        • public void PanelsChangeGradually<T,U>()where T : BasePanel where U : BasePanel
          {
              OpenPanel<MaskPanel>();
              Image maskImg = ((MaskPanel)panelDict["MaskPanel"]).MaskImg;
              DOTween.To(() => maskImg.color, toColor => maskImg.color = toColor, new Color(0, 0, 0, 1), 1)
                          .OnComplete(() => { 
                              ClosePanel(typeof(T).ToString());
                              OpenPanel<U>();
                              DOTween.To(() => maskImg.color, toColor => maskImg.color = toColor, new Color(0, 0, 0, 0), 1)
                                  .OnComplete(() => { ClosePanel("TipPanel"); ClosePanel("MaskPanel"); });
                          });
          
          }
          
    • 工具类DeepFindTransform

      • 从根节点开始找find,没找到的话,foreach对每一个子节点进行一次DeepFindTransform递归,当前轮次找到了就直接返回结果Transform
    • 加载面板LoadPanel类

      • 声明Slider

      • OnInit方法中Find场景中的Slider,并调用基类BasePanel的OnInit方法

      • 在OnShow方法中调用基类OnShow,并开启一个开始加载场景的协程StartCoroutine(StartLoading(1));

      • 加载场景的协程:

        • 声明两个整型变量,一是用来展示的进度,二是用来接收实际的进度
        • 调用SceneManager的异步加载场景方法,并声明一个AsyncOperation ao来接收返回值
        • 将ao的allowSceneActivation设置为false
        • 当ao.progress小于0.9f时循环,让展示进度追赶实际进度,每帧加一之后修改Slider
        • 大于0.9f跳出循环后,直接将实际进度设置为100,再次加一,修改Slider
        • 等待一秒之后将ao的allowSceneActivation设置为true
        • private IEnumerator StartLoading(int sceneIndex)
          {
              int displayProgress = 0;
              int toProgress = 0;
              AsyncOperation ao = SceneManager.LoadSceneAsync(sceneIndex);
              ao.allowSceneActivation = false;
              while (ao.progress<0.9f)
              {
                  toProgress = (int)ao.progress * 100;
                  while (displayProgress<toProgress)
                  {
                      displayProgress++;
                      SetLoadingPercentValue(displayProgress);
                      yield return new WaitForEndOfFrame();
                  }
              }
              toProgress = 100;
              while (displayProgress < toProgress)
              {
                  displayProgress++;
                  SetLoadingPercentValue(displayProgress);
                  yield return new WaitForEndOfFrame();
              }
              yield return new WaitForSeconds(1);
              ao.allowSceneActivation = true;
          }
          

  • 实现过程中产生的疑惑:

    • ContentSizeFitter组件的作用
    • unity中,object与Object的区别?

  • 对疑惑的解答:

    • ContentSizeFitter作用为调整RectTransform的大小以适应其内容大小,可作用于Text、Image、HorizontalLayoutGrou、GridLayoutGroup
    • object是C#中所有类型的基类,而Object是Unity引擎中所有对象的基类。
    • 此外,GameObject是Unity中的一个实体对象,他总是有一个Transform组件,用来定义对象在空间中的位置以及在场景层级中的位置;它可以附加其他组件(这些组件都是Object的子类)。Object提供实例化和销毁功能。

日期:3.10

posted @   静候霜白  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示