Unity中MVC簡單應用

前言

MVC自1982年被設(shè)計出來,至今都有著很大比重的使用率,特別是目前軟件及游戲迭代如此之快的情況下。高效的增刪功能,低耦合又小巧靈活的框架MVC,深受廣大ProgramDesigner的喜愛,本篇簡單介紹一下,Unity中MVC框架的簡單應用,予以拋磚引玉之意。

  • 首先看一下MVC組件類型的關(guān)系和功能


    MVC組件類型的關(guān)系和功能(摘自百度百科)
    數(shù)據(jù)是程序的靈魂,視圖是看清靈魂的眼睛,控制器從中撥開迷霧,這就形成了現(xiàn)在的MVC。
    
  • MVC的業(yè)務流程

MVC的業(yè)務流程
 大多數(shù)的程序都是由用戶輸入開始,到用戶得到反饋結(jié)束,如此循環(huán)。
  • 簡單實例-Model
using UnityEngine;
using System.Collections;

/// <summary>
/// 模型委托(當用戶信息發(fā)生變化時執(zhí)行)
/// </summary>
public delegate void OnValueChange (int val);

public class PlayerMsgModel
{
    //玩家等級
    private int playerLevel;
    //玩家經(jīng)驗
    private int playerExperience;
    //玩家升級經(jīng)驗
    private int playerFullExperience;
    //金幣數(shù)量
    private int goldNum;
    //聲明委托對象,接收當?shù)燃壈l(fā)生變化時,觸發(fā)的事件
    public OnValueChange OnLevelChange;
    //聲明委托對象,接收當經(jīng)驗發(fā)生變化時,觸發(fā)的事件
    public OnValueChange OnExperienceChange;
    //聲明委托對象,接收當升級經(jīng)驗發(fā)生變化時,觸發(fā)的事件
    public OnValueChange OnFullExperienceChange;
    //聲明委托對象,接收當金幣數(shù)量發(fā)生變化時,觸發(fā)的事件
    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) {
                //執(zhí)行委托
                OnLevelChange (playerLevel);
            }
        }
    }

    /// <summary>
    /// 玩家經(jīng)驗屬性
    /// </summary>
    /// <value>The player experience.</value>
    public int PlayerExperience {
        get {
            return playerExperience;
        }
        set {
            playerExperience = value;
            if (OnExperienceChange != null) {
                OnExperienceChange (playerExperience);
            }
        }
    }

    /// <summary>
    /// 玩家升級經(jīng)驗屬性
    /// </summary>
    /// <value>The player full experience.</value>
    public int PlayerFullExperience {
        get {
            return playerFullExperience;
        }
        set {
            playerFullExperience = value;
            if (OnFullExperienceChange != null) {
                OnFullExperienceChange (playerFullExperience);
            }
        }
    }

    /// <summary>
    /// 金幣數(shù)量屬性
    /// </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經(jīng)驗值
    public void SetExperience (int experience)
    {
        //將字符串以“/”拆開
        string[] str = playerExperience.text.Split (new char []{ '/' });
        //用新的經(jīng)驗值重組
        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>
    /// 提升經(jīng)驗按鈕點擊事件
    /// </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

結(jié)束語

MVC只是程序框架中的其中一種,其實每個架構(gòu)師腦子里都存著很多說不出名字的框架,這就是為什么人家叫架構(gòu)師,你叫程序員的原因。有一個好的程序框架,比糊里糊涂的寫代碼強千萬倍,靈活迭代、高效編碼,只要你想,你就可以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 在一條街上,有五間并排的房子,五間房子的主人來自五個不同的國家。為了顯示他們的個性,五個人把自己的房子都粉刷成五...
    殘腦閱讀 1,343評論 0 1
  • 起筆:2016.02.17終版:2016.10.01 每到放假的日子總會有些懷舊,翻翻簡書里還沒有發(fā)布的草稿,就看...
    未枝丫閱讀 383評論 3 2
  • 這幾天挺忙的,大部分時間都浪費在折騰代理上了。因為客戶的工作環(huán)境對信息安全特別看重,所有的辦公機器默認都是不能上網(wǎng)...
    隨便寫點閱讀 1,208評論 0 3

友情鏈接更多精彩內(nèi)容