Unity3D入门 俄罗斯方块总结(一)

主要参考:http://blog.csdn.net/kobbbb/article/details/8900974

绘制了俄罗斯方块,进行unity的入门学习。

结果如下:

基本功能实现了。

总结如下:

1.Unity和DX类似,默认左手坐标系。旋转和绘制时候为顺时针方向。

2.注意Manger、myCube、block1,block2....之间的关系

其中myCube为绘制的基本单元,block1等形状也是由myCube来组合绘制的。如图2-2中,block1属性中只是进行了逻辑上绘制的设计,并没有真正的render,在cs脚本里,最后还是有myCube进行Instance操作,进行字符串中‘1’的判断,组合绘制的Block1.....

而Manger作为一个空的GameObject,对整体进行控制,其中组合了七种形态,并加载了myCube,来进行真正的绘制。

            

图2-1                                                            图2-2

3.区分静止的block绘制和动态下降的block绘制

    IEnumerator Fall(){
        while(true)
        {
            mYPosition--;//block下落,
            if (true == Manager.manager.CheckBlock(blockMatrix, mXPosition, mYPosition))//如果碰壁,下落停止
            {
                Manager.manager.SetBlock(blockMatrix, mXPosition, mYPosition + 1);//绘制静态的block,并在SetBlock内初始化一个新的block
                Destroy(gameObject);//删除此次动态的block,
                break;//这个block消亡了,进行新的block下落
            }
            for(float i=mYPosition+1;i>mYPosition;i-=Time.deltaTime*mFallSpeed)//平稳的下落一个单位,以时间为控制,而不受帧率的控制
            {
                transform.position = new Vector3(transform.position.x, i - childSize, transform.position.z);
                yield return null;//等待下一帧进行下落...
            }
        }
    } 

4.场景坐标系以及每个动态Block的初始化坐标

本例有本地坐标系和世界坐标系之分。

图4-1

如上图4-1,Block作为一个GameObject,需要确定一个Transform,并且为所有子集的中心。进行初始化:

        blockSize = block.Length;//此次长度为3
        childSize = (blockSize - 1) * 0.5f;
        blockMatrix = new bool[blockSize,blockSize];//建立对应元素的bool数组,来进行是否绘制myBlock的判断
        for (int y = 0; y < blockSize;y++ )
        {
            for (int x = 0; x < blockSize;x++ )
            {
                if (block[y][x]==‘1‘)//如果element中字符为‘1‘,则clone一个myCube,实质性的绘制
                {
                    blockMatrix[y,x] = true;                    //每个cube相对与父结点的位置,即在本地坐标系下进行cube的绘制
                    var cube = (Transform)Instantiate(Manager.manager.oneCube, new Vector3(x - childSize, childSize - y, 0), Quaternion.identity);
                    cube.parent = transform;//绑定到父结点上去
                }
            }
        }
        mYPosition = Manager.manager.GetFieldHeight() - 1;        //初始化block的位置,和左上角的位置mYPosition mXPosition;
        transform.position = new Vector3(Manager.manager.GetFieldWidth() / 2 + (blockSize % 2 == 0 ? 0.5f : 0), mYPosition - childSize, 0);
        mXPosition = (int)(transform.position.x - childSize);//如下图,代表了在整个场景中,一个动态的Block在下落时的坐标

图4-2

    public void SetBlock(bool[,] blockMatrix, int posX, int posY)//在静止区域绘制相应的block
    {
        int size = blockMatrix.GetLength(0);
    //  判断下降时,静止,那么则进行静止绘制:        for (int y = 0; y < size;y++ )//
        {
            for (int x = 0; x < size;x++ )
            {
                if (true==blockMatrix[y,x])
                {
                    Instantiate(oneCube, new Vector3(posX+x, posY-y, 0), Quaternion.identity);//绘制此次静止的block
                    fieldsJudge[posX + x, posY - y] = true;
                }
            }
        }
        //此block静止之后: 1.检测行是否满足消去? 2.生成新的动态block...
        StartCoroutine(CheckRows(posY-size,size));
    }
 Instantiate(oneCube, new Vector3(posX+x, posY-y, 0), Quaternion.identity);其中:
Vector3(posX+x, posY-y, 0)可有4-2可知,每个Cube的绘制都需要对应自己的坐标,这次坐标为世界坐标系下的。

5.俄罗斯方块的整体流程

1.在Manger.cs里随机初始化一个block,CreateBlock(int random)

2.对这个block,根据string的‘1‘,进行myBlock实例化,并设定这个block的transform,

3.下降...判断是否静止?...是的,则绘制静态的block,并Create新的动态block,删除先前的动态block

4.重复以上过程...

其中不好理解的是:代码中本地坐标系和子结点的关系、每个block的位置信息

下一章记录本次使用的Unity语法。

时间: 2024-10-31 23:20:06

Unity3D入门 俄罗斯方块总结(一)的相关文章

Unity3D入门 俄罗斯方块总结(二)

俄罗斯实现中使用Unity语法总结... 1.Instantiate Instantiate中克隆一个Object以及他的子结点,也可包括位置信息. a.CreateBlock()函数内,随机选取七种block的gameObject里一种,进行动态block实例化: Instantiate(blocks[random]);//此次clone的是gameObject, b.SetBlock()内进行,检测block是否可以静止后,如果是,则Block的静态绘制, Instantiate(cube,

[Unity3D入门]入门级游戏项目&quot;坦克狙击手&quot;更新

[Unity3D入门]入门级游戏项目"坦克狙击手"更新 在上一篇中我分享了一个尚未完全写好的入门级unity3d项目"坦克狙击手". 本文介绍最新版的"坦克狙击手"相关情况. 需要源代码和发布的Windows版.网页版程序的同学麻烦点个赞留下你的邮箱~ 关于调节粒子系统参数的经验 如你所见,我对导弹尾焰的粒子效果进行了调节.这里学到的一个经验是,分析然后模仿现实生活中的物理化学现象,才能做出逼真的效果.一个粒子就是火焰中的一个点.我们都知道蜡烛的

[Unity3D入门]分享一个自制的入门级游戏项目&quot;坦克狙击手&quot;

[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://www.4399.com/flash/127672_3.htm),虽然抄袭了人家的创意,不过我只用来练习(目前还很不成熟,离人家的境界相差很大),坦克.导弹.建筑模型来自网络,应该不会有版权问题吧. 由于模型和代码总共10M以上了,需要源代码和发布的Windows版.网页版程序的同学麻烦点个赞并留下你的邮箱~ 到

Unity3D入门(二):碰撞检測

碰撞器由来 1.系统默认会给每一个对象(GameObject)加入?一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种,一种是利用碰撞器,还有一种则是利用触发器.这两种方式的应用很广泛.为了完整的了解这两种方式,我们必须理解下面概念: (一)碰撞器是一群组件,它包括了非常多种类,比方:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上.(

Unity3D 入门 游戏开发 Unity3D portal game development

Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 视频学习链接:Video learning link: [教学视频]深入浅出Unity3D--第一篇-何韬-CSDN学院-在线学习教程 u3d 4.6 c#  性能上 比 java脚本 好一些 C # is better than a Java

Unity3D入门其实很简单

在上次发布拙作后,有不少童鞋询问本人如何学习Unity3D.本人自知作为一名刚入门的菜鸟,实在没有资格谈论这么高大上的话题,生怕误导了各位.不过思来想去,决定还是写一些自己的经验,如果能给想要入门U3D的您一些启发,便再好不过了. 如何入门 谈起自己是如何入门U3D,这还得从一年半前说起.那是在一个月黑风高的夜晚...(此处省略一万字).就这样,我对这款游戏引擎产生了浓厚的兴趣,走上了自学的道路. 相比网络上零散的教程,个人更倾向于更为系统的书籍.一番搜索后,我发现了这本<Unity 3.x游戏

Unity3D入门(一):环境搭建

1.Unity3D 目前最新正式版本是4.2.1f  官网下载,以前的版本安装时候需要序列号激活,新版本4.2.1f 不需要,完全免费,但发布的时候需要许可证 2.要学习的同学,下载频道可以找到破解补丁,使用这个版本的破解补丁,导出不出win phone 8的.具体解决办法还没找到 3.使用破解补丁安装的时候要断网  补丁下载 4.Unity3D 可以使用C# 和JavaScript,接触之后才知道,其实没有那么纯正,建议熟悉C#的同学,如果有时间还是多用JavaScript来写,因为官方提供的

【开发记录】微信小游戏开发入门——俄罗斯方块

叨叨 我在前一阵子,打算做一个微信小游戏,当然是单机的,只是为了了解小游戏开发的过程,最终选择了俄罗斯方块这一经典小游戏作为demo,源代码已托管值github,当然,这个游戏demo对用不并不友好,但是已经可以让我入门小程序开发了XD. demo地址:https://github.com/nbclw/Laya_Brick 准备 在任何开发前都需要对要开发的东西有一定的了解.准备: 小游戏原理:微信小游戏是属于H5游戏的一种吧,我是这样理解的:在H5中,有一个叫Canvas(画布)的存在,与电脑

Unity3d入门 - 关于unity工具的熟悉

上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功能. .3 根据书中的提示 做了一个 简易的机器人游戏(只实现了行走) 关于如何在mac(windows)下安装unity3d工具: http://jingyan.baidu.com/article/1e5468f9055a6b484961b737.html 关于unity工具界面分布及功能: 场景