unity自制模式(MVC与命令模式相结合)(1)

前言:

该文章有两篇《unity自制模式(MVC与命令模式相结合)(1)》与《unity自制模式(MVC与命令模式相结合)(2)》直达下一篇(2)

本框架实行MVC结构且附带命令模式进行搭建,简单称述:

(1)首先Canvas中UI面板作为View的显示;

(2)UIEventArgs作为UI面板的Model层;

(3)Handler作为UI面板的控制单元;

(4)Command作为UI面板的命令层,View层会发送消息并附带Model给Handler,Handler将指定给命令。

注:该结构将MVC分层明确,并附带命令,可实现面板的数据进行撤销与反撤销功能。

一、UML图

该图构建比较潦草,如想要具体了解,可以继续阅读并在下一篇(2)文章中实践一下。


e2f9731f62f245c08a010e324d537703.png

二、框架说明

这个框架的主要组成部分和功能:

1. **ICommand**:定义了执行和撤销命令的接口。

2. **IEventArgs**:定义了事件参数的接口,包括事件类型和处理程序名称。

3. **IHandler**:定义了处理事件参数和发送消息的接口。

4. **IUIEvent**:定义了发送和接收 UI 事件的接口。

5. **Singleton<T>**:实现了单例模式的模板类,确保每个类只有一个实例。

6. **AbsCommand**:抽象类,定义了执行和撤销命令的抽象方法。

7. **CommandHandler**:命令处理程序,负责管理执行、撤销和重做命令。

8. **UIEventHandler**:UI 事件处理程序,负责注册处理程序和 UI 事件,并处理事件参数和消息。

9. **AbsUIEventArgs**:UI 事件参数的抽象类,定义了事件类型和处理程序名称。

10. **AbsUIEvent**:UI 事件的抽象类,定义了发送和接收 UI 事件的虚拟方法。

11. **AbsHandler**:处理程序的抽象类,定义了处理事件参数和发送消息的抽象方法。

12. **SimpleHandler<T>**:简单处理程序的模板类,实现了处理程序的基本功能。

13. **ConcretePanel1**:具体 UI 事件类,实现了特定类型的 UI 事件。

14. **ConcretePanelCommand1**:具体命令类,实现了特定类型的命令。

15. **ConcretePanelArgs1**:具体 UI 事件参数类,定义了特定类型 UI 事件的参数。

16. **ConcretePanelHandler1**:具体处理程序类,实现了特定类型处理程序的功能。

17. **CommandType**:命令类型的枚举,用于标识不同类型的命令。

18. **HandlerUtilities**:处理程序工具类,提供处理程序的一些辅助功能。

19. **UIPanelManager**:UI 面板管理器,管理具体的 UI 面板和参数。

这些类组成了一个基于命令模式和事件驱动的系统框架,通过统一的接口和抽象类,实现了系统的灵活性和可扩展性。

三、程序展示

1、接口定义:

(1)ICommand:

public interface ICommand
{
    void Execute();
    void UnExecute();
}

(2)IEventArgs:

public interface IEventArgs
{
    Type type { get; }
    ushort HandlerName { get; }
}

(3)IHandler:

public interface IHandler
{
    void Dispose(IEventArgs args);
    void SendMessage(params object[] args);
}

(4)IUIEvent:

public interface IUIEvent
{
    void SendEvent(IEventArgs args);
    void Receive(ushort sender, params object[] data);
}

(5)Singleton单例

public class Singleton<T> where T : new()
{
    private static T _Instance = new T();

    protected Singleton()
    {
        Debug.Assert(null == _Instance);
    }
    public static T Instance
    {
        get { return _Instance; }
    }
}

2、命令撤销与还原的实现

(1)CommandHandler :

public class CommandHandler : Singleton<CommandHandler>
{
    private Stack<ICommand> undoCommands = new Stack<ICommand>();
    private Stack<ICommand> redoCommands = new Stack<ICommand>();

    /// <summary>
    /// 是否正在撤销
    /// </summary>
    /// <returns></returns>
    public bool isUndoing;
    /// <summary>
    /// 是否正在恢复撤销
    /// </summary>
    public bool isRedoing;
    /// <summary>
    /// 撤销命令
    /// </summary>
    /// <param name="levels">次数</param>
    public void Undo(int levels)
    {
        for (int i = 1; i <= levels; i++)
        {
            if (undoCommands.Count != 0)
            {
                ICommand command = undoCommands.Pop();
                isUndoing = true;
                command.UnExecute();
                redoCommands.Push(command);
                isUndoing = false;
            }

        }
    }
    /// <summary>
    /// 恢复撤销命令
    /// </summary>
    /// <param name="levels">次数</param>
    public void Redo(int levels)
    {
        for (int i = 1; i <= levels; i++)
        {
            if (redoCommands.Count != 0)
            {
                ICommand command = redoCommands.Pop();
                isRedoing = true;
                command.Execute();
                undoCommands.Push(command);
                isRedoing = false;
            }

        }
    }
    /// <summary>
    /// 插入命令
    /// </summary>
    /// <param name="command"></param>
    public void InsertCommand(ICommand command)
    {
        undoCommands.Push(command);
        redoCommands.Clear();
    }

    public void ClearAllCommand()
    {
        undoCommands.Clear();
        redoCommands.Clear();
    }
}

(2)AbsCommand:

public abstract class AbsCommand : ICommand
{
    public abstract void Execute();
    public abstract void UnExecute();
}

(3)子类实现ConcreteCommand1:

public class ConcreteCommand1 : AbsCommand
{
    public override void Execute()
    {
        
    }

    public override void UnExecute()
    {
        
    }
}

(4) CommandType:

public enum CommandType
{
    DEFAULT,
    ConfigAddCommand
}

3.UIEventArgs参数实现

 (1)AbsUIEventArgs :

public abstract class AbsUIEventArgs : IEventArgs
{
    public virtual Type type
    {
        get
        {
            return this.GetType();
        }
        protected set { }
    }
    public AbsUIEventArgs()
    {

    }

    public abstract ushort HandlerName { get; }
}

(2)子类继承ConcreteUIEventArgs1 :

public class ConcreteUIEventArgs1 : AbsUIEventArgs
{
    public override ushort HandlerName => ConcreteHandler1.Instance.HandleName;
}

4.Handler的实现:

 (1)AbsHandler :

public abstract class AbsHandler : IHandler
{
    public abstract ushort HandleName { get; protected set; }
    private UIEventHandler _handler;
    public AbsHandler()
    {
        _handler = UIEventHandler.Instance;
        if (HandleName != 0)
        {
            _handler.Register(HandleName, this);
        }
    }
    public virtual void Dispose(IEventArgs args)
    {

    }

    public virtual void SendMessage(params object[] args)
    {
        _handler.SendMessage(HandleName, args);
    }
}

(2)SimpleHandler:

public class SimpleHandler<T> : AbsHandler where T : new()
{
    private static T _instance;
    private static object _lock = new object();
    public override ushort HandleName { get; protected set; }
    protected SimpleHandler()
    {
    }
    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new T();
                    }
                }
            }
            return _instance;
        }
    }
}

 (3)UIEventHandler (将UI事件分配给正确的处理Handler):

using System.Collections.Generic;

public class UIEventHandler : Singleton<UIEventHandler>
{
    private Dictionary<ushort, IHandler> _handlersDic = new Dictionary<ushort, IHandler>();
    private List<IUIEvent> _uiEventList = new List<IUIEvent>();
    public void Register(ushort key, IHandler handler)
    {
        if (_handlersDic.ContainsKey(key))
        {
            return;
        }
        _handlersDic.Add(key, handler);
    }
    public void RegisterUI(IUIEvent ui)
    {
        if (ui != null && !_uiEventList.Contains(ui))
        {
            _uiEventList.Add(ui);
        }
    }
    public void Dispose(IEventArgs eventArgs)
    {
        IHandler handler;
        if (_handlersDic.TryGetValue(eventArgs.HandlerName, out handler))
        {
            handler.Dispose(eventArgs);
        }
    }
    public void SendMessage(ushort sender, params object[] data)
    {
        if (sender != 0 && _handlersDic.ContainsKey(sender))
        {
            for (int i = 0; i < _uiEventList.Count; i++)
            {
                _uiEventList[i].Receive(sender, data);
            }
        }
    }
}

(4)子类实现ConcreteHandler1 :

public class ConcreteHandler1 : SimpleHandler<ConfigStepHandler>
{ 
    public override ushort HandleName => HandlerUtilities.ConcreteHandler1;
    public override void Dispose(IEventArgs args)
    {

    }
}

(5)HandlerUtilities:

public class HandlerUtilities
{
    public const ushort ConcreteHandler1 = 1;
}

 

5、事件面板注册实现

(1)AbsUIEvent :

public abstract class AbsUIEvent : IUIEvent
{
    protected UIEventHandler eventHandler;
    public AbsUIEvent()
    {
        eventHandler = UIEventHandler.Instance;
        eventHandler.RegisterUI(this);
    }
    public virtual void SendEvent(IEventArgs args)
    {
        eventHandler.Dispose(args);
    }
    public virtual void Receive(ushort sender, params object[] data)
    {

    }
}

四、总结

 框架说那么多不如自己去    直达下一篇(2)    实践一下!

 

 

 

 

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MVC模式(Model-View-Controller)是一种软件设计模式,主要用来组织和管理程序的开发和设计。Unity是一款游戏开发引擎,提供了一系列工具和功能来帮助开发者创建和开发游戏。 在Unity中,使用MVC模式可以将游戏的逻辑和数据组织起来,实现更好的代码结构和可维护性。具体来说,Unity中的游戏开发可以按照以下方式应用MVC模式: 1. Model(模型):模型部分是游戏中的数据和逻辑,包括角色属性、游戏状态、游戏规则等。在Unity中,我们可以使用C#编写类来表示模型,并且使用属性、方法和事件来操作和更新模型的数据。 2. View(视图):视图部分是游戏中的用户界面和展示层,包括菜单、按钮、角色模型等。在Unity中,视图可以使用GUI、UI系统或者自定义的UI组件来实现。视图负责显示模型数据,并且根据用户的操作推动控制器进行逻辑处理。 3. Controller(控制器):控制器部分是游戏中的业务逻辑,负责接收用户的输入,控制模型的更新和处理模型之间的交互。在Unity中,我们可以编写脚本来处理用户输入,并根据输入的变化来调整模型的数据或触发事件。 通过使用MVC模式Unity中的游戏开发可以更好地分离游戏的逻辑、数据和展示层,使得程序更容易理解、扩展和维护。同时,该设计模式也可以增加代码的重用性和可测试性,提高团队合作的效率。 总而言之,MVC模式Unity中的应用可以帮助开发者更好地组织游戏的逻辑和代码结构,提升开发效率和代码质量。 ### 回答2: MVC模式是一种对软件进行组织的架构模式,其中M代表模型(Model),V代表视图(View),C代表控制器(Controller)。Unity是一种跨平台的游戏开发引擎。 在Unity中使用MVC模式可以更好地管理游戏开发过程中的逻辑和界面分离。首先,模型(Model)部分负责管理游戏的数据和逻辑。它定义了游戏的规则和行为,并且可以与其他模型进行交互。在Unity中,模型可以是游戏对象的脚本,用于控制游戏对象的行为和属性。 其次,视图(View)部分负责展示游戏的界面和图形内容。在Unity中,视图可以是游戏对象的渲染组件,例如UI元素或3D模型。视图接收模型的数据并将其显示给玩家。同时,视图还可以向控制器发送用户输入的消息,以便更新游戏状态。 最后,控制器(Controller)部分是连接模型和视图的中间人。它接收视图发送的输入消息,并根据消息的类型调用模型的方法进行状态更新。控制器还可以向视图发送消息,告知其需要更新界面或显示新的内容。在Unity中,控制器可以是脚本组件,用于处理用户输入和游戏逻辑的交互。 通过使用MVC模式Unity可以实现良好的代码组织和项目管理。它将游戏逻辑,界面显示和用户交互分离开来,使开发人员可以更专注于每个部分的设计和开发。此外,MVC模式还提高了代码的可维护性和可扩展性,使团队成员可以更方便地合作开发和修改游戏。 ### 回答3: MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序的不同组成部分进行分离和组织。在Unity中,也可以应用MVC模式来设计和开发游戏或应用程序。 在MVC模式中,三个主要组成部分分别为模型(Model)、视图(View)和控制器(Controller)。 1. 模型(Model):模型表示游戏或应用程序的数据和逻辑部分。它负责处理和管理数据,以及定义游戏规则和逻辑。在Unity中,模型通常是由脚本或脚本组件实现的。 2. 视图(View):视图负责展示和渲染游戏或应用程序的界面和图形。它负责将模型中的数据以可视化的形式呈现给用户。在Unity中,视图通常是由场景、UI元素或其他图形组件构成的。 3. 控制器(Controller):控制器作为模型和视图之间的桥梁,负责处理用户输入和事件,并将其转化为对模型或视图的操作。它帮助用户与游戏或应用程序进行交互,并控制游戏流程。在Unity中,控制器通常通过脚本来实现。 使用MVC模式可以提高游戏或应用程序的可维护性、可扩展性和可重用性。通过将不同的逻辑和功能进行分离,我们可以更方便地进行测试、维护和更新。 在Unity中,我们可以根据游戏或应用程序的需求,使用MVC模式来设计和实现不同的功能模块,比如角色控制、UI交互、关卡管理等。通过合理地规划和组织,我们能够更有效地编写代码、管理资源和调试错误,提高开发效率和质量。 总结:在Unity中,MVC模式可用于游戏或应用程序的设计和开发,帮助我们更好地组织和管理代码,提高软件的可维护性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平杨猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值