今特定のオブジェクトを中心に、その周囲を一定間隔・一定周期で円運動するプログラムを作成しています。
オブジェクトのtransformを変更することで回転運動を実現しようと考えています。
現在下記のコードにおいて、デバッグを実施したところ、
②の部分のコードで対象オブジェクト(BossObj[0])のpositionを変更し、円の軌道上を移動させ続けることは成功しています。
しかし、③の部分で原点(PlayerObj)からみて対象オブジェクトが常に一定の方向を向かせようとしていますが、うまくいっていません。
(文章だけではわかりにくいと思いましたので、うまくいっていない状況に関しては参考(図1)を添付しておきます)
Mathf.Cosを利用して算出している角度が0°~90°に該当する範囲でしか算出されていないようなのですが、
対象オブジェクトの位置そのものは原点を中心に360°移動しており、
Mathf.AcosはUnityで用意されている関数なので、こうなってしまう原因がわかっておりません。
C#
1public class UltimetWepon : MonoBehaviour 2{ 3 void FixedUpdate() 4 { 5 //①プレイヤー【PlayerObj】と対象【BossObj[0]】位置情報の取得 6 PlayerTransform = PlayerObj.transform; 7 PlayerLocate = PlayerTransform.position; 8 BossTransform1 = BossObj[0].transform; 9 BossLocate1 = BossTransform1.position; 10 11 //②対象の位置情報の算出(プレイヤーの位置を中心に半径Rangeで回転運動させる) 12 BossLocate1.x = PlayerLocate.x + Range * Mathf.Cos(2 * Mathf.PI * period * Time.time); 13 BossLocate1.y = PlayerLocate.y + Range * Mathf.Sin(2 * Mathf.PI * period * Time.time); 14 BossObj[0].transform.position = BossLocate1; 15 16 //③プレイヤーの位置から見た対象の角度を算出 17 Direction1 = Mathf.Acos(Mathf.Abs(PlayerLocate.y - BossLocate1.y) / Mathf.Sqrt(Mathf.Pow(PlayerLocate.x - BossLocate1.x, 2) + Mathf.Pow(PlayerLocate.y - BossLocate1.y, 2))); 18 BossObj[0].transform.rotation = Quaternion.Euler(0, 0, Mathf.Rad2Deg * Direction1); 19 20 } 21}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/09 10:13
2021/02/09 10:14
2021/02/09 10:38 編集
2021/02/09 10:41
2021/02/09 11:03
2021/02/09 11:16
2021/02/09 12:19 編集
2021/02/09 12:13
2021/02/09 12:49
2021/02/10 01:28
2021/02/10 01:49