【唐老狮】Unity中的MVC思想—2—MVC的基本概念
【唐老狮】Unity中的MVC思想—5—使用MVC制作UI逻辑
MVC基本概念 MVC是一种编程思想 软件和网页都是由数据、UI构成的
MVC全名是Model View Controller,是一种软件设计规范
MVC在游戏中的应用 MVC主要用于UI系统的开发上
好处:降低耦合、方面修改、逻辑清晰
缺点:脚本变多、体量变大、流程复杂
使用MVC思想制作UI逻辑 Model数据脚本 PlayerModel.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 using System;using System.Runtime.ConstrainedExecution;using UnityEngine;using UnityEngine.Events;namespace learn { public class PlayerModel { private string _playerName; private int _lev, _money, _gem, _power, _hp, _atk, _def, _crit, _miss, _luck; public string PlayerName => _playerName; public int Lev => _lev; public int Money => _money; public int Gem => _gem; public int Power => _power; public int Hp => _hp; public int Atk => _atk; public int Def => _def; public int Crit => _crit; public int Miss => _miss; public int Luck => _luck; private event UnityAction<PlayerModel> updateEvent; private static PlayerModel data = null ; public static PlayerModel Data { get { if (data==null ) { data = new PlayerModel(); data.Init(); } return data; } } public void Init () { _playerName = PlayerPrefs.GetString("PlayerName" , "紫地丁" ); _lev = PlayerPrefs.GetInt("PlayerLev" , 1 ); _money = PlayerPrefs.GetInt("PlayerMoney" , 9999 ); _gem = PlayerPrefs.GetInt("PlayerGem" , 8888 ); _power = PlayerPrefs.GetInt("PlayerPower" , 99 ); _hp = PlayerPrefs.GetInt("PlayerHp" , 100 ); _atk = PlayerPrefs.GetInt("PlayerAtk" , 20 ); _def = PlayerPrefs.GetInt("PlayerDef" , 10 ); _crit = PlayerPrefs.GetInt("PlayerCrit" , 20 ); _miss = PlayerPrefs.GetInt("PlayerMiss" , 10 ); _luck = PlayerPrefs.GetInt("PlayerLuck" , 40 ); } public void LevUp () { _lev += 1 ; _hp += _lev; _atk += _lev; _def += _lev; _crit += _lev; _miss += _lev; _luck += _lev; SaveData(); } public void SaveData () { PlayerPrefs.SetString("PlayerName" ,_playerName); PlayerPrefs.SetInt("PlayerLev" ,_lev); PlayerPrefs.SetInt("PlayerMoney" ,_money); PlayerPrefs.SetInt("PlayerGem" ,_gem); PlayerPrefs.SetInt("PlayerPower" ,_power); PlayerPrefs.SetInt("PlayerHp" ,_hp); PlayerPrefs.SetInt("PlayerAtk" ,_atk); PlayerPrefs.SetInt("PlayerDef" ,_def); PlayerPrefs.SetInt("PlayerCrit" ,_crit); PlayerPrefs.SetInt("PlayerMiss" ,_miss); PlayerPrefs.SetInt("PlayerLuck" ,_luck); } public void AddEventListener (UnityAction<PlayerModel> funAction ) { updateEvent += funAction; } public void RemoveEventListener (UnityAction<PlayerModel> function ) { updateEvent -= function; } private void UpdateInfo () { if (updateEvent!= null ) { updateEvent(this ); } } } }
View界面脚本 MainView.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 using UnityEngine;using UnityEngine.UI;namespace learn { public class MainView : MonoBehaviour { public Button btnRole; public Text txtName; public Text txtLev; public Text txtMoney; public Text txtGem; public Text txtPower; public void UpdateInfo (PlayerModel data ) { txtName.text = data.PlayerName; txtLev.text = "LN." + data.Lev; txtMoney.text = data.Money.ToString(); txtGem.text = data.Gem.ToString(); txtPower.text = data.Power.ToString(); } } }
RoleView.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 using UnityEngine;using UnityEngine.UI;namespace learn { public class RoleView : MonoBehaviour { public Button btnClose; public Button btnLevUp; public Text txtLev; public Text txtHp; public Text txtAtk; public Text txtDef; public Text txtCrit; public Text txtMiss; public Text txtLuck; public void UpdateInfo (PlayerModel data ) { txtLev.text = "LV." + data.Lev; txtHp.text = data.Hp.ToString(); txtAtk.text = data.Atk.ToString(); txtDef.text = data.Def.ToString(); txtCrit.text = data.Crit.ToString(); txtMiss.text = data.Miss.ToString(); txtLuck.text = data.Luck.ToString(); } } }
Controller业务逻辑脚本 MainController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 using System;using UnityEngine;namespace learn { public class MainController : MonoBehaviour { private MainView _mainView; private static MainController controller = null ; public static MainController Controller => controller; public static void ShowMe () { if (controller==null ) { GameObject res = Resources.Load<GameObject>("UI/MainPanel" ); GameObject obj = Instantiate(res, GameObject.Find("Canvas" ).transform, false ); controller = obj.GetComponent<MainController>(); } controller.gameObject.SetActive(true ); } public static void HideMe () { if (controller!=null ) { controller.gameObject.SetActive(false ); } } private void Start () { _mainView = GetComponent<MainView>(); _mainView.UpdateInfo(PlayerModel.Data); _mainView.btnRole.onClick.AddListener(ClickRoleBtn); PlayerModel.Data.AddEventListener(UpdateInfo); } private void ClickRoleBtn () { RoleController.ShowMe(); } private void UpdateInfo (PlayerModel data ) { if (_mainView!=null ) { _mainView.UpdateInfo(data); } } private void OnDestroy () { PlayerModel.Data.RemoveEventListener(UpdateInfo); } } }
RoleController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 using System;using UnityEngine;namespace learn { public class RoleController : MonoBehaviour { private RoleView roleView; private static RoleController controller = null ; public static RoleController Controller => controller; public static void ShowMe () { if (controller==null ) { GameObject res = Resources.Load<GameObject>("UI/RolePanel" ); GameObject obj = Instantiate(res, GameObject.Find("Canvas" ).transform, false ); controller = obj.GetComponent<RoleController>(); } controller.gameObject.SetActive(true ); } public static void HideMe () { if (controller!=null ) { controller.gameObject.SetActive(false ); } } private void Start () { roleView = GetComponent<RoleView>(); roleView.UpdateInfo(PlayerModel.Data); roleView.btnClose.onClick.AddListener(ClickCloseBtn); roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn); PlayerModel.Data.AddEventListener(UpdateInfo); } private void UpdateInfo (PlayerModel data ) { if (roleView!=null ) { roleView.UpdateInfo(data); } } private void ClickLevUpBtn () { PlayerModel.Data.LevUp(); } private void ClickCloseBtn () { HideMe(); } private void OnDestroy () { PlayerModel.Data.RemoveEventListener(UpdateInfo); } } }