原本不打算写这篇文章的,毕竟我自己只是个半吊子,对于设计模式也没有太深入的了解,就怕引导新手误入歧途。不过仔细一想这样说不定可以让后来人少踩一些坑,倒也还算可以。
-
什么是MVC设计模式?
MVC就是Model-View-Controller的简称,它主要的作用是将数据(Model)与表现(View)这两个模块分开,让逻辑(Controller)作为中间层进行一个承上启下的作用。而采用此设计模式写出来的代码逻辑会比较清晰,不至于隔一段时间自己都看不懂自己的代码了。 -
Model——模型层,更确切的说应该是数据层,在这一层面我们只需要定义各种数据。
-
View——视图层,也就是表现层,我们在游戏里所能看得到的各种UI等,就归属于这一层面管辖,同时他还是一个事件派发器,所有的事件应当由这里注册进Controller。
-
Controller——控制层,应该叫逻辑层,这里主要负责各种逻辑的实现。
-
说一下主要流程,View就是我们玩家所能看得到的,所以玩家所有的操作入口就在这里,当玩家进行操作之后,View会先通知Controller,然后由Controller去改变Model里的数据,而Model里的数据发生了改变就会自动触发事件并通知View改变UI上的显示。
-
话不多说,我们开始实际演示:
首先我们先搭建一个简易的UI,如下图所示:
-
很简单,就几个Button加一些Slider以及Text和Image,然后我们再根据我们搭的UI去写Model层定义数据(实际项目中这里是反过来的,要根据数据搭UI,当然UI搭成啥样也不归我们程序管,你们可别跟我一样,在小公司里面策划,美工,程序的活都包揽了,尽量还是要进成熟的公司):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerData_Model
{
//单例
private static PlayerData_Model instance;
public static PlayerData_Model GetModel()
{
if (instance == null)
{
instance = new PlayerData_Model();
}
return instance;
}
private PlayerData_Model() {
}
//玩家数据
//头像
private string playerHead;//头像数据
public delegate void ChangePlayerHead(string newHead);
public ChangePlayerHead changePlayerHead;//委托
public string PlayerHead//属性
{
get
{
return playerHead;
}
set
{
playerHead = value;
if (changePlayerHead != null)
{
changePlayerHead.Invoke(playerHead);
}
}
}
//名称
private string playerName;
public delegate void ChangePlayerName(string newName);
public ChangePlayerName changePlayerName;
public string PlayerName
{
get
{
return playerName;
}
set
{
playerName = value;
if (changePlayerName != null)
{
changePlayerName.Invoke(playerName);
}
}
}
//称号
private string playerTittle;
public delegate void ChangePlayerTittle(string newTittle);
public ChangePlayerTittle changePlayerTittle;
public string PlayerTittle
{
get
{
return playerTittle;
}
set
{
playerTittle = value;
if (changePlayerTittle != null)
{
changePlayerTittle.Invoke(playerTittle);
}
}
}
//等级
private int playerLevel;
public delegate void ChangePlayerLevel(int newLevel);
public ChangePlayerLevel changePlayerLevel;
public int PlayerLevel
{
get
{
return playerLevel;
}
set
{
playerLevel = value;
if (changePlayerLevel != null)
{
changePlayerLevel.Invoke(playerLevel);
}
}
}
//生命值
private int playerHP;
public delegate void ChangePlayerHP(int newHP);
public ChangePlayerHP changePlayerHP;
public int PlayerHP
{
get
{
return playerHP;
}
set
{
playerHP = value;
if (changePlayerHP != null)
{
changePlayerHP.Invoke(playerHP);<