全局Unity生命周期管理
在之前的PlaneSpritesModel中,我们让它继承了IInit接口,单独继承这个接口就表示此脚本的生命周期由生命周期管理器管理。
LifeCycleMgr123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108using System;using System.Collections;using System.Collections.Generic;public class LifeCycleMgr : LazyMonoSing<LifeCycleMgr>, IInit{ private enum LifeName { INIT, UPD ...
转移View层逻辑
引入了Controller之后,我们就需要分离之前View层的一些逻辑。
StartView逻辑转移删除StartView的Init方法,以及InitChild内部的逻辑。
删除UIUtil的Button相关引用和AddListener方法
将方法转移到StartController当中,删除这里之前的Init方法
1234567891011[BindPrefab(Path.START_VIEW,Consts.BIND_PREFAB_PRIORITY_CONTROLLER)]public class StartController : ControllerBase{ protected override void InitChild() { transform.ButtonAction("Start",() => { UIMgr.Instance.Show(Path.SELECT_HERO_VIEW); }); }}
...
引入Controller
Controller负责修改Model,Model负责通知View层刷新,Controller层和View层是不交互的。
View:数据的显示、动画效果等
Controller:数据的计算、数据的修改、点击逻辑
我们使用UIManager作为中转站,一个点击事件的流转过程如下:
点击事件——Controller执行逻辑——UIManager(通知View进行刷新)——View
设置初始化优先级当一个Prefab可以绑定多个脚本时,需要指定每一个脚本的初始化顺序,这里View脚本的初始化要在Controller脚本之前。
修改BindPrefab特性在里面添加Priority属性,数字越小,代表优先级越高,默认是100.
12345678910111213using System;[AttributeUsage(AttributeTargets.Class)]public sealed class BindPrefabAttribute : Attribute{ public string Path { get;private set; } pu ...
强化界面3
强化界面的属性Item的逻辑以及金币钻石的逻辑都还没有完成,接下来继续。
Button加点逻辑修改PropertyItem,添加InitButtonAction方法
12345678910111213141516171819202122232425262728293031323334353637383940414243444546public class PropertyItem : MonoBehaviour, IViewUpdate, IViewShow{ //... public void Init(string key) { _key = key; _itemId++; UpdatePos(_itemId); InitButtonAction();//+++ } private void InitButtonAction()//+++ { transform.ButtonAction("Add", AddActio ...
View层重构
我们之前在制作强化界面时,点击切换飞机按钮属性界面就会跟着改变。两个部分是在StrengthenView内进行联系的。
1234567891011[BindPrefab(Path.STRENGTHEN_VIEW)]public class StrengthenView : ViewBase{ protected override void InitChild() { SwitchPlayer switchPlayer = UIUtil.Get("Switchplayer").Go.AddComponent<SwitchPlayer>(); PlaneProperty planeProperty = UIUtil.Get("Property").Go.AddComponent<PlaneProperty>(); switchPlayer.OnSwitchAction(planeProperty.UpdataId); }}
这 ...
配置管理器
当我们需要读取战机的属性时,有时会发生冲突,我们不知道需要从配置中读取属性还是从存档中读取属性。
这时我们使用配置管理器,在游戏一开始时初始化所有配置,把配置信息都写入存档中。
ConfigMgr123456789101112131415161718192021222324using LitJson;public class ConfigMgr : NormalSingleton<ConfigMgr>{ public void Init() { var config = ReaderMgr.Instance.GetReader(Path.INIT_PLANE_CONFIG); config["planes"].Get<JsonData>(data => { foreach (JsonData item in data) { foreach (string key in i ...
强化界面2
PlanePropertyPlaneProperty脚本是动态挂载在Property对象上的脚本,用来动态加载PropertyItem,显示当前战机的各种属性和加点情况。
属性加点部分也是需要配置的,我们修改InitPlane.json文件
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108{ "planes": [ { "planeId": 0, "level": 0, "attackTime": 1, "attack": { ...
资源命名规范工具
在第一节中我们演示了资源规范工具的写法。在上一节中我们遇到了强制Sprite图片的命名规范的情况(不按照规范命名的Sprite加载不出来),这一节就来实现一个检测命名规范的工具。
TextureSetting修改TextureSetting,增加检测指定文件夹路径内文件名的逻辑
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849using UnityEngine;using UnityEditor;using System.Text.RegularExpressions;public class TextureImportSetting : AssetPostprocessor{ private static FolderData _playerData;//Editor环境下的变量必须是静态的 private void OnPreprocessTexture() { NamingConvention(); ...
强化界面
强化界面布局如下
StrengthenView123456789[BindPrefab(Path.STRENGTHEN_VIEW)]public class StrengthenView : ViewBase{ protected override void InitChild() { UIUtil.Get("Switchplayer").Go.AddComponent<SwitchPlayer>(); }}
Path内的路径自己添加即可
给SwitchPlayer对象添加SwitchPlayer脚本,SwitchPlayer脚本也是一个继承了ViewBase的脚本
修改ViewBase的逻辑switchPlayer虽然是StrengthView的子物体,但我们依然可以给它单独添加脚本,同样继承ViewBase。只不过我们此时需要修改ViewBase,比如父物体的View被设定为Hide时,所有子物体的View也要被设定Hide。否则子物体肯定会出现问题。
我们先给ViewB ...
协程管理器
协程一般可以分为两种,一种是只执行一次,比如加载资源或请求网络,一种是某些操作流程或动画,可以执行多次,协程管理器主要管理的就是后者,对可复用的协程进行缓存和统一管理。
懒汉模式Mono单例协程管理器使用懒汉模式比较好。
12345678910111213141516171819using UnityEngine;public class LazyMonoSing<T> : MonoBehaviour where T : MonoBehaviour{ private static T instance; public static T Instance { get { if (instance == null) { GameObject go = new GameObject(typeof(T).Name); instance = go.AddComponent<T>(); ...