*

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

公開日: : C#, Unity

今回からスクリプトがかなり難しくなってくるかも。
前回の続き。

というわけで前回はドラッグで動かすことが出来ましたが、パズドラはドラッグして、タイルに重なったらくるんと入れ替わっていますので、その動きを再現します。
前回はスプライト自体に動きを書き込みましたが、入れ替えるという処理は、今保持しているタイルという情報が必要になります。

スプライトに保持させて行う方法がわからなかったので、タッチの動きを管理するGameSystemというGameObjectに管理をさせて、動きを再現していきます。

まずはGameObjectからCreateEmptyで空のゲームオブジェクトを作成し、GameSystemと名づけます。
Unity_
Unity_

そして、Add ComponentからNewScriptGameSystemというスクリプトを作成してアタッチして(オブジェクトにコンポーネントを付けて)ください。
(画像はスクリプトは既に作っていたのでalready existsが出ていますが気になさらず)
Unity_
Unity_

それではGameSystemのスクリプトを以下のように記述してください。

using UnityEngine;
using System.Collections;

public class GameSystem : MonoBehaviour {
	public GameObject holdObj;
	public float holdPositionX;
	public float holdPositionY;
	private float z = 10f;

	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {
		if(Input.GetMouseButtonDown(0)){
			LeftClick();
		}
		if(Input.GetMouseButton(0)){
			LeftDrag();
		}
		if(Input.GetMouseButtonUp(0)){
			LeftUp();
		}
	}

	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;
		}
	}

}

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

かなりの量になっていますが、ゆっくりと解説をご覧頂ければ理解出来ると思います。
やってること自体は単純ですので!

そして、前回追加したドラッグの処理が邪魔になるので、消しましょう。Tile.csはこんな感じに編集します。

using UnityEngine;
using System.Collections;

public class Tile : MonoBehaviour {
	public Sprite[] tiles;

	// Use this for initialization
	void Start () {
		SpriteRenderer renderer = GetComponent<SpriteRenderer>();
		int test = Random.Range (0, 6);
		renderer.sprite = tiles[test];
	}
	// Update is called once per frame
	void Update () {

	}
}

というわけで早速実行してみましょう。
Unity_
Unity_

これで基本の動きは出来るようになりましたね。お疲れ様でした。
行き当たりばったりに書いているので、これより良い方法はたくさんあるかもしれません。

次回更新しました→[Unity]Unity2Dチュートリアル 画面上のGameObjectを取得する

↓どうしても待ちきれない人へお勧めの書籍↓

読んでみたけど、なかなか手軽な内容です。初心者に丁度よい情報量だと思います。初心者を抜け出した頃だと少し物足りないかも? Scriptについても超基本までは解説してあるのでこれを覚えてアルゴリズムを考えて覚えていきました。

ad

関連記事

logo

[Unity]Unity 2Dチュートリアル スプライトを元の位置に戻す ソース解説

◆全文 using UnityEngine; using System.Collection

記事を読む

unity debug

[Unity]MonoDevelopのデバッグの仕方

コメントで頂いた質問を打破するためにデバッグの仕方でも書いてみます。 まずは、プロジェクトを開

記事を読む

logo

[C#]AS400のメンバーを指定してデータにアクセスする

◆前提条件◆ CliantAccessをインストールしている。 .NET Framework3.

記事を読む

Unity_

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

前回の続き。 さて、そろそろパズドラみたいにパズルを消すロジックを考えていきましょう。 パズ

記事を読む

unity ご祝儀

[Unity?]割り切れない関係のためのご祝儀計算シミュレータ

今日、親友が結婚します。 なので、ご祝儀を用意するんですが、相場は3万円ですね。 じゃあ、な

記事を読む

logo

[VSTO,Excel,C#]C#のアドインで現在起動しているExcelを取得する。

ExcelのアドインをC#で開発してるんですが、情報少ないですねぇ。 とりあえずMicrosoft

記事を読む

logo

[C#, Generic]UnityのAddComponentとかなんとかComponentを実装してみる

UnityのAddComponentってありますよね。 みたいなやつ。 このジェネリクスの

記事を読む

unity

[Unity]コードリファレンス GameObjectの検索と削除

検索ですので、検索対象となるCubeでも適当に置いておきます。 GameObject.

記事を読む

logo

[Unity]GameObject.Findは遅い

遅いらしいです。 なので、マネージャークラスを作りましょう、というのが風潮らしいです。 マネージ

記事を読む

Unity_

[Unity]Unity2Dチュートリアル 直線で3つ同色のパズルを消去する

前回の続き。 パズドラじゃなくて、パズドラ+ぷよぷよの謎パズルを作ってしまったので、 今回は

記事を読む

ad

Comment

  1. I am really impressed with your writing skills and also with the layout on your weblog. Is this a paid theme or did you customize it yourself? Either way keep up the nice quality writing, it’s rare to see a great blog like this one these days.

  2. わな び より:

    It can’t get any better than this!

    This theme is Stinger3, that is free.It is made by Japanese.
    I customized it slightly.Unfortunately,I have only a little bit of knowledge on weblog.

    I will do my best that I keep writing an article.
    Thanks for reading to the end.

  3. dig this より:

    I simply want to say I am newbie to blogging and site-building and certainly savored you’re website. Almost certainly I’m going to bookmark your blog . You surely come with tremendous articles. Thanks for revealing your website.

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 ↑