框架是很重要的知识,没有框架的项目就像在没有原画下在拼图,盲目低效容易混乱。
网上已经有很多关于MVC框架的文章,我也没必要从头到尾说一遍,从其他文章可以了解MVC框架。游戏是一个很复杂的设计,MVC并不能满足游戏的设计做到完全层次分明。我曾经在某个博客中看过一个框架MVCS,跟MVC很像,只是多了一个S,S代表的是数据,C从S中获得数据从而做到数据层和控制层的分离。
M: Model 数据模型 V: VIew 肉眼看到的显示
C:Controller 功能逻辑都在这 S: Stores 数据存储(本地的,网络的数据的读取)
他们之间的调用情况如图
具体例子:(里面用到的Mediator是中介者模式之后会讲)
Model
public class PlayerModel {
public int hp{get;set;}
public int mp { get; set; }
public int attack{get;set;}
}
View:
//UI层的Viewpublic class PlayerInfoPanel : MonoBehaviour { public Text mpText; void Start () { Mediator.RegisterEventHandler("PlyerInfoPanel_Update", this, UpdatePanel); } private void UpdatePanel(Message message) { if (message["mp"]!= null) { mpText.text = ((int)message["mp"]).ToString(); } } }
/场景层的Viewpublic class PlayerView { public void PlayAttackAnimation() {
} }
Store:
public class PlayerStores :MonoBehaviour{ public static PlayerStores Instance; private PlayerModel _modelData; private int levelNow; private int levelGetData; void Awake() { Instance = this; } public PlayerModel GetPlayerData() { //举个例子而已,尽量减少玩家和服务器的数据交流 if (levelGetData < levelNow) { //从网络或本地获取数据. _modelData = new PlayerModel(); //更新数据 return _modelData; } else { //返回缓存数据 return _modelData; } } }
Controller:
public class PlayerController :MonoBehaviour{ public PlayerView playerView; public PlayerModel playerData; public void Attack() { //一系列控制后 playerView.PlayAttackAnimation(); playerData.mp -= 10; Mediator.Send("PlyerInfoPanel_Update", "mp", playerData.mp.ToString()); //与另一模块交流 } public void LevelUp() { PlayerModel model = PlayerStores.Instance.GetPlayerData(); //下面和Attack操作一样 } }