*

[Unity]Unity2Dチュートリアル 画面上のGameObjectを左下から取得する

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

前回、画面上のオブジェクトを一括で手に入れる方法はわかりました。
しかし、これではどのオブジェクトがどこにあるのか全くわかりません。
しかも「tile_0」という名前だから余計にわかりません。
いちいちそれぞれの座標を調べて、それがどこにあるのか特定して、でもいいですが、若干面倒

というわけで、どれがどこにあるのかわかるようにしましょう。

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

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

ソース解説はこちら→[Unity]Unity2Dチュートリアル 画面上のGameObjectを左下から取得する ソース解説

どんどん長くなってきました。
今回追加・変更したのは2箇所。まずはフィールド宣言部です。

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;

TileLineNumとTileColNumはそれぞれ縦に何個パズルが存在するか、横に何個パズルが存在するかです。
今回は5*6なのでこうなります。
TileWidthは横軸の差、TileHeightは縦軸の差です。
Unity_

FirstTilePosXとYは左下から考えて最初のタイルのポジションです。
Unity_

private GameObject[,] tileSet;というように二次元配列に変更もされていますので注意。
二次元配列の解説はソース解説にて。

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

二次元配列を扱うように変更しています。
左下から順番にタイルを取得していくイメージですね。

こちらの関数のおかげでtileSetの引数を指定することで以下のようなイメージで扱うことが出来ます。
Unity_

試しに

void Start () {
	SetTileSet();
	Destroy(this.tileSet[2,4]);
}

と指定して、ゲームを実行してみましょう。
何が起きるかは想像が付きますね。
Unity_

今回はここまで。お疲れ様でした。
次回更新しました→[Unity]Unity2Dチュートリアル 同じ色のパズルを消去する

ad

関連記事

logo

[C#]AS400をDBに見立ててPCのPGMからODBC接続する

◆前提条件◆ PCにClient Accessがインストールされている。 PCに.NET Fra

記事を読む

logo

[Unity]Unity 2Dチュートリアル スプライトをドラッグ(タップ)して移動する ソース解説

◆全文 using UnityEngine; using System.Collection

記事を読む

Excel vsto 印刷設定 print setting

[C#, VSTO]Excelの印刷設定をする

印刷設定 VSTO(Visual Studio Tool for Office)Excelなんぞを

記事を読む

VisualStudio_

[C#,Excel]visual studio tools for office(VSTO)を利用してExcelのAddInをC#で作る

いい加減VBAが嫌になってきたので、調べたらC#でExcelのアドインが作れるんですね。 というわ

記事を読む

Unity_

[Unity]Unity2Dチュートリアル 画面上のGameObjectを左下から取得する ソース解説

◆全文 public class GameSystem : MonoBehaviour {

記事を読む

Unity1_5

[Unity]Unity2Dで3マッチパズルを作ろう~インストール編~

Unityの2D機能で3マッチパズルでも作ろうかと思ったのですが、ほとんど資料がない。Unity

記事を読む

Wannabenote

[Unity]Unity2Dチュートリアル 繰り返しパズルを消す

Unity関連記事まとめページはこちら 前回の続き。 さて、前回、やっとパズルのような体

記事を読む

wannabenote

[C#, Excel]最終行を取得する

Excelを触っているのでC#でExcelネタが続きます。 Excelの行数が知りたい Exce

記事を読む

Unity_

[Unity]Unity 2Dチュートリアル スプライトをドラッグ(タップ)して移動する

前回はスプライトの簡単な操作を覚えました。 今回はスプライトを移動させてみましょう。 ドラッグして

記事を読む

Unity_

[Unity]Unity4.6 UIチュートリアル Lesson6.UI Events and Event Triggers 日本語要約

前回の続き。 ついにずっと画面で見えていた謎のEventSystemに触れます。 なんか

記事を読む

ad

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 ↑