Unity 工具类 之 简单的 MVC 框架使用实现简单的案例demo

Unity 工具类 之 简单的 MVC 框架使用实现简单的案例demo

 

目录

Unity 工具类 之 简单的 MVC 框架使用实现简单的案例demo

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码

七、参考工程


 

一、简单介绍

Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。

Unity中MVC框架的简单应用。MVC自1982年被设计出来,至今都有着很大比重的使用率,特别是目前软件及游戏迭代此之快的情况下。高效的增删功能低耦合又小巧灵活的框架MVC,深受广大ProgramDesigner的喜爱。

 

二、实现原理

1、单例类,保证整个场景中只有一个类管理相关类;

2、MVC 每个 每个独立成快,又有简单的联系;

3、MVC 框架简单如下图;

4、换种形式的 MVC 业务流程

5、MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面 显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于 映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。  通常模型对象负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分。  通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分。  通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

 

三、注意事项

1、这里是一个简单的MVC思想的使用,具体使用形式根据自己的情况,酌情做出改变;

 

四、效果预览

 

五、实现步骤

1、打开Unity,新建一个工程,在场景中简单布局一些 UI,如下图

 

2、在工程中,新建一写脚本,单例类使类唯一,Model 类管理数据,View 类 管理 UI 视图,Controller 类一些逻辑控制,如下图

 

3、把 View脚本挂载到 canvas 上,并赋值对应 UI,如下图

 

4、把 Controller 脚本挂载到场景中,如下图

 

5、运行场景,点击按钮,增加经验,经验、等级、金币变化效果如下

 

六、关键代码

1、PlayerMsgModel

using UnityEngine;

using System.Collections;



/// <summary>

/// 模型委托(当用户信息发生变化时执行)

/// </summary>

public delegate void OnValueChange(int val);



public class PlayerMsgModel : Singleton<PlayerMsgModel>
{

    //玩家等级
    private int playerLevel;

    //玩家经验
    private int playerExperience;

    //玩家升级经验
    private int playerFullExperience;

    //金币数量
    private int goldNum;

    //声明委托对象,接收当等级发生变化时,触发的事件
    public OnValueChange OnLevelChange;

    //声明委托对象,接收当经验发生变化时,触发的事件
    public OnValueChange OnExperienceChange;

    //声明委托对象,接收当升级经验发生变化时,触发的事件
    public OnValueChange OnFullExperienceChange;

    //声明委托对象,接收当金币数量发生变化时,触发的事件
    public OnValueChange OnGoldNumChange;



    /// <summary>
    /// 玩家等级属性
    /// </summary>
    /// <value>The player level.</value>
    public int PlayerLevel
    {

        get
        {

            return playerLevel;

        }

        set
        {

            playerLevel = value;

            //如果委托对象不为空

            if (OnLevelChange != null)
            {

                //执行委托

                OnLevelChange(playerLevel);

            }

        }

    }



    /// <summary>
    /// 玩家经验属性
    /// </summary>
    /// <value>The player experience.</value>
    public int PlayerExperience
    {

        get
        {

            return playerExperience;

        }

        set
        {

            playerExperience = value;

            if (OnExperienceChange != null)
            {

                OnExperienceChange(playerExperience);

            }

        }

    }



    /// <summary>
    /// 玩家升级经验属性
    /// </summary>
    /// <value>The player full experience.</value>
    public int PlayerFullExperience
    {

        get
        {

            return playerFullExperience;

        }

        set
        {

            playerFullExperience = value;

            if (OnFullExperienceChange != null)
            {

                OnFullExperienceChange(playerFullExperience);

            }

        }

    }



    /// <summary>
    /// 金币数量属性
    /// </summary>
    /// <value>The gold number.</value>
    public int GoldNum
    {

        get
        {

            return goldNum;

        }

        set
        {

            goldNum = value;

            if (OnGoldNumChange != null)
            {

                OnGoldNumChange(goldNum);

            }

        }

    }

}

 

2、PlayerMsgView

using UnityEngine;

using UnityEngine.UI;



public class PlayerMsgView : MonoBehaviour
{

    //UI
    public Text playerLevel;
    public Text playerExperience;
    public Text goldNum;
    public Button experienceUpButton;

    void Start()
    {

        InitView();

    }

    /// <summary>
    ///初始化 VIew 相关
    /// </summary>
    void InitView() {
        //委托事件绑定
        PlayerMsgModel.Instance.OnLevelChange += SetLevel;
        PlayerMsgModel.Instance.OnExperienceChange += SetExperience;
        PlayerMsgModel.Instance.OnFullExperienceChange += SetFullExperience;
        PlayerMsgModel.Instance.OnGoldNumChange += SetGoldNum;

        //View绑定按钮控制功能
        experienceUpButton.onClick.AddListener(
            PlayerMsgController.Instance.OnExperienceUpButtonClick);
    }



    //修改UILevel值
    public void SetLevel(int level)
    {

        playerLevel.text = "Level: "+level.ToString();

    }



    //修改UI经验值( 格式:exp: 50 / 100)
    public void SetExperience(int experience)
    {
        string[] str = playerExperience.text.Split(new char[] { '/' });
        //用新的经验值重组
        playerExperience.text = "Exp: "+experience +"/"+ str[1];

    }


    //修改UI经验值( 格式:exp: 50 / 100)
    public void SetFullExperience(int fullExiperience)
    {

        string[] str = playerExperience.text.Split(new char[] { '/' });

        playerExperience.text = str[0] + "/" + fullExiperience;

    }



    public void SetGoldNum(int goldn)
    {

        goldNum.text = "Gold: "+goldn.ToString();

    }



}

3、PlayerMsgController

using UnityEngine;

using System.Collections;



public class PlayerMsgController : MonoSingleton<PlayerMsgController>

{

    // 升级的初始经验增加值
    private int levelUpValue = 20;

    void Start()

    {

        InitModel();

    }

    /// <summary>
    /// 初始化数据
    /// </summary>
    void InitModel()
    {
        PlayerMsgModel.Instance.PlayerLevel = 1;

        PlayerMsgModel.Instance.PlayerExperience = 0;

        PlayerMsgModel.Instance.PlayerFullExperience = 100;

        PlayerMsgModel.Instance.GoldNum = 0;
    }



    /// <summary>
    /// 提升经验按钮点击事件
    /// </summary>
    public void OnExperienceUpButtonClick()
    {

        PlayerMsgModel.Instance.PlayerExperience += levelUpValue;

        if (PlayerMsgModel.Instance.PlayerExperience

            >= PlayerMsgModel.Instance.PlayerFullExperience)
        {

            PlayerMsgModel.Instance.PlayerLevel += 1;

            PlayerMsgModel.Instance.PlayerFullExperience +=

                200 * PlayerMsgModel.Instance.PlayerLevel;

            levelUpValue += 20;

            if (PlayerMsgModel.Instance.PlayerLevel % 3 == 0)
            {

                PlayerMsgModel.Instance.GoldNum +=

                    100 * PlayerMsgModel.Instance.PlayerLevel;

            }

        }

    }

}

4、Singleton

public abstract class Singleton<T> where T : class, new()
{
    private static T instance = null;

    // 多线程安全机制
    private static readonly object locker = new object();

    public static T Instance
    {
        get
        {
            lock (locker)
            {
                if (instance == null)
                    instance = new T();
                return instance;
            }
        }
    }
}

5、MonoSingleton

using UnityEngine;

public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance = null;

    private static readonly object locker = new object();

    private static bool bAppQuitting;

    public static T Instance
    {
        get
        {
            if (bAppQuitting)
            {
                instance = null;
                return instance;
            }

            lock (locker)
            {
                if (instance == null)
                {
                    instance = FindObjectOfType<T>();
                    if (FindObjectsOfType<T>().Length > 1)
                    {
                        Debug.LogError("不应该存在多个单例!");
                        return instance;
                    }

                    if (instance == null)
                    {
                        var singleton = new GameObject();
                        instance = singleton.AddComponent<T>();
                        singleton.name = "(singleton)" + typeof(T);
                        singleton.hideFlags = HideFlags.None;
                        DontDestroyOnLoad(singleton);
                    }
                    else
                        DontDestroyOnLoad(instance.gameObject);
                }
                instance.hideFlags = HideFlags.None;
                return instance;
            }
        }
    }

    private void Awake()
    {
        bAppQuitting = false;
    }

    private void OnDestroy()
    {
        bAppQuitting = true;
    }
}

 

七、参考工程

点击下载工程

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity实现 MVC 架构通常需要以下几步: 1. 创建 Model 类:Model 类用于存储数据和数据操作方法,例如: ``` public class PlayerModel { private int _health; public int Health { get { return _health; } set { _health = value; if (_health <= 0) { // 触发死亡事件 OnDeath(); } } } public event Action OnDeath; public void TakeDamage(int amount) { Health -= amount; } } ``` 2. 创建 View 类:View 类用于显示数据,例如: ``` public class PlayerView : MonoBehaviour { public TextMeshProUGUI healthText; public void UpdateHealth(int health) { healthText.text = "Health: " + health; } } ``` 3. 创建 Controller 类:Controller 类用于控制 Model 和 View,例如: ``` public class PlayerController { private PlayerModel _model; private PlayerView _view; public PlayerController(PlayerModel model, PlayerView view) { _model = model; _view = view; // 监听 Model 的数据变化并更新 View _model.OnHealthChanged += _view.UpdateHealth; // 监听 View 的用户操作并控制 Model _view.OnTakeDamage += _model.TakeDamage; } } ``` 4. 在场景中创建 View 对象,并在 Controller 中传入 Model 和 View: ``` public class GameController : MonoBehaviour { public PlayerView playerViewPrefab; private void Start() { // 创建 Model 对象 var playerModel = new PlayerModel(); // 创建 View 对象并绑定到场景中的 GameObject 上 var playerView = Instantiate(playerViewPrefab); playerView.transform.SetParent(transform, false); // 创建 Controller 对象并传入 Model 和 View var playerController = new PlayerController(playerModel, playerView); } } ``` 这样就完成了一个简单MVC 架构的实现。在实际项目中,可能需要更复杂的 Model 和 View 类,以及更多的 Controller 类来控制不同的数据和视图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

仙魁XAN

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

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

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

打赏作者

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

抵扣说明:

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

余额充值