u3d版俄罗斯方块制作

本文通过实例详细讲解使用Unity的MVC模式开发俄罗斯方块游戏的过程,包括模型、视图和控制器的搭建,菜单UI创建,有限状态机管理游戏状态,以及相机、音量控制和方块生成、下落、旋转、消除等功能实现,旨在阐述MVC模式在游戏开发中的应用,提升代码组织和管理效率。
摘要由CSDN通过智能技术生成

             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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值