Unity实现俄罗斯方块(二)

本文实例为大家分享了Unity实现俄罗斯方块第2部分,供大家参考,具体内容如下

代码部分

1. 实现物体自由降落(在有关于物体的脚本中编写)

1)、使用循环调用方法实现

public float speed = 0.3f;//物体下落
 // Start is called before the first frame update
 void Start()
 {
 InvokeRepeating("Move", 0, speed);
 }
 void Move()
 {
 transform.position += new Vector3(0, -1, 0);
 }

2)、使用时间差进行自由降落(在这里使用的该方法)

float lastFail=0;
else if (Input.GetKeyDown(KeyCode.DownArrow)||Time.time-lastFail>=1)
{
 transform.position += new Vector3(0, -1, 0);
 lastFail = Time.time;
}

2. 处理碰边界问题

逻辑部分:

1)、得到游戏区域的宽度和高度,分析宽度和高度能放多少个格子,用一个二维数组来保存信息。如果占据了这个格子将其设置为非空。
2)、编写格子的脚本,处理格子的逻辑。

代码部分:

//设置变量
public static int width = 10;//游戏窗口的宽度
public static int height = 20;//游戏窗口的高度
public static Transform[,] grid=new Transform[width,height];
//*注:变量应设置成static 否则无法引用

3. 处理物体是否还能下降问题(物体脚本)

逻辑部分:

1)、在一个格子刚产生的时候,就要判断是否能继续下落,如果还可以继续下落,说明游戏仍可进行,如果不能继续下落,说明游戏结束。

2)、所以判断能都继续下落的重要条件依据就是下方的格子是否被占据。也可以先移动位置,判断移动后的位置是否有效,如果有效,物体进行移动,否则不移动。

3)、编写是否组成物体的格子是否在边界内,防止超出边界(游戏区域格子脚本),每一个格子的x要大于左边界且小于右边界,y要大于下边界。

4)、当其在uodate不能下落时,应该产生一个新的物体,并且将当前的物体的脚本进行关闭,避免脚本还发生作用。
代码部分:

格子脚本:

public static Vector2 roundVec2(Vector2 v)
  {
    return new Vector2(Mathf.Round(v.x), Mathf.Round(v.y));
  }
  public static bool insideBorder(Vector2 pos) {
    //注宽是小于否则会出边界
    if ((int)pos.x >= 0 && (int)pos.x <width && (int)pos.y >= 0)
      return true;
    else
      return false;
  }

物体脚本:

void Start()
  {
    if (!isValidGridPos())//刚产生就无效
    {
      Debug.Log("GAME OVER");
    }
  }
  float lastFail=0;
  // Update is called once per frame
  void Update()
  {
    //控制物体向左移
    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
      transform.position += new Vector3(-1, 0, 0);
      if (isValidGridPos())
      {
      }
      else {
        transform.position += new Vector3(1, 0, 0);
      }
    }
    //控制物体右移
    else if (Input.GetKeyDown(KeyCode.RightArrow))
    {
      transform.position += new Vector3(1, 0, 0);
      if (isValidGridPos())
      {
      }
      else
      {
        transform.position += new Vector3(-1, 0, 0);
      }
    }
    //控制物体旋转
    else if (Input.GetKeyDown(KeyCode.UpArrow))
    {
      //可在unity编辑器中通过旋转可得是对z轴进行旋转
      transform.Rotate(0, 0, -90);
      if (isValidGridPos())
      {
      }
      else
      {
        transform.Rotate(0, 0, 90);
      }
    }
    else if (Input.GetKeyDown(KeyCode.DownArrow)||Time.time-lastFail>=1)
    {
      transform.position += new Vector3(0, -1, 0);
      if (isValidGridPos())
      {
      }
      else
      {
        transform.position += new Vector3(0, 1, 0);
        FindObjectOfType<Spawner>().spawnNext();
        enabled = false;
      }
      lastFail = Time.time;
    }
  }
  bool isValidGridPos()//判断是否有效
  {
    foreach (Transform child in transform)
    {
      Vector2 v=Grid.roundVec2(child.position);
      //判断是否在边界之间
      if (!Grid.insideBorder(v))
        return false;
      if (Grid.grid[(int)v.x, (int)v.y] != null)
        return false;
    }
    return true;
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity实现俄罗斯方块

    本文实例为大家分享了Unity实现俄罗斯方块的具体代码,供大家参考,具体内容如下 一.使用SpriteRenderer作为小方块图片,创建7种由若干个小方块图片组成的方块,如下图: Shape-1是一个空物体,其子物体Block.Block(1).Block(2).Block(3)是小方块,Pivot是锚点(空物体),锚点用作于旋转中心点,方块旋转是以它为中心进行旋转的.旋转方块的代码如下: transform.RotateAround(pivot.position, Vector3.forwa

  • Unity实现俄罗斯方块(三)

    本文实例为大家分享了Unity实现俄罗斯方块第3部分,供大家参考,具体内容如下 解决穿透问题 逻辑部分 1.在物体进行移动的过程中更新格子的信息,原来的所占据的位置信息进行置空操作,现在所占据的格子进行赋值操作. 2.在移动后的位置进行判断,首先移动后的位置不能是null,且不能不是移动后的物体 代码部分 void updateGrid() { //去除移动以前的位置信息 for (int y = 0; y < Grid.height; y++) { for (int x = 0; x < G

  • Unity实现俄罗斯方块游戏

    本文实例为大家分享了Unity实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 一.演示 二.实现思路 创建每一个方块可移动到的位置点,可以理解为创建一个游戏地图,从(0,0)点开始依次向x轴和y轴延伸,例如x最大为9,y最大为19,则创建了一个20行10列的地图 制作每一个形状的预制体,Shape是每一个整体形状,Block是每一块小方块,CenterPos代表这个形状的旋转中心 创建GameController脚本控制游戏逻辑,挂载到面板物体上.创建Shape脚本控制每个形状的操作,挂

  • Unity实现俄罗斯方块(一)

    本文实例为大家分享了Unity实现俄罗斯方块第一部分,供大家参考,具体内容如下 准备工作 1.新建一个2D项目,新建成功以后设置相机的一些参数 2.导入所要用的图片,修改图片的一些属性 3.了解俄罗斯方块的几种模型 4.根据模型制作预制体(由多个小方块通过修改位置制作预制体) 5.设置游戏边界 注:当制作完预制体以后应当要保存项目save project以及游戏边界宽度应当要设置成可以放几个方块的宽度 搭建计时器 1.新建一个UI Text重命名为Timer,其中Text内容为00:00 2.编

  • Unity实现俄罗斯方块(二)

    本文实例为大家分享了Unity实现俄罗斯方块第2部分,供大家参考,具体内容如下 代码部分 1. 实现物体自由降落(在有关于物体的脚本中编写) 1).使用循环调用方法实现 public float speed = 0.3f;//物体下落 // Start is called before the first frame update void Start() { InvokeRepeating("Move", 0, speed); } void Move() { transform.po

  • 基于Unity编写一个九宫格抽奖软件

    目录 一.前言 二.效果图 三.案例制作 1.界面搭建 2.代码编写 3.效果演示 四.后言 一.前言 本博文标题和内容参考:基于原生JS实现H5转盘游戏 博主将改编成Unity版本. 二.效果图 三.案例制作 1.界面搭建 使用了9个图片作为奖品栏,然后一个chooseBox作为蒙版,一个StartBtn开始按钮放在中间 2.代码编写 新建脚本goLuckyDraw.cs 使用DoTween插件做动画,没有导入这个插件的下载导入一下 实现抽奖,主要有两个方面,一个是概率的设置,一个是动画 动画

  • 如何利用vue3实现一个俄罗斯方块

    目录 前言 游戏相关设置 游戏界面设置 存储还在移动的俄罗斯方块信息 存储已经不能移动的俄罗斯方块信息 使用之前在贪吃蛇中使用的颜色渲染工具 让方块移动起来(不考虑切换方块的形态切换) 检测移动的俄罗斯方块二维数组在移动后它的每个坐标点数组是否有超出范围的 检测移动的俄罗斯方块二维数组在移动后它的每个坐标点数组是否会触碰到不可移动的俄罗斯方块上 特殊情况(得分) 移动方法 切换操作书写 设计检测该形状形态的方法 检测z形和反z形形态的方法 检测L形.反L形.三角形形态的方法 设计切换方法 切换L

  • Unity2019-2020 个人版官方免费激活详细方法

    目录 一.下载Unity 二.登录账号 三.激活新许可证 1.点击激活新许可证 2.许可协议 3.完成激活 四.手动激活 1.点击手动激活 2.保存许可证申请(alf) 3.跳转到激活页面获取许可证文件 4.保存许可证文件.ulf 5.加载许可证文件 6.完成激活 7.为什么要搞一个手动激活的功能 五.愉快地使用Unity 一.下载Unity 首先去官网下载对应版本的 UnityHubUnity 官网地址: https://unity.cn/releases 二.登录账号 安装完UnityHub

  • Unity绘制二维动态曲线

    一.前言 之前用Line Render实现过这个动态曲线的绘制,使用这个实在太不方便了,一直寻思怎么在一张图片上通过控制图片的像素值实现曲线的动态绘制.参考了Unity的官网教程实现了这个,效果图如图所示: 这样实现的效果比LineRender 要好,并且不怎么消耗计算和渲染 二.实现 1.代码创建一个背景贴图,并将这个贴图给UGUI的RawImage控件 //创建背景贴图 widthPixels = (int)(Screen.width * width); heightPixels = (in

  • Unity实现多平台二维码扫描

    在unity里做扫二维码的功能,虽然有插件,但是移动端UI一般不能自定义,所以后来自已做了一个,直接在c#层扫描解析,UI上就可以自己发挥了. 上代码: 这个是调用zxing的脚本. using UnityEngine; using System.Collections; using ZXing; using ZXing.QrCode; public class QR { /// <summary> /// 解析二维码 /// </summary> /// <param na

随机推荐