Unity中MVC简单应用

前言

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,080评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • 在一条街上,有五间并排的房子,五间房子的主人来自五个不同的国家。为了显示他们的个性,五个人把自己的房子都粉刷成五...
    残脑阅读 1,210评论 0 1
  • 起笔:2016.02.17终版:2016.10.01 每到放假的日子总会有些怀旧,翻翻简书里还没有发布的草稿,就看...
    未枝丫阅读 301评论 3 2
  • 这几天挺忙的,大部分时间都浪费在折腾代理上了。因为客户的工作环境对信息安全特别看重,所有的办公机器默认都是不能上网...
    随便写点阅读 1,151评论 0 3