@作者: 风不停息丶 学习笔记
MVC基本概念
-
MVC全名是Model View Controller
-
模型(model) - 视图(view) - 控制器(controller)的缩写
-
是一种软件设计规范,用一种业务逻辑、数据、界面显示分离的方法组织代码
-
将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
-
🐱💻注意:
-
1.在unity中它不是必备的内容
-
2.它主要用于开发游戏UI系统逻辑
-
在unity中应用于UI界面,可以将你的UI面板逻辑一分为三,数据、界面、业务逻辑
优点: 降低耦合性,方法修改,逻辑更清晰
缺点: 脚本多,体量大,流程复杂
案例:使用MVC搭建游戏UI界面
1、创建数据层Model,存储数据
- PlayerModel
public class PlayerModel {
//数据内容 设置只读
private string playerName;
public string PlayerName
{
get
{
return PlayerName;
}
}
private int lev;
public int Lev
{
get
{
return lev;
}
}
private int money;
public int Money
{
get
{
return money;
}
}
private int gem;
public int Gem
{
get
{
return gem;
}
}
private int power;
public int Power
{
get
{
return power;
}
}
private int hp;
public int Hp
{
get
{
return hp;
}
}
private int atk;
public int Atk
{
get
{
return atk;
}
}
private int def;
public int Def
{
get
{
return def;
}
}
private int crit;
public int Crit
{
get
{
return crit;
}
}
private int miss;
public int Miss
{
get
{
return miss;
}
}
private int luck;
public int Luck
{
get
{
return 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()
{
//PlayerPrefs.GetString 若查找到相应字符,则属性值返回相应数据,若查不到,则返回默认值
playerName = PlayerPrefs.GetString("playerName", "小明");
lev = PlayerPrefs.GetInt("lev", 1);
money = PlayerPrefs.GetInt("money", 1000);
gem = PlayerPrefs.GetInt("gem", 1000);
power = PlayerPrefs.GetInt("power", 99);
hp = PlayerPrefs.GetInt("hp", 100);
atk = PlayerPrefs.GetInt("atk", 20);
def = PlayerPrefs.GetInt("def", 10);
crit = PlayerPrefs.GetInt("crit", 10);
miss = PlayerPrefs.GetInt("miss", 10);
luck = PlayerPrefs.GetInt("luck", 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);
//每次保存数据 更新
UpdateInfo();
}
//传一个函数进来监听
public void AddEventListener(UnityAction<PlayerModel> function)
{
updateEvent += function;
}
public void RemoveEventListener(UnityAction<PlayerModel> function)
{
updateEvent -= function;
}
//通知外部更新数据的方法
private void UpdateInfo()
{
//找到对应的使用数据的脚本去更新数据
//只要事件不为空 调用
if (updateEvent != null)
{
updateEvent(this);
}
}
}
2、创建界面层View,显示UI
- MainView 主面板
public class MainView : MonoBehaviour {
//1.找控件
public Button btnRole;
public Button btnSill;
public Text textName;
public Text textLev;
public Text textMoney;
public Text textGem;
public Text textPower;
//2.提供面板更新的相关方法给外部
public void UpDateInfo(PlayerModel data)
{
textName.text = data.PlayerName;
textLev.text = "LV." + data.Lev;
textMoney.text = "金币:" + data.Money.ToString();
textGem.text = "钻石:" + data.Gem.ToString();
textPower.text = "体力:" + data.Power.ToString();
}
}
- RoleView 角色面板
public class RoleView : MonoBehaviour {
//1.找控件
public Text textLev;
public Text textHp;
public Text textAtk;
public Text textDef;
public Text textCrit;
public Text textMiss;
public Text textLuck;
public Button btnClose;
public Button btnLevUp;
//2.提供面板更新的相关方法给外部
public void UpdateInfo(PlayerModel data)
{
textLev.text = "LV." + data.Lev;
textHp.text = "血量:" + data.Hp.ToString();
textAtk.text = "攻击力:" + data.Atk.ToString();
textDef.text = "防御力:" + data.Def.ToString();
textCrit.text = "暴击率:" + data.Crit.ToString();
textMiss.text = "闪避率:" + data.Miss.ToString();
textLuck.text = "幸运值:" + data.Luck.ToString();
}
}
3、创建控制层Controller,处理业务逻辑
- 主页控制器MainController
public class MainController : MonoBehaviour {
//获取MainView
private MainView mainView;
//设置静态
private static MainController controller = null;
public static MainController Controller
{
get { return controller; }
}
private void Start()
{
//获取同样挂载在一个对象上的view脚本
mainView = GetComponent<MainView>();
//启动时默认界面更新一次
mainView.UpDateInfo(PlayerModel.Data);
//2.界面 事件监听 来处理对应的业务逻辑
mainView.btnRole.onClick.AddListener(clickRoleBtn);
//添加委托事件
//告知数据模块 当更新时 通知哪个函数做处理
PlayerModel.Data.AddEventListener(UpdateInfo);
}
//显示面板
public static void ShowMe()
{
if (controller == null)
{
//实例化面板
GameObject res = Resources.Load<GameObject>("Prefabs/MinPanel");
GameObject obj = Instantiate(res);
//设置父对象 为Canvas
obj.transform.SetParent(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 clickRoleBtn()
{
//显示面板
RoleController.ShowMe();
}
//3、更新界面
private void UpdateInfo(PlayerModel data)
{
if (mainView != null)
{
mainView.UpDateInfo(data);
}
}
private void Ondestroy()
{
PlayerModel.Data.RemoveEventListener(UpdateInfo);
}
}
- 角色面板RoleController
public class RoleController : MonoBehaviour {
//获取RoleView界面
private RoleView roleView;
//设置静态
private static RoleController controller = null;
public static RoleController Controller
{
get { return controller; }
}
void Start()
{
//获取控件
roleView = GetComponent<RoleView>();
//第一次更新面板
roleView.UpdateInfo(PlayerModel.Data);
//获取关闭按钮
roleView.btnClose.onClick.AddListener(() =>
{
HideMe();
});
//更新数据
roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);
//添加委托事件
//告知数据模块 当更新时 通知哪个函数做处理
PlayerModel.Data.AddEventListener(UpdateInfo);
}
//显隐面板
public static void ShowMe()
{
if (controller == null)
{
//实例化面板
GameObject res = Resources.Load<GameObject>("Prefabs/RolePanel");
GameObject obj = Instantiate(res);
//设置父对象 为Canvas
obj.transform.SetParent(GameObject.Find("Canvas").transform, false);
controller = obj.GetComponent<RoleController>();
}
//如果是隐藏的形式hide.在这要显示
controller.gameObject.SetActive(true);
}
//隐藏面板
public static void HideMe()
{
if (controller != null)
{
//方式二 设置隐藏
controller.gameObject.SetActive(false);
}
}
//升级方法
private void ClickLevUpBtn()
{
//通过数据模块
PlayerModel.Data.LevUp();
}
//界面更新
private void UpdateInfo(PlayerModel data)
{
if (roleView != null)
{
roleView.UpdateInfo(data);
}
}
private void Ondestroy()
{
PlayerModel.Data.RemoveEventListener(UpdateInfo);
}
}
最终效果
- 搭建场景,主页和角色面板
结尾总结
新手记录学习笔记,看到这篇文章的小伙伴们可以点个赞👍支持一下,谢谢!