1、解析MVC框架
//视图类
//1、每个从ViewBase继承的类都必须提供一个名字
//2、每个从ViewBase继承的类都必须注册自己关心的事件
//3、每个从ViewBase继承的类都需要处理自己关心的事件
public abstract class ViewBase : MonoBehaviour//视图类才会继承MonoBehavior
{
public IList<string> interestedEvents;//事件列表
public abstract string Name { get; }//名字
public abstract IList<string> GetInterestedEvents();//用字符串代替事件
public abstract void HandleEvents(string eventName, object eventParam);//处理程序
}
public class PlayerModel : ModelBase
{
public override string Name
{
get { return "PlayerModel"; }
}
public int Exp { get; set; }
internal void AddExp(int delta)
{
Exp += delta;
MVC.instance.SendEvent("ExpChanged",Exp);
}
}
public class GameManager : MonoBehaviour
{
void Start()
{
MVC.instance.RegisterView(GameObject.Find("MainPanel").GetComponent<MainPanelView>());//注册视图层
MVC.instance.RegisterController("AttackEvent", typeof(AttackController));//注册控制层
MVC.instance.RegisterModel(new PlayerModel());//注册模型层
}
}
public class MainPanelView : ViewBase
{
public Text EXPText;
public Button AttackButton;
public void OnAttackButtonClicked()
{
//通过界面上玩家点击的目标获取目标角色的id
//获取界面上用户点击哪个攻击按钮,进而获取按钮对应的攻击技能id
int targetId = 12345;
int skilled = 6789;
MVC.instance.SendEvent("AttackEvent",new object[] {targetId,skilled });
}
void Start()
{
AttackButton.onClick.AddListener(OnAttackButtonClicked);//AddListener增加监听器=使用OnAttackButtonClicked来执行这个Button
}
public override string Name
{
get { return "MainPanelView"; }
}
public override IList<string> GetInterestedEvents()
{
return new string[] {
"ExpChanged"
};
}
public override void HandleEvents(string eventName, object eventParam)
{
switch (eventName)
{
case "ExpChanged":
{
EXPText.text = eventParam.ToString();
}
break;
}
}
}
public class AttackController : ControllerBase
{
public override void Execute(object param)
{
ModelBase mb= MVC.instance.models["PlayerModel"];
PlayerModel pm = mb as PlayerModel;
//TODO:取得敌人的模型,计算玩家对敌人造成的伤害作为增加经验值的系数
pm.AddExp(50);
}
}
/// <summary>
/// 此类作为MVC框架对外的接口,此类作为一个单例类,主要负责:注册和存储MVC实例、获取MVC实例、发送事件
/// </summary>
public class MVC //外部类
{
public static MVC instance = new MVC();
private MVC() { }
//用字典存储MVC
public Dictionary<string, ViewBase> views = new Dictionary<string, ViewBase>();
public Dictionary<string, ModelBase> models = new Dictionary<string, ModelBase>();
public Dictionary<string, Type> ctrls = new Dictionary<string, Type>();//命令没有实体
/// <summary>
/// 注册模型
/// bm=new BagModel();
/// MVC.instance.RegisterModel(bm);
/// </summary>
/// <param name="model"></param>
public void RegisterModel(ModelBase model)
{
if (models.ContainsKey(model.Name) == true)//ContainsKey-判断在字典中某一个键是否已经存在了
{
return;
}
models[model.Name] = model;
}
/// <summary>
/// 注册控制器
/// MVC.instance.RegisterController(typeof(AttackController))
/// ctrl=Activator.Create(typeof(AttackController))
/// ctrl.Execute(...);
/// </summary>
/// <param name="ctrlType"></param>
public void RegisterController(string name, Type ctrlType)
{
if (ctrls.ContainsKey(name) == true)
{
return;
}
ctrls[name] = ctrlType;
}
//注册视图
public void RegisterView(ViewBase view)
{
if (views.ContainsKey(view.Name) == true)
{
return;
}
views[view.Name] = view;
//view.interestedEvents = new List<string>(view.GetInterestedEvents());
view.interestedEvents = view.GetInterestedEvents();//IList
}
//发送事件(控制器先响应,视图再响应)
//事件对应的处理者有两种:控制器(View=>controller);View(Model=>View)
public void SendEvent(string eventName, object eventParam)
{
if (ctrls.ContainsKey(eventName))
{
Type ctrlType = ctrls[eventName];
var cb = Activator.CreateInstance(ctrlType) as ControllerBase;
cb.Execute(eventName);
return;
}
foreach (var view in views)
{
if (view.Value.interestedEvents.Contains(eventName))
{
view.Value.HandleEvents(eventName, eventParam);
}
}
}
}
/// <summary>
/// 执行命令(一段功能代码)
/// </summary>
public abstract class ControllerBase
{
public abstract void Execute(object param);//Execute-执行
}
/// <summary>
/// 数据模型,每个模型都必须有一个名称
/// </summary>
public abstract class ModelBase
{
public abstract string Name { get; }
}
毕设思路
1、游戏按照MVC模式分成三个部分
Model——存储数据
View——控制视图
Controller——控制整个游戏