Unity实现俄罗斯方块游戏

2020-06-21 13:00:01王振洲

Shape脚本,控制每个形状的操作

using UnityEngine;
 
public class Shape : MonoBehaviour
{
 private bool canFall = true;//能否下落
 
 private float fallTimer;//下落的计时器
 private float fallTimeval = 0.5f;//下落的时间间隔
 
 /// <summary>
 /// 初始化形状
 /// </summary>
 /// <param name="pos"></param>
 /// <param name="color"></param>
 public void Init(Vector2 pos, Color color)
 {
  transform.position = pos;
 
  foreach (Transform child in transform)
  {
   if (child.GetComponent<SpriteRenderer>() != null)
   {
    child.GetComponent<SpriteRenderer>().color = color;
   }
  }
 }
 
 private void Update()
 {
  if (canFall == false)
  {
   return;
  }
 
  //控制下落
  if (fallTimer >= fallTimeval)
  {
   //下落
   Fall();
 
   fallTimer = 0;
  }
  else
  {
   fallTimer += Time.deltaTime;
  }
 
  //控制加速下落
  ControlUpspeed();
 
  //控制左右移动
  ControlMovement();
 
  //控制旋转
  ControlRotate();
 }
 
 /// <summary>
 /// 控制左右移动
 /// </summary>
 private void ControlMovement()
 {
  float h = 0;
  if (Input.GetKeyDown(KeyCode.RightArrow))
  {
   h = 1;
  }
  else if (Input.GetKeyDown(KeyCode.LeftArrow))
  {
   h = -1;
  }
 
  Vector3 curPos = transform.position;
  Vector3 targetPos = curPos;
  targetPos.x += h;
  transform.position = targetPos;
 
  if (GameController.Instance.IsValidPos(transform) == false)
  {
   targetPos.x -= h;
   transform.position = targetPos;
  }
 }
 
 /// <summary>
 /// 控制旋转
 /// </summary>
 private void ControlRotate()
 {
  if (Input.GetKeyDown(KeyCode.UpArrow))
  {
   Transform rotateTrans = transform.Find("CenterPos");
   transform.RotateAround(rotateTrans.position, Vector3.forward, -90);
 
   if (GameController.Instance.IsValidPos(transform) == false)
   {
    transform.RotateAround(rotateTrans.position, Vector3.forward, 90);
   }
  }
 }
 
 /// <summary>
 /// 控制加速
 /// </summary>
 private void ControlUpspeed()
 {
  if (Input.GetKeyDown(KeyCode.DownArrow))
  {
   fallTimeval = 0.05f;
  }
  if (Input.GetKeyUp(KeyCode.DownArrow))
  {
   fallTimeval = 0.5f;
  }
 }
 
 /// <summary>
 /// 下落
 /// </summary>
 private void Fall()
 {
  Vector3 curPos = transform.position;
  Vector3 targetPos = curPos;
  targetPos.y -= 1;
  transform.position = targetPos;
 
  if (GameController.Instance.IsValidPos(transform) == false)
  {
   targetPos.y += 1;
   transform.position = targetPos;
 
   FallToBottom();
  }
 }
 
 /// <summary>
 /// 下落到底部
 /// </summary>
 private void FallToBottom()
 {
  canFall = false;
  GameController.Instance.CurShape = null;
 
  //方块下落到底部时将每个方块位置添加到地图数组中
  GameController.Instance.AddEachBlockTransToMapArray(transform);
 
  if (GameController.Instance.IsGameover())
  {
   GameManager.Instance.Gameover();
  }
 }
}

更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。