コードを分かりやすくしてみる

2019/5/11更新

前回のコードを改めて見直してみると
分かりにくい部分が多すぎるので、コードを修正してみました。

まず、ボタンとピースの二つの名前を使っていたのでピースに統一する。


public void PuPiece(int PieceNo) → public void PushPiece(int PieceNo)
ついでに省略していた部分を正確に書き直しました。

ここからは、PushPieceメソッドにいろいろと詰め込んでいたので、
各動作を分解してメソッドに書き直してみます。


まず、ピースのポジション確認をPushPieceメソッド内に書いていたので、
外に出す事に…

//0番ピースと押したピースのポジション確認
void PieceSearch(int PieceNo)
{
for (int i = 0; i < 16; i++)
{
if (Pos[i] == 0)
{
Add0 = i;
}
if (Pos[i] == PieceNo)
{
AddP = i;
}
}
}

ボタンを押した時にピースナンバーを取得したので、
それを引数にしてピースサーチのメソッドを作ってみました。

これで、PushPieceメソッド内が少しだけスッキリしました。

続いて、switch文のピースを動かすコマンドが重複しているので、
新たに動作メソッドを作って、呼び出すようにしてみます。

//0番ピースと押したピースを入れ替える
void PieceMove(int PieceNo)
{
rect[PieceNo].DOLocalMove(new Vector3(Xp[Add0], Yp[Add0], 0f), 0.2f);
Pos[AddP] = 0;
Pos[Add0] = PieceNo;
}

ピースを押すたびにトランスホームを取得していたのですが、
何かの記事でGetComponentやFindはリソースを使うので、
呼び出しの時は、一度だけにして変数にキャッシュしておく方がいいとあったので、

スタート時にピースのトランスホームを取得しておきます。

最終的に修正したのがこちら

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class PieceManager : MonoBehaviour {

//ピースオブジェクト
public GameObject[] Piece;

//トランスホーム用変数
private RectTransform []rect=new RectTransform[16];

//ポジション変数
private int[] Pos = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

//座標変数
private int[] Xp = { -240, -80, 80, 240,
-240, -80, 80, 240,
-240, -80, 80, 240,
-240, -80, 80, 240 };

private int[] Yp = { 240, 240, 240, 240,
80, 80, 80, 80,
-80, -80, -80, -80,
-240, -240, -240, -240, };

//空きマスと押したピースの座標取得用変数
private int Add0;
private int AddP;


// Use this for initialization
void Start()
{

//ピースオブジェクトのトランスホーム取得
for (int i = 0; i < 16; i++)
{
rect[i] = Piece[i].GetComponent();
}

}


// Update is called once per frame
void Update () {

}


//ピースボタンを押した処理
public void PushPiece(int PieceNo)
{

PieceSearch(PieceNo); //ポジション確認メソッドを呼び出す

switch (AddP)
{
case 0:
if (Pos[1] == 0 || Pos[4] == 0)
{
PieceMove(PieceNo);
}
break;
case 1:
if (Pos[0] == 0 || Pos[2] == 0 || Pos[5] == 0)
{
PieceMove(PieceNo);
}
break;
case 2:
if (Pos[1] == 0 || Pos[3] == 0||Pos[6]==0)
{
PieceMove(PieceNo);
}
break;
case 3:
if (Pos[2] == 0 || Pos[7] == 0)
{
PieceMove(PieceNo);
}
break;
case 4:
if (Pos[0] == 0 || Pos[5] == 0||Pos[8]==0)
{
PieceMove(PieceNo);
}
break;
case 5:
if (Pos[1] == 0 || Pos[4] == 0 || Pos[6] == 0||Pos[9]==0)
{
PieceMove(PieceNo);
}
break;
case 6:
if (Pos[2] == 0 || Pos[5] == 0 || Pos[7] == 0||Pos[10]==0)
{
PieceMove(PieceNo);
}
break;
case 7:
if (Pos[3] == 0 || Pos[6] == 0||Pos[11]==0)
{
PieceMove(PieceNo);
}
break;
case 8:
if (Pos[4] == 0 || Pos[9] == 0||Pos[12]==0)
{
PieceMove(PieceNo);
}
break;
case 9:
if (Pos[5] == 0 || Pos[8] == 0 || Pos[10] == 0||Pos[13]==0)
{
PieceMove(PieceNo);
}
break;
case 10:
if (Pos[6] == 0 || Pos[9] == 0 || Pos[11] == 0||Pos[14]==0)
{
PieceMove(PieceNo);
}
break;
case 11:
if (Pos[7] == 0 || Pos[10] == 0||Pos[15]==0)
{
PieceMove(PieceNo);
}
break;
case 12:
if (Pos[8] == 0 || Pos[13] == 0)
{
PieceMove(PieceNo);
}
break;
case 13:
if (Pos[9] == 0 || Pos[12] == 0 || Pos[14] == 0)
{
PieceMove(PieceNo);
}
break;
case 14:
if (Pos[10] == 0 || Pos[13] == 0 || Pos[15] == 0)
{
PieceMove(PieceNo);
}
break;
case 15:
if (Pos[11] == 0 || Pos[14] == 0)
{
PieceMove(PieceNo);
}
break;
}

}


//0番ピースと押したピースのポジション確認
void PieceSearch(int PieceNo)
{
for (int i = 0; i < 16; i++)
{
if (Pos[i] == 0)
{
Add0 = i;
}
if (Pos[i] == PieceNo)
{
AddP = i;
}
}
}



//0番ピースと押したピースを入れ替える
void PieceMove(int PieceNo)
{
rect[PieceNo].DOLocalMove(new Vector3(Xp[Add0], Yp[Add0], 0f), 0.2f);
rect[0].DOLocalMove(new Vector3(Xp[AddP], Yp[AddP], 0f), 0.2f);
Pos[AddP] = 0;
Pos[Add0] = PieceNo;
}
}
トランスホームを取得するためにピースナンバーを参照してるのですが、
Pieceのelementが0から始まる為、element0=Piece1となってしまいます。

コードを書いて行く内にPieceナンバー -1と変換する必要があるため
ややこしくなるので、0番Pieceを追加して対応する事にしました。

なのでUnity上も変更です。
SPuzzle4.jpg
Piece0を追加して、各ピースにスクリプトをアタッチしていたのをPieceManagerに移動しました。

Piece0~15オブジェクトをスクリプトにアタッチして、
動作確認です。


無事動かす事ができました。

これで少しは分かりやすくなったかと思います。

ただ、switch文が長すぎるのでなんとかしたいのですが、
良い案が思いつかない( ̄~ ̄;) ウーン

良い方法はないものか…

この記事へのコメント