遅延の処理を試していた時に、なんとなくこんな事を考えていました。
最初は現在角度を読み込んで、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連打ほどしてみましたがピースが大きくズレる事はありませんでした。
ここまでくれば問題もなさそうなので、ピースを増やしてみます。
後は、スタート時に全ピースが上を向いてるとパズルにならないので
ピースがバラバラの向きになるようにしてみたいと思います。
この記事へのコメント