/// <summary> /// コンテナを破壊してピースを開放する /// </summary> public void DestroyContainer() { //設定した変更を元に戻す foreach (Piece p in pieceArray) { p.noCollision = false; p.transform.SetParent(null); p.GetComponent <Collider2D>().enabled = true; StageGenerator.SetPiecePosition(p, p.transform.position); p.transform.position = p.position; } //パーティクル開放 if (createParticle) { createParticle.transform.SetParent(null); ParticleManager.ParticleDestroy(createParticle); } if (moveParticle) { moveParticle.transform.SetParent(null); ParticleManager.ParticleDestroy(moveParticle); } Debug.Log("DestroyContainer"); Destroy(gameObject); }
/// <summary> /// 指定された座標へ動かす /// </summary> /// <param name="newPosition">移動する場所</param> /// <param name="isXDir">はさんでいる方向</param> public void Move(Vector2 newPosition, bool isXDir) { //角の座標を定義 Vector2[] checkPosition = new Vector2[4]; checkPosition[0] = new Vector2(-containerSize.x, -containerSize.y); checkPosition[1] = new Vector2(-containerSize.x, containerSize.y - 0.1f); checkPosition[2] = new Vector2(containerSize.x - 0.1f, -containerSize.y); checkPosition[3] = new Vector2(containerSize.x - 0.1f, containerSize.y - 0.1f); for (int i = 0; i < 4; i++) { checkPosition[i] *= 0.5f; checkPosition[i] += newPosition + new Vector2(0.5f, 0.5f); checkPosition[i].x = (int)checkPosition[i].x; checkPosition[i].y = (int)checkPosition[i].y; } /* x方向の制限 */ bool isXCollision = false; if (isXDir) { for (int i = 0; i < 2; i++) { //チェック用の位置を保存 Vector2 startPosition = checkPosition[i]; Vector2 endPosition = checkPosition[i + 2]; //同じ座標も対応するので+1する endPosition.x += 1; //判定を連続でとる do { Piece p = StageGenerator.GetPiece(startPosition); if (p && !p.noCollision) { isXCollision = true; break; } startPosition.x += 1; } while(startPosition != endPosition); if (isXCollision) { break; } } } Vector2 hitPos = new Vector2(); //方向がYの場合は+1まで検査 if (!isXDir) { Vector2[] cy = new Vector2[4]; cy[0] = newPosition + new Vector2(0.1f, -0.5f - containerSize.y * 0.5f); cy[1] = newPosition + new Vector2(0.9f, -0.5f - containerSize.y * 0.5f); cy[2] = newPosition + new Vector2(0.1f, 1.5f + containerSize.y * 0.5f); cy[3] = newPosition + new Vector2(0.9f, 1.5f + containerSize.y * 0.5f); foreach (var ccy in cy) { if (StageGenerator.GetPiece(ccy)) { hitPos = StageGenerator.GetPiece(ccy).position; isXCollision = true; break; } } } if (isXCollision) { newPosition.y = (int)((transform.position.y + 0.25) * 2) * 0.5f; } /* y方向の制限 */ bool isYCollision = false; if (!isXDir) { for (int i = 0; i < 2; i++) { //チェック用の位置を保存 Vector2 startPosition = checkPosition[i * 2]; Vector2 endPosition = checkPosition[i * 2 + 1]; //同じ座標も対応するので+1する endPosition.y += 1; //判定を連続でとる do { Piece p = StageGenerator.GetPiece(startPosition); if (p && !p.noCollision) { isYCollision = true; break; } startPosition.y += 1; } while(startPosition != endPosition); if (isYCollision) { break; } } } hitPos = new Vector2(); //方向がXの場合は+1まで検査 if (isXDir) { Vector2[] cx = new Vector2[4]; cx[0] = newPosition + new Vector2(-0.5f - containerSize.x * 0.5f, 0.1f); cx[1] = newPosition + new Vector2(-0.5f - containerSize.x * 0.5f, 0.9f); cx[2] = newPosition + new Vector2(1.5f + containerSize.x * 0.5f, 0.1f); cx[3] = newPosition + new Vector2(1.5f + containerSize.x * 0.5f, 0.9f); foreach (var ccx in cx) { if (StageGenerator.GetPiece(ccx)) { hitPos = StageGenerator.GetPiece(ccx).position; isYCollision = true; break; } } } if (isYCollision) { newPosition.x = (int)((transform.position.x + 0.25) * 2) * 0.5f; } //移動 transform.position = newPosition; //座標を反映 foreach (Piece p in pieceArray) { StageGenerator.SetPiecePosition(p, p.transform.position); } }