なんとなくを試してみる

ピースの方向を判断できないかな…
遅延の処理を試していた時に、なんとなくこんな事を考えていました。

最初は現在角度を読み込んで、0、90、180、270の条件で判定していましたが
角度がおかしくなる以上、判定に使えません。

なので向いてる方向が分かれば判定できるのに…
と考えていました。

方向を読み取る方法ってないのかな?検索しても出てこない…




なければ作ればいいのか!


と思って、ピースの向きを指定する方法を考えてみました。
向きを指定してやれば、そのまま判定にも使えます。


向きを指定するには、どうすればいいか整理します。

・初期角度は正位置なので分かっています。
・ピースをクリックしたら左に90°づつ回転していく。
・クリックする度に上→左→下→右の位置情報を更新する

これで設定できそうです。



変数などを追加する必要があるので、
追加項目を整理してみます。

・方向を指定する変数
・開始時に方向を取得
・回転時に方向を判断して回転させる

補足として、+90°の移動処理だとズレた時に修正できないので、
やはり直接角度を入力しようと思います。


まずは、方向指定用の変数を追加と開始時に方向を取得するです。


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

public class GameManager : MonoBehaviour {


public GameObject[] PieceBt;     //ピースの取得
new Transform transform;      //トランスフォーム取得用変数

private string[] PieceDire = new string[1]; //各ピースの方向

// Use this for initialization
void Start () {
PieceDire[0] = "UP";       //初期方向を指定
}

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

}

ピースを増やした時に対応できる様に配列で変数を組みます。
スタート時の向きは正位置なので、UPとしました。

続いて回転メソッドの見直しです。
まず、現在角度が必要ないのでfloat z = transform.localEulerAngles.z;を削除

方向を判断しないといけないので、switch文で判定を作ります。

switch (PieceDire[a])
{
case "UP":

break;

case "LEFT":

break;

case "UNDER":

break;

case "RIGHT":

break;
}

ここまで作れば後は回転処理です。

回転は transform.DORotate(new Vector3(0f, 0f, 90), 0.3f); が使えるので
そのまま移植するとして向きの変数指定を追加します。

最終的に組んだのがこちら

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

public class GameManager : MonoBehaviour {


public GameObject[] PieceBt;     //ピースの取得
new Transform transform;      //トランスフォーム取得用変数

private string[] PieceDire = new string[1]; //各ピースの方向

// Use this for initialization
void Start () {
PieceDire[0] = "UP";       //初期方向を指定
}

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

}

 //ピース番号を取得して回転処理をする
public void PushPiece(int a)
{
transform = PieceBt[a].GetComponent(); //ピースa番目のTransform情報を取得

  //向きによって回転位置を指定する
switch (PieceDire[a])
{
case "UP":
transform.DORotate(new Vector3(0f, 0f, 90), 0.3f);
PieceDire[a] = "LEFT";
break;

case "LEFT":
transform.DORotate(new Vector3(0f, 0f, 180), 0.3f);
PieceDire[a] = "UNDER";
break;

case "UNDER":
transform.DORotate(new Vector3(0f, 0f, 270), 0.3f);
PieceDire[a] = "RIGHT";
break;

case "RIGHT":
transform.DORotate(new Vector3(0f, 0f, 0), 0.3f);
PieceDire[a] = "UP";
break;
}
}
}

恐る恐るプレイでっす。
一回転して止まらないといいのですが・・・

やりました!
無事回転し続けます。

直接角度を入力してるので、連打してもズレません。
(@^∇^@) わぁーい

一時はどうなるかと焦ったんですが、無事乗り切れました。(;^_^A


一応z軸のログを見てみると連打時には、ズレが生じています。
Tween系の限界ですかね・・・

視覚的にもInspectorの表示も問題ないので、これで行けると思います。
試しに100連打ほどしてみましたがピースが大きくズレる事はありませんでした。


ここまでくれば問題もなさそうなので、ピースを増やしてみます。
後は、スタート時に全ピースが上を向いてるとパズルにならないので
ピースがバラバラの向きになるようにしてみたいと思います。

この記事へのコメント