本文最后更新于 672 天前,其中的信息可能已经有所发展或是发生改变。
缘由
这些天学习游戏制作,在知乎上看到了一篇关于游戏设计框架的回答,简述了游戏设计面向数据编程可以遵循的三个设计框架:MVC,MVP,MVVM。这篇文章就简单聊聊MVC设计思想的实现过程。
使用Unity开发游戏,有流行的框架嘛? – 放牛的星星的回答 – 知乎
https://www.zhihu.com/question/37475609/answer/1298931250
MVC模式简介
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型) – 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) – 视图代表模型包含的数据的可视化。
- Controller(控制器) – 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
图源和简介摘自菜鸟教程
MVC 模式 | 菜鸟教程 (runoob.com)
引申
之前学习JavaWeb项目了解到了SpringMVC框架的编程方式,所以MVC设计模式便更加清晰:
从视图发过来的请求会经控制器进行中转和逻辑处理,并更新模型层数据,将处理后的结果返回给视图。模型层还可以自行通知控制器更新视图层。
那么,游戏中的MVC模式应该是什么样的呢?
首先,我们将MVC三个部分具象化成易于理解的名词:
- Model:游戏数据
- View:游戏UI
- Controller:游戏逻辑
由此我们可以看出,游戏必不可少的部分是M和C两个部分,在MVC设计模式下,View的实现可以被分离,这对于网络游戏的实现方式是十分有利的,因为在非帧同步游戏中,我们可以通过类似Web请求的方式与服务器进行通信,将客户端与服务端分离,将游戏展现与游戏逻辑解耦,这样就大大降低了开发难度和维护成本。下面我们就来讨论一下具体的实现过程。
MVC实现
我们编写的游戏基于Unity3D引擎,因此我们就以C#作为实现语言:
Model层
抽象层
namespace ConsoleApp1.MVC
{
public interface IModel
{
}
}
实现层
using System.IO;
using ConsoleApp1.MVC;
namespace ConsoleApp1.Unit
{
public class UnitModel : IController
{
internal string _name;
internal int _hp;
internal int _damage;
public UnitModel(string name, int hp, int damage)
{
this._name = name;
_hp = hp;
_damage = damage;
}
}
}
View层
抽象层
namespace ConsoleApp1.MVC
{
public interface IView
{
}
}
实现层
using System;
using ConsoleApp1.MVC;
namespace ConsoleApp1.Unit
{
public class UnitView : IView
{
public void BroadCast_Attacked(string name, int hp)
{
Console.WriteLine("{0}被攻击了!受到{1}点伤害!", name, hp);
}
public void BroadCast_Attacking(string name)
{
Console.WriteLine("{0}发起了攻击。", name);
}
public void BroadCast_Born(string name)
{
Console.WriteLine("{0}出生了!", name);
}
public void BroadCast_Dead(string name)
{
Console.WriteLine("{0}死亡!", name);
}
}
}
Controller层
抽象层
namespace ConsoleApp1.MVC
{
public interface IController
{
}
}
实现层
using System.Text.Json;
using ConsoleApp1.MVC;
namespace ConsoleApp1.Unit
{
public class UnitController : IController
{
//Model层
private UnitModel _model;
//View层
private UnitView _view;
//成员初始化
public UnitController(UnitModel model, UnitView view)
{
_model = model;
_view = view;
_view.BroadCast_Born(_model._name);
}
//攻击逻辑
public void Attack(UnitController target)
{
_view.BroadCast_Attacking(_model._name);
_view.BroadCast_Attacked(target._model._name, _model._damage);
if (_model._damage >= target._model._hp)
{
target._view.BroadCast_Dead(target._model._name);
return;
}
target.CostHP(_model._damage);
}
//扣血
public void CostHP(int hp)
{
_model._hp -= hp;
}
}
}
游戏过程层
using System;
using ConsoleApp1.Unit;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//单位1初始化
UnitView unitView1 = new UnitView();
UnitModel unitModel1 = new UnitModel("骑士", 3, 2);
UnitController unitController1 = new UnitController(unitModel1, unitView1);
//单位2初始化
UnitView unitView2 = new UnitView();
UnitModel unitModel2 = new UnitModel("弓箭手", 3, 1);
UnitController unitController2 = new UnitController(unitModel2, unitView2);
//游戏过程
unitController1.Attack(unitController2);
unitController2.Attack(unitController1);
unitController1.Attack(unitController2);
}
}
}
由此,我们就可以编写出一个视图与逻辑分离的小游戏啦~
以上是个人学习笔记,若有错误敬请留言指正~