Unity中MVC简单应用

作者: 欣羽馨予 | 来源:发表于2016-07-27 17:55 被阅读3340次

    前言

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

    • 首先看一下MVC组件类型的关系和功能


      MVC组件类型的关系和功能(摘自百度百科)
      数据是程序的灵魂,视图是看清灵魂的眼睛,控制器从中拨开迷雾,这就形成了现在的MVC。
      
    • MVC的业务流程

    MVC的业务流程
     大多数的程序都是由用户输入开始,到用户得到反馈结束,如此循环。
    
    • 简单实例-Model
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 模型委托(当用户信息发生变化时执行)
    /// </summary>
    public delegate void OnValueChange (int val);
    
    public class 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;
    
        //单例
        private static PlayerMsgModel mod;
    
        public static PlayerMsgModel GetMod ()
        {
            if (mod == null) {
                mod = new PlayerMsgModel ();
            }
            return mod;
        }
    
        private PlayerMsgModel ()
        {
        }
    
        /// <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);
                }
            }
        }
    }
    
    • 简单实例-View
    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    
    public class PlayerMsgView : MonoBehaviour
    {
        //UI
        public Text playerLevel;
        public Text playerExperience;
        public Text goldNum;
        public Button experienceUpButton;
    
        void Start ()
        {
            //委托事件绑定
            PlayerMsgModel.GetMod ().OnLevelChange += SetLevel;
            //委托事件绑定
            PlayerMsgModel.GetMod ().OnExperienceChange += SetExperience;
    
            PlayerMsgModel.GetMod ().OnFullExperienceChange += SetFullExperience;
            PlayerMsgModel.GetMod ().OnGoldNumChange += SetGoldNum;
            //View绑定按钮控制功能
            experienceUpButton.onClick.AddListener (
                PlayerMsgController.controller.OnExperienceUpButtonClick);
        }
    
        //修改UILevel值
        public void SetLevel (int level)
        {
            playerLevel.text = level.ToString ();
        }
    
        //修改UI经验值
        public void SetExperience (int experience)
        {
            //将字符串以“/”拆开
            string[] str = playerExperience.text.Split (new char []{ '/' });
            //用新的经验值重组
            playerExperience.text = experience + "/" + str [1];
        }
    
        public void SetFullExperience (int fullExiperience)
        {
            string[] str = playerExperience.text.Split (new char []{ '/' });
    
            playerExperience.text = str [0] + "/" + fullExiperience;
        }
    
        public void SetGoldNum (int goldn)
        {
            goldNum.text = goldn.ToString ();
        }
    
    }
    
    • 简单实例-Controller
    using UnityEngine;
    using System.Collections;
    
    public class PlayerMsgController : MonoBehaviour
    {
        public static PlayerMsgController controller;
    
        private int levelUpValue = 20;
    
        void Awake ()
        {
            controller = this;
        }
    
        void Start ()
        {
            PlayerMsgModel.GetMod ().PlayerLevel = 1;
            PlayerMsgModel.GetMod ().PlayerExperience = 0;
            PlayerMsgModel.GetMod ().PlayerFullExperience = 100;
            PlayerMsgModel.GetMod ().GoldNum = 0;
        }
    
        /// <summary>
        /// 提升经验按钮点击事件
        /// </summary>
        public void OnExperienceUpButtonClick ()
        {
            PlayerMsgModel.GetMod ().PlayerExperience += levelUpValue;
            if (PlayerMsgModel.GetMod ().PlayerExperience
                >= PlayerMsgModel.GetMod ().PlayerFullExperience) {
                PlayerMsgModel.GetMod ().PlayerLevel += 1;
                PlayerMsgModel.GetMod ().PlayerFullExperience +=
                    200 * PlayerMsgModel.GetMod ().PlayerLevel;
                levelUpValue += 20;
                if (PlayerMsgModel.GetMod ().PlayerLevel % 3 == 0) {
                    PlayerMsgModel.GetMod ().GoldNum +=
                        100 * PlayerMsgModel.GetMod ().PlayerLevel;
                }
            }
        }
    }
    
    • 效果展示
    效果展示.gif

    结束语

    MVC只是程序框架中的其中一种,其实每个架构师脑子里都存着很多说不出名字的框架,这就是为什么人家叫架构师,你叫程序员的原因。有一个好的程序框架,比糊里糊涂的写代码强千万倍,灵活迭代、高效编码,只要你想,你就可以。

    相关文章

      网友评论

      • 4f33890b3fce:对我一个新手来说,写的很好!很容易就理解了
        欣羽馨予:@土耳其的土真的土 谢谢支持:smile:
      • 0e8105e5ec97:公司用pureMVC做的项目,以前都不知道MVC这个东西,所以上网学习。这篇确实很精简,能看懂(知道观察者模式即可)。但是回头看pureMVC还是一脸蒙逼
        欣羽馨予:@阿加西_9244 了解一下依赖倒置就能看懂了
      • 60a6b95b6970:很简洁,表达很清晰
      • 我是胡歌:莫老大,MVC在我看来model和view之间是不能直接通信的,model和view之间可能通过delegate或者target/action来实现吧
        欣羽馨予:一般是用控制器架构双方
      • e6f5470edfc3:楼主666,读完9篇下来,干货满满。求联系方式
        e6f5470edfc3:@火在燃烧 胡歌是谁?
      • YuJhin:看得懂

      本文标题:Unity中MVC简单应用

      本文链接:https://www.haomeiwen.com/subject/gqwojttx.html