前提・実現したいこと
Unityを用いたVRを想定したゲームを開発しています
具体的には、ユーザの初期位置正面を0度としそこを中心に-90(ユーザから見て右側)から90度(左側)の範囲でランダムな角度を複数生成し、その角度にユーザが頭を回転させるというものです。
VRにはユーザの頭を取り囲むように180度のアーチ状の矢印が表示されスタート画面では1枚目の画像のように配置されています。目標角度の方向を矢印で目標角度を矢印の先端で表しており、ゲームが開始されると、ユーザはそれを頼りに頭を回転させます。
(例)複数数生成した角度が -30, 30, 90の場合は、画像三枚目のようにまず-30度を矢印の先端が示し、次に30度を示すといった具合にです。
ゴール位置は一定時間ごとに更新されていき、ユーザも矢印に従って動くと仮定し頭部角度によって矢印が動くことはなく、ワールド座標で固定します。
試行錯誤していますがうまく行かず、おそらく以下にあるアーチ状矢印の回転方法を決める条件文、回転(rotate)のコーディングが間違っているのではないかと思っています
発生している問題・エラーメッセージ
矢印の先端を更新する際に、矢印の先端を回転軸としてy軸、z軸を回転させようとしているのですが、正しい向きに矢印が表示されません。
停止位置に先端を合わせることはできるのですが、回転がうまくいかずアーチの向きが正しくありません。
矢印移動の順番は、矢印の先端を次の目標角度に移動させ、その後回転させる です
該当のソースコード
C#
X =Mathf.Sin( (float)(kakudo[jp+2])* Mathf.Deg2Rad); Y =Mathf.Cos((float)(kakudo[jp+2]) * Mathf.Deg2Rad); Debug.Log("X Is" + X); Debug.Log("Y" + Y); Vector3 pos = this.gameObject.transform.position; this.gameObject.transform.position = new Vector3 (10 *X,0,(10*Y));//目標角度に位置を合わせる gameObject.transform.rotation = Quaternion.identity; ZZ=180f; if (kakudo[jp+2] > kakudo[jp + 1]) { if (kakudo[jp+1] <= kakudo[jp]) { Transform myTransform = this.transform; // myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] - 90), ZZ, Space.World); myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] - (float)kakudo(jp+1) + 90), ZZ, Space.World); } } else { Transform myTransform = this.transform; // myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] - 90), 0, Space.World); myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] - (float)kakudo(jp + 1) + 90), 0, Space.World); } } else if (kakudo[jp + 2] <= kakudo[jp+1]) { if (kakudo[jp+1] <= kakudo[jp]) { if (kakudo[jp + 2] <= 0) { Transform myTransform = this.transform; myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] + 90), 0, Space.World); } else { Transform myTransform = this.transform; myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] + 90), 0, Space.World); } } else if (kakudo[jp + 1] > kakudo[jp]) { if (kakudo[jp + 2] <= 0) { Transform myTransform = this.transform; myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] + 90), ZZ, Space.World); } else { Transform myTransform = this.transform; myTransform.Rotate(0, 1 * ((float)kakudo[jp + 2] + 90), ZZ, Space.World); } } }
試したこと
kakudo[]には目標角度が格納されており(kakudo[1]=-30,kakudo[2]=90,kakudo[3]=-50など)、kakudo[jp]がひとつ前の目標角度、kakudo[jp+1]が今の目標角度、kakudo[jp+2]が次の目標角度です
回転の際にrotate,space worldを使いワールド座標で回転させようとしたのですがうまくいきませんでした
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー