• 【Unity 框架】QFramework v1.0 使用指南 架构篇:05. 引入 Utility | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏


    在这一篇,我们来支持 CounterApp 的存储功能。

    其代码也非常简单,只需要修改一部分 Model 的代码即可,如下:

        // 定义一个 Model 对象
        public class CounterAppModel : AbstractModel
        {
            private int mCount;
    
            public int Count
            {
                get => mCount;
                set
                {
                    if (mCount != value)
                    {
                        mCount = value;
                        PlayerPrefs.SetInt(nameof(Count),mCount);
                    }
                }
            }
    
            protected override void OnInit()
            {
                Count = PlayerPrefs.GetInt(nameof(Count), mCount);
            }
        }
    

    这样就支持了非常基本的数据存储功能。

    当然还是有一些问题,如果时候未来我们需要存储的数据非常多的时候,Model 层就会充斥大量存储、加载相关的代码。

    还有就是,我们以后如果不想使用 PlayperPrefs 了,想使用 EasySave 或者 SQLite 的时候,就会造成大量的修改工作量。

    于是 QFramework 提供了一个 Utility 层,专门用来解决上述两个问题的,使用方法非常简单,如下:

    using UnityEngine;
    using UnityEngine.UI;
    
    namespace QFramework.Example
    {
        
        // 1. 定义一个 Model 对象
        public class CounterAppModel : AbstractModel
        {
            private int mCount;
    
            public int Count
            {
                get => mCount;
                set
                {
                    if (mCount != value)
                    {
                        mCount = value;
                        PlayerPrefs.SetInt(nameof(Count),mCount);
                    }
                }
            }
    
            protected override void OnInit()
            {
                var storage = this.GetUtility<Storage>();
    
                Count = storage.LoadInt(nameof(Count));
    
                // 可以通过 CounterApp.Interface 监听数据变更事件
                CounterApp.Interface.RegisterEvent<CountChangeEvent>(e =>
                {
                    this.GetUtility<Storage>().SaveInt(nameof(Count), Count);
                });
            }
        }
    
        // 定义 utility 层
        public class Storage : IUtility
        {
            public void SaveInt(string key, int value)
            {
                PlayerPrefs.SetInt(key,value);
            }
    
            public int LoadInt(string key, int defaultValue = 0)
            {
                return PlayerPrefs.GetInt(key, defaultValue);
            }
        }
    
    
        // 2.定义一个架构(提供 MVC、分层、模块管理等)
        public class CounterApp : Architecture<CounterApp>
        {
            protected override void Init()
            {
                // 注册 Model
                this.RegisterModel(new CounterAppModel());
                
                // 注册存储工具的对象
                this.RegisterUtility(new Storage());
            }
        }
        
        // 定义数据变更事件
        public struct CountChangeEvent // ++
        {
            
        }
        
        // 引入 Command
        public class IncreaseCountCommand : AbstractCommand 
        {
            protected override void OnExecute()
            {
                this.GetModel<CounterAppModel>().Count++;
                this.SendEvent<CountChangeEvent>(); // ++
            }
        }
        
        public class DecreaseCountCommand : AbstractCommand
        {
            protected override void OnExecute()
            {
                this.GetModel<CounterAppModel>().Count--;
                this.SendEvent<CountChangeEvent>(); // ++
            }
        }
    
        // Controller
        public class CounterAppController : MonoBehaviour , IController /* 3.实现 IController 接口 */
        {
            // View
            private Button mBtnAdd;
            private Button mBtnSub;
            private Text mCountText;
            
            // 4. Model
            private CounterAppModel mModel;
    
            void Start()
            {
                // 5. 获取模型
                mModel = this.GetModel<CounterAppModel>();
                
                // View 组件获取
                mBtnAdd = transform.Find("BtnAdd").GetComponent<Button>();
                mBtnSub = transform.Find("BtnSub").GetComponent<Button>();
                mCountText = transform.Find("CountText").GetComponent<Text>();
                
                
                // 监听输入
                mBtnAdd.onClick.AddListener(() =>
                {
                    // 交互逻辑
                    this.SendCommand<IncreaseCountCommand>();
                });
                
                mBtnSub.onClick.AddListener(() =>
                {
                    // 交互逻辑
                    this.SendCommand(new DecreaseCountCommand(/* 这里可以传参(如果有) */));
                });
                
                UpdateView();
                
                // 表现逻辑
                this.RegisterEvent<CountChangeEvent>(e =>
                {
                    UpdateView();
    
                }).UnRegisterWhenGameObjectDestroyed(gameObject);
            }
            
            void UpdateView()
            {
                mCountText.text = mModel.Count.ToString();
            }
    
            // 3.
            public IArchitecture GetArchitecture()
            {
                return CounterApp.Interface;
            }
    
            private void OnDestroy()
            {
                // 8. 将 Model 设置为空
                mModel = null;
            }
        }
    }
    
    

    代码非常简单,我们运行下 Unity 看下结果:

    f55b6c09-f5a0-402f-bffa-5ceb0bc3d8fb.gif

    运行正确。

    这样当我们,想要将 PlayerPrefs 方案替换成 EasySave 的时候,只需要对 Storage 里的代码进行修改即可。

    最后给出流程图,如下:

    image.png

    好了,这篇就介绍到这里。

    更多内容

  • 相关阅读:
    链表栈
    C# TCP应用编程二 同步TCP应用编程
    C# TCP应用编程一 概述
    C# 网络流
    远程连接 出现身份验证错误,要求的函数不受支持(这可能是由于CredSSP加密Oracle修正)
    C#线程Thread类
    C# 通过Internet搜索网络资源
    正则表达式
    C#文件的读写
    微服务实战
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/16798128.html
Copyright © 2020-2023  润新知