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

接上文.

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

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

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

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

UNITY 开发日记/教程 俄罗斯方块 (三) 搭建场景UI_第1张图片

原来的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(); } }
    dmBlock nowControlBlock;
	// Use this for initialization
	void Start () {
        myRectTransform.sizeDelta = new Vector2(areaSize.x * blockBuilder.squareSize.x, areaSize.y * blockBuilder.squareSize.y);

    }	
	// Update is called once per frame
	void 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函数来进行转换.

配置参数如下

UNITY 开发日记/教程 俄罗斯方块 (三) 搭建场景UI_第2张图片

绑定按钮和GameArea



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

目录

(一) 定义方块

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

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

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

(五) 方块平移和旋转

(六) 方块消除


你可能感兴趣的:(Unity,开发笔记)