*

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

公開日: : C#, Unity, ソース

◆全文

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

◆解説

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;

こちらの値はゲーム中で変更することはありえないので、const指定することによって定数にしています。
(定数は1とか2とか、不変の値のことです)

private GameObject[,] tileSet;

二次元配列です。
配列ってなんだ!? って方はイメージ画像を見るとわかりやすいかと。
Unity_
これにより、添え字([1,2]とかの数字のこと)を使うことで、オブジェクトを特定できます。

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

よくある二重ループ。
iは行の制御、jは列の制御です。
例えばFirstTilePosX + TileWidth * j はX座標(横軸)を指定しています。

一週目はjが0なので、
-1.5f + 0.5f * 0 = -1.5f
二週目はjが1なので、
-1.5f + 0.5f * 1 = -1.0f
三週目は
-1.5f + 0.5f * 2 = -0.5f
:
:
-1.5f + 0.5f * 5 = -1.0f

そしてJが6になると、j < TileColNumの条件が満たせず、ループを抜けます。
ループを抜けると外側のループで今度はiに1加算されて再度続行。
行が変わるイメージで同様の処理を行っていきます。
行はiが5になった瞬間にループを抜けて、終了。

どうしてもわからなくなったら、以下のようにトレースをするといいです。
まず、紙とペンを用意して、ijの箱を書きます。
初期値は今回は0です。
Unity_
そしてソースを指でなぞります。
まずはCollider2D col = Physics2D.OverlapPoint(new Vector2(FirstTilePosX + TileWidth * j, FirstTilePosY + TileHeight * i));
そしてここに来たら、紙にこう書き加えます。
Unity_
そうすると計算が簡単ですね。(iの方は見切れてますごめんなさい)
そして、次の行をなぞって、
if(“tile”.Equals(col.tag)){
タグがタイルのとき、と考えて、その場合は以下の行。
tileSet[i,j] = col.gameObject;
ではこう書きます。
Unity_
jのループが終わったらjを以下のように書き換える。
Unity_
以上の動きを逐一やってみてください。
理解が出来るはずです。

この作業をトレースといいます。
私もいまだに難しい処理になるとトレースをします。

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

ad

関連記事

Unity_

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

前回、画面上のオブジェクトを一括で手に入れる方法はわかりました。 しかし、これではどのオブジェクト

記事を読む

logo

[C#, AS400]列挙体の文字列化&DB2/400にODBC接続

定数をなるべく書きたくないんです。 あとからメンテをするときに複数箇所変更しなくてはいけないから。

記事を読む

unity

[Unity]コードリファレンス GameObjectを親子関係にする。

親子関係にして、親が動いたら子も動くような動きをさせます。 transform.parentプ

記事を読む

VisualStudio_

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

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

記事を読む

logo

[C#]XML Serializerで読み書き

XML XMLを触りたいので適当にメモ書き 書き出し using System.IO;

記事を読む

Unity_

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

今回からスクリプトがかなり難しくなってくるかも。 前回の続き。 というわけで前回はドラッグで

記事を読む

Unity_

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

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

記事を読む

addcomp

[Unity]コードリファレンス コンポーネントをアタッチする。

コンポーネントをプログラム実行時に追加します。 AddComponent() AddComp

記事を読む

Wannabenote

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

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

記事を読む

unity move

[Unity]コードリファレンス GameObjectを移動する。

移動します。 transformプロパティ GameObjectのtransformプロパテ

記事を読む

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 ↑