-
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();
}
}

