*

[Unity]Unity2Dチュートリアル 同じ色のパズルを消去する

公開日: : 最終更新日:2014/12/03 C#, Unity

前回の続き。

さて、そろそろパズドラみたいにパズルを消すロジックを考えていきましょう。
パズルを消すには同じ色である、という情報が必要です。
同じ色、という情報は、どこにあるでしょうか。

そう、SpriteRendererですね。

こいつに設定したSpriteが「tile_0」「tile_1」「tile_2」といったように別個の種類を持っています。
というわけで、スプライトを取り出して消してみます。

そして消すというロジックを確かめるために、今回は3マッチでなく、右に同じものがあったら消すという処理にします。

GameSystem.csを以下のように書き換えてください。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GameSystem : MonoBehaviour {
	private const int TileLineNum = 5;
	private const int TileColNum = 6;
	private const float TileWidth = 0.5f;
	private const float TileHeight = 0.5f;
	private const float FirstTilePosX = -1.5f;
	private const float FirstTilePosY = -2;

	public GameObject holdObj;
	public float holdPositionX;
	public float holdPositionY;
	private float z = 10f;
	private GameObject[,] tileSet;
	
	// Use this for initialization
	void Start () {
		SetTileSet();
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetMouseButtonDown(0)){
			LeftClick();
		}
		if(Input.GetMouseButton(0)){
			LeftDrag();
		}
		if(Input.GetMouseButtonUp(0)){
			LeftUp();
			DeleteMatchTile();
		}
	}
	
	private void LeftClick(){
		Vector3 tapPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, z);
		if(holdObj == null){
			Collider2D col = Physics2D.OverlapPoint(Camera.main.ScreenToWorldPoint(tapPoint));
			if(col != null){
				this.holdObj = col.gameObject;
				holdPositionX = this.holdObj.transform.position.x;
				holdPositionY = this.holdObj.transform.position.y;
				holdObj.transform.position = Camera.main.ScreenToWorldPoint(tapPoint);
			}
		}
		
	}
	private void LeftDrag(){
		Vector3 tapPoint = Input.mousePosition;
		if(holdObj != null){
			this.holdObj.transform.position = Camera.main.ScreenToWorldPoint(new Vector3(tapPoint.x, tapPoint.y, z));
			Collider2D[] colSet = Physics2D.OverlapPointAll(Camera.main.ScreenToWorldPoint(new Vector3(tapPoint.x, tapPoint.y, z)));
			if(colSet.Length > 1){
				foreach(Collider2D col in colSet){
					if(!col.gameObject.Equals(this.holdObj)){
						float tmpPositionX = holdPositionX;
						float tmpPositionY = holdPositionY;
						holdPositionX = col.gameObject.transform.position.x;
						holdPositionY = col.gameObject.transform.position.y;
						col.gameObject.transform.position = new Vector3(tmpPositionX, tmpPositionY, z);
					}
				}
			}
		}
	}
	private void LeftUp(){
		if(holdObj != null){
			holdObj.transform.position = new Vector3(holdPositionX, holdPositionY, z);
			holdObj = null;
		}
	}
	private void SetTileSet(){
		GameObject[,] tileSet = new GameObject[TileLineNum,TileColNum];
		for(int i = 0; i < TileLineNum; i++){
			for(int j = 0; j < TileColNum; j++){
				Collider2D col = Physics2D.OverlapPoint(new Vector2(FirstTilePosX + TileWidth * j, FirstTilePosY + TileHeight * i));
				if("tile".Equals(col.tag)){
					tileSet[i,j] = col.gameObject;
				}
			}
		}
		
		this.tileSet = tileSet;
	}

	private void DeleteMatchTile(){
		for(int i = 0; i < TileLineNum; i++){
			for(int j = 0; j < TileColNum - 1; j++){
				try{
					GameObject nowObj = this.tileSet[i,j];
					GameObject nextObj = this.tileSet[i,j+1];
					SpriteRenderer nowRenderer = nowObj.GetComponent<SpriteRenderer>();
					SpriteRenderer nextRenderer = nextObj.GetComponent<SpriteRenderer>();
					Sprite nowSprite = nowRenderer.sprite;
					Sprite nextSprite = nextRenderer.sprite;
					if(nowSprite.Equals(nextSprite)){
						Destroy(nowObj);
						Destroy(nextObj);
					}
				}catch{
				}
			}
		}
	}
}

書き換えた場所はUpdateの最後のボタンを離したときの処理に関数を呼ぶようにDeleteMatchTile()を追加。

void Update () {
	if(Input.GetMouseButtonDown(0)){
		LeftClick();
	}
	if(Input.GetMouseButton(0)){
		LeftDrag();
	}
	if(Input.GetMouseButtonUp(0)){
		LeftUp();
		DeleteMatchTile();
	}
}

そしてDeleteMatchTileを追加しています。

private void DeleteMatchTile(){
	for(int i = 0; i < TileLineNum; i++){
		for(int j = 0; j < TileColNum - 1; j++){
			try{
				GameObject nowObj = this.tileSet[i,j];
				GameObject nextObj = this.tileSet[i,j+1];
				SpriteRenderer nowRenderer = nowObj.GetComponent<SpriteRenderer>();
				SpriteRenderer nextRenderer = nextObj.GetComponent<SpriteRenderer>();
				Sprite nowSprite = nowRenderer.sprite;
				Sprite nextSprite = nextRenderer.sprite;
				if(nowSprite.Equals(nextSprite)){
					Destroy(nowObj);
					Destroy(nextObj);
				}
			}catch{
			}
		}
	}
}

ソース解説はこちら→[Unity]Unity2Dチュートリアル 同じ色のパズルを消去する ソース解説

DeleteMatchTileは二重ループで、今のオブジェクトと次のオブジェクトからスプライトを取り出して、比較をしています。
確かめるためなので超適当にtry~catchをしています。(詳しくはソース解説にて)
よく読めばそんなに難しいことは書いてないのがわかるはず。

というわけで実行してみましょう。
実行直後がこんな感じ。
Unity_
隣同士が消えるので以下の画像の斜線部分のタイルが消えるはずですね。
Unity_

そんなわけでクリック!
Unity_

お見事消えました

というわけでまがりなりにも同じ色を消すことができました。
本日はここまで。また次回。

次回更新しました→[Unity]Unity2Dチュートリアル 同じ色で繋がったパズルを消去する

ad

関連記事

logo

[Unity]コードリファレンス ソケット通信の開始して接続して切断する。

オンラインゲームを作るためにはソケット通信が必要です。 今回はいきなりソースから。解説は下の方に。

記事を読む

Wannabenote

[Unity]Unity4.6 UIチュートリアル Lesson10.UI Scrollbar 日本語要約

Unity関連まとめページはこちら。 前回のScroll Rectの続き。 UI Scr

記事を読む

logo

[C#]システム関連付けのソフトでファイルを起動する

事の発端 PDFをAdobeReaderで開きたいといわれました。 コマンドラインでAdobeR

記事を読む

logo

[Unity]Unity2Dでパズドラのようにタイルを動かす ソース解説

◆全文 using UnityEngine; using System.Collection

記事を読む

socket p2p unity

[Unity]Socket通信でP2Pすっぞ ホストへ接続

前回はホストが待ちうけするところまで作りました。 今回はクライアントがホストへ接続できるように

記事を読む

Wannabenote

[Unity]Unity4.6 UIチュートリアル Lesson7.UI Slider 日本語要約

Unityまとめページはこちら。 前回の続き。 今回はスライダーコントロールについてです

記事を読む

Unity_

[Unity]Unity4.6 UIチュートリアル Lesson5.UI Text 日本語要約

前回の続き。今回はUI Textについての説明。 とはいえ、さすがにテキストなので、あまり説明

記事を読む

logo

[Unity]Unity2Dチュートリアル 同じ色のパズルを消去する ソース解説

◆全文 using UnityEngine; using System.Collecti

記事を読む

Unity_

[Unity]Unity4.6 UIチュートリアル Lesson3.UI Button 日本語要約

前回に続いて、今回はUI Buttonの説明。 公式はこちら まずはHierarchyにUI

記事を読む

Registry レジストリ C# .NET

[.NET, C#]レジストリの値が取得できない原因

正しいPathを指定しているのに 図のような 'HKEY_CURRENT_MACHINE\SO

記事を読む

ad

Comment

  1. しずえ より:

    よくわからないですが検索してみてデバッグがなんちゃら
    とかいうやつをMonoDevelopからRun→Attach to Processをやってみて黄色になったやつが
    if(“tile”.Equals(col.tag)
    でした。またはじめから作り始めたのですがやっぱり
    Tile.csを削除したところから色が全部同じになってしまいます。
    それから進めてみても直りません。
    どうしたらいいでしょうか?

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑