前回のコードを改めて見直してみると
分かりにくい部分が多すぎるので、コードを修正してみました。
まず、ボタンとピースの二つの名前を使っていたのでピースに統一する。
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上も変更です。
Piece0を追加して、各ピースにスクリプトをアタッチしていたのをPieceManagerに移動しました。
Piece0~15オブジェクトをスクリプトにアタッチして、
動作確認です。
無事動かす事ができました。
これで少しは分かりやすくなったかと思います。
ただ、switch文が長すぎるのでなんとかしたいのですが、
良い案が思いつかない( ̄~ ̄;) ウーン
良い方法はないものか…
この記事へのコメント