UNITY 开发日记/教程 俄罗斯方块 (三) 搭建场景UI

来源:互联网 发布:做seo工资一般多少 编辑:程序博客网 时间:2024/05/21 22:22

接上文.

我们已经可以生成随机的方块了,下面我们重新来看一下最初我们考虑的游戏流程:

系统随机产生方块 →  方块下落 同时玩家操作移动/旋转 → 方块落地,若某行被填满则消除,若超出上限则GAMEOVER

此处,系统随机产生方块部分已经完成,下面我们需要开始做方块下落,以及玩家操作的部分.但是在实现方块下落之前,我们应该意识到

首先需要一个让"方块下落"的"场景",或者说Game World,进行游戏的空间位置场景,无论你怎么称呼都可以.


原来的BlockBuild直接用于生成"下一个"玩家操控\下落的方块,我们的第一个方块也要由其产生,所以不用调整具体参数,只要给他一个背景PANEL,加一个说明文字text就可以了.

然后再建立一个空物体,给他一个背景,一个用于开始测试的按钮,结构如上图所示.

然后写控制游戏流程的代码,点击按钮时,开始游戏,令BlockBuilder产生一个随机方块,并将随机方块置于GameArea的指定初始位置.然后再生成一个随机方块于BlockBuild中显示,

在当前方块落地后,使用该方块继续游戏.

using System.Collections;using System.Collections.Generic;using UnityEngine;public class dmGameArea : MonoBehaviour {    public dmBlockBuilder blockBuilder;    public Vector2 areaSize;    public Vector2 initPos;    RectTransform myRectTransform { get { return GetComponent<RectTransform>(); } }    dmBlock nowControlBlock;// Use this for initializationvoid Start () {        myRectTransform.sizeDelta = new Vector2(areaSize.x * blockBuilder.squareSize.x, areaSize.y * blockBuilder.squareSize.y);    }// Update is called once per framevoid Update () {}    public void StartGame()    {        if (nowControlBlock != null)        {            blockBuilder.DestroySquares(nowControlBlock);        }        blockBuilder.BuildRandomBlock();        NextBlock();    }    public void NextBlock()    {        PutInBlock(blockBuilder.nowBlock);        blockBuilder.BuildRandomBlock();    }    public void PutInBlock(dmBlock block)    {        nowControlBlock = block;        blockBuilder.nowBlock = null;        foreach(GameObject square in block.squareList)        {            square.transform.SetParent(transform);        }        MoveBlockTo(block,initPos);    }    public void MoveBlockTo(dmBlock onMoveBlock,Vector2 targetPos)    {        for(int i = 0; i < onMoveBlock.bindBase.squareCoordList.Count; i++)        {            Vector2 squareCoord = targetPos + onMoveBlock.bindBase.squareCoordList[i];            onMoveBlock.squareList[i].transform.localPosition = AreaPos2Local(squareCoord);            onMoveBlock.squareList[i].SetActive(squareCoord.y >= 0);        }    }    public Vector2 AreaPos2Local(Vector2 areaPos)    {        return new Vector2((areaPos.x + 0.5f) * blockBuilder.squareSize.x, - (0.5f + areaPos.y) * blockBuilder.squareSize.y);    }}

在GameArea 中,我建立了一个x向右为正,y向下为正,一个正方形为单位的坐标系,因为此坐标系与Unity中的Scene坐标系不同,所以编写了AreaPos2Local函数来进行转换.

配置参数如下


绑定按钮和GameArea



Play运行调试,点击按钮,可以看到功能已经成功实现.

目录

(一) 定义方块

(二) 搭建方块UI和生成方块.

(三) 搭建场地UI和游戏流程控制

(四) 方块下落和落地判定

(五) 方块平移和旋转

(六) 方块消除


阅读全文
0 0
原创粉丝点击