技术笔记(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 方法。
- 关于扩展方法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提供实例化和销毁功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)