Unity (十二) MVC框架:關於MVC 編程模式的模擬運用


 

MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式:
  • Model(模型)表示應用程序核心(比如數據庫記錄列表)。
  • View(視圖)顯示數據(數據庫記錄)。
  • Controller(控制器)處理輸入(寫入數據庫記錄)。

 

:模擬    按Button增加經驗,經驗改變后,玩家達到當前等級*100經驗后升級,升級后給玩家增加當前等級*10的金幣,每3級增加鑽石10;

 

1、創建一個頭像面板模擬MVC模式

 

 

2、創建一個SQL數據庫保存玩家數據

 

 

 

2、給Head添加4個腳本:

 

   Model(模型) : PlayerModel腳本代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 值改變的委托
/// </summary>
/// <param name="value"></param>
public delegate void OnValueChangeEventHandle(float value);

public class PlayerModel : MonoBehaviour
{


    private float playerExperience;
    private int playerLevel;
    private int playerCoin;
    private int playerDiamond;
    /// <summary>
    /// 經驗改變事件(貓進來了=經驗改變了),
    /// 觀察這只貓的動物身上的逃跑方法觸發(注冊了經驗改變這個事件的對象身上的方法觸發))
    /// UI更新顯示的方法觸發,數據庫更新的方法觸發
    /// </summary>
    public event OnValueChangeEventHandle OnExperienceChange;

    /// <summary>
    /// 玩家經驗
    /// </summary>
    public float PlayerExperience
    {
        set
        {
            playerExperience = value;
            //經驗被更新后(經驗被改變),觸發事件,調用所有綁定了該事件的方法
            OnExperienceChange(PlayerExperience);
        }
        get
        {
            return playerExperience;
        }
    }

    /// <summary>
    /// 玩家等級
    /// </summary>
    public int PlayerLevel
    {
        set
        {
            playerLevel = value;
            //經驗更新后觸發經驗改變事件
            OnExperienceChange(PlayerExperience);
        }
        get
        {
            return playerLevel;
        }
    }
    /// <summary>
    /// 玩家金幣
    /// </summary>
    public int PlayerCoin
    {
        set
        {
            playerCoin = value;
            //經驗更新后觸發事件
            OnExperienceChange(PlayerExperience);
        }
        get
        {
            return playerCoin;
        }
    }
    /// <summary>
    /// 玩家鑽石
    /// </summary>
    public int PlayerDiamond
    {
        set
        {
            playerDiamond = value;
            //觸發事件
            OnExperienceChange(PlayerExperience);
        }
        get
        {
            return playerDiamond;
        }
    }
}

 

        View(視圖):PlayerView

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerView : MonoBehaviour {

    public Text levelText;
    public Text experienceText;
    public Slider experienceSlider;
    public Text coinText;
    public Text diamondText;
    private PlayerModel model;
    public Button addExpBut;
    private void Awake()
    {
        model = GetComponent<PlayerModel>();
    }
    /// <summary>
    /// 顯示數據(注冊到事件里,當事件被觸發,方法被調用)
    /// </summary>
    /// <param name="ex"></param>
    public void ShowData(float ex)
    {
        levelText.text = model.PlayerLevel.ToString();
        experienceText.text = model.PlayerExperience.ToString() + "/"+(model.PlayerLevel*100).ToString();
        coinText.text = model.PlayerCoin.ToString();
        diamondText.text = model.PlayerDiamond.ToString();
        experienceSlider.value = model.PlayerExperience / (model.PlayerLevel * 100);
    }
}

 

 

 

       Controller(控制器):PlayerController代碼:

      

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

    private PlayerModel model;
    private PlayerDB db;
    private PlayerView view;
    private void Awake()
    {
        model = GetComponent<PlayerModel>();
        db = GetComponent<PlayerDB>();
        view = GetComponent<PlayerView>();
    }

    void Start()
    {
        //打開數據庫
        db.OpenDB("MVC");
        //UI里顯示數據的方法,綁定到經驗改變事件
        model.OnExperienceChange += view.ShowData;

        //數據庫的數據同步到模型
        db.Synchronization();
     
        //數據庫操作的方法,綁定到經驗改變事件
        model.OnExperienceChange += db.UpdatePlayerData;

        //增加經驗的方法,綁定到鼠標點擊事件
        view.addExpBut.onClick.AddListener(OnBtnClick);
    }
    private void OnDestroy()
    {
        db.CloseDB(); //關閉數據庫
    }

    void OnBtnClick()
    {
        AddExperience(50); //增加經驗
    }
    /// <summary>
    /// 增加經驗
    /// </summary>
    /// <param name="exp"></param>
    public void AddExperience(float exp)
    {
        //當前的經驗 = 已有經驗 + 增加的經驗
        float currentExp = model.PlayerExperience + exp;
        while (currentExp>model.PlayerLevel*100)
        {
            //獲取剩余經驗
            currentExp -= model.PlayerLevel * 100;
            //升級
            model.PlayerLevel++;
            //金幣增加
            model.PlayerCoin += model.PlayerLevel * 10;

            //每升3級鑽石增加10
            if (model.PlayerLevel%3==0)
            {
                model.PlayerDiamond += 10;
            }      
        }
        //剩余經驗賦值到模型
        model.PlayerExperience = currentExp;
    }
}

 

       數據庫操作:PlayerDB代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mono.Data.Sqlite;
public class PlayerDB : MonoBehaviour
{
private string dataPath;
private SqliteCommand command;
private SqliteConnection con;
private SqliteDataReader reader;
private PlayerModel playerModel;
private void Awake()
{
playerModel = GetComponent<PlayerModel>();
}
/// <summary>
/// 打開數據庫
/// </summary>
/// <param name="DBName"></param>
public void OpenDB(string DBName)
{
//拼湊路徑
dataPath = "Data Source==" + Application.streamingAssetsPath +
"/" + DBName + ".sqlite";
con = new SqliteConnection(dataPath);
command = con.CreateCommand();
con.Open();

}

/// <summary>
/// 關閉數據庫
/// </summary>
public void CloseDB()
{
reader.Close();
reader = null;
con.Clone();
}

/// <summary>
/// 更新玩家數據庫(已經注冊到經驗改變事件里,當經驗發生改變時,會調用這個方法)
/// </summary>
/// <param name="ex"></param>
public void UpdatePlayerData(float ex)
{
string query = "Update PlayerData Set playerLevlel='" +
playerModel.PlayerLevel + "',playerExperience='" +
playerModel.PlayerExperience + "',playerCoin='" +
playerModel.PlayerCoin + "',playerDiamond='" + playerModel.PlayerDiamond + "'";
command.CommandText = query;
command.ExecuteNonQuery();
}

/// <summary>
/// 將數據庫數據同步到模型
/// </summary>
public void Synchronization()
{

string query = "Select * From PlayerData";
command.CommandText = query;
reader = command.ExecuteReader();
reader.Read();
//同步到模型
playerModel.PlayerLevel = int.Parse(reader.GetValue(0).ToString());
playerModel.PlayerCoin = System.Convert.ToInt32(reader.GetValue(2).ToString());
playerModel.PlayerDiamond = int.Parse(reader.GetValue(3).ToString());
playerModel.PlayerExperience = float.Parse(reader.GetValue(1).ToString());
reader.Close();
}
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM