Mvc开发俄罗斯方块
1. 前言
这个嘛,主要是跟着学习一下mvc的框架,业余跟着做一下,以求更规范的开发游戏,希望各位在看完本博客后也能有所收获
2..初步搭建我们的mvc框架
首先,我们将我们的脚本进行分层
1. model层,存放有关于我们模型的数据处理
2. view层,控制我们想要显示的视图
3. ctrl层,作为model层和view层的中介
我们采用这样的框架来进行我们俄罗斯方块的开发,分层的结构能帮助我们更好地管理我们的数据和信息,model层和view层会实现完全的分离,那么首先让我来展示一下我们的ctrl层对于其他两层的引用
[HideInInspector]
public Modelmodel;
[HideInInspector]
public Viewview;
// Use this for initialization
private void Awake()
{
//我们在controller层完成对于model层和视图层的引用
model = GameObject.FindGameObjectWithTag("Model").GetComponent<Model>();
view = GameObject.FindGameObjectWithTag("View").GetComponent<View>();
}
4. 创建我们的菜单ui
嗯,就照着这个样子拼就可以了
5. emmm,因为都是一些可视化界面的,界面制作步骤我就不介绍了,注意就是给各个界面的rayCast需要取消
接下来,我们制作一下俄罗斯方块的各个形状
这里我也是直接拼好的,讲一下注意要素1.所有小方块都添加tag:Block,方便进行管理2.所有小方块都是1x1的类型,便于二维数组存储3.每个类型都要设置好对应的旋转中心点
6引入有限状态机来管理游戏状态
这里关于有限状态机各位自行去研究,这里的话我使用有限状态机管理游戏状态,首先我们创建四种状态去继承有限状态机,然后回到我们的ctrl层来将状态添加到状态机里并且设置初始状态
private void AddSFsm()
{
fsm = newFSMSystem();
FSMState[] states = GetComponentsInChildren<FSMState>();
foreach(FSMStatestate in states)
{
//遍历子物体的状态并且添加到状态机中
fsm.AddState(state);
}
MenuState menuState = GetComponentInChildren<MenuState>();
//设置默认状态为菜单状态
fsm.SetCurrentState(menuState);
}
6. 设置各个状态的id,并且在添加状态的时候设置我们的fsmSystem
这里的话也就是在setState的时候把我们的System也设置过去,办法是提供一个set方法即可
protectedFSMSystem fsm;
publicFSMSystem FSM { set { fsm =value; } }
然后我们给每个状态添加上它们的状态id即可,例如
private void Awake()
{
stateID = StateID.Pause;
}
7. 显示菜单栏完成状态的切换
这里的话我们的菜单切换放在ctrl层来执行,而视图的变化是在view层,这里我们要做的就是在我们用有限状态机将各个菜单状态获得到的同时,持有ctrl层,并且通过ctrl层完成动画的播放
(1) 我们在view层创建播放的动画
public void ShowMenu()
{
logoTransform.gameObject.SetActive(true);
logoTransform.DOAnchorPosY(-78.5f, 0.5f);
menuTransform.gameObject.SetActive(true);
menuTransform.DOAnchorPosY(-2f, 0.5f);
}
(2) 修改有限状态机完成对于ctrl层的持有
public void AddState(FSMStates,Ctrl ctrl)
{
// Check for Null reference beforedeleting
if (s == null)
{
Debug.LogError("FSM ERROR: Null reference is not allowed");
}
s.FSM = this;
s.CTRL = ctrl;
3.在ctrl层添加持有
private void AddSFsm()
{
fsm = newFSMSystem();
FSMState[] states = GetComponentsInChildren<FSMState>();
foreach(FSMStatestate in states)
{
//遍历子物体的状态并且添加到状态机中
fsm.AddState(state,this);
}
MenuState menuState = GetComponentInChildren<MenuState>();
//设置默认状态为菜单状态
fsm.SetCurrentState(menuState);
}
4我们通过menuState来管理我们菜单切换的状态
class MenuState:FSMState
{
private void Awake()
{
stateID = StateID.Menu;
}
public override void DoBeforeEntering()
{
ctrl.view.ShowMenu();
}
}
8. 控制相机的变化
这里也是和上面一样,用doTween控制相机size,用ctrl获得相机,再在menu层调用相机变换
public class CameraManager:MonoBehaviour
{
private Cameracamera1;
private void Awake()
{
camera1 = Camera.main;
}
public