回転した方向へ向けて、ボールを発射できる仕組みを考えてみます。
3Dゲームでの弾幕、全方位に向けての発射等々、活用できるシーンはたくさんありますね。
クォータ二オンからオイラー角への変換についても、この制作で触れています。
関連記事:
一度に複数のオブジェクトを発射
プレーヤーの向いている方向に発射
全方位に向けてランダム発射
Instantiateでオブジェクトの角度を変える
ボールを用意する
この例では、Sphereのプレハブを用意し、リジッドボディとSphereMove.csを付けています。
Use Gravityのチェックを外しています。
SphereMove.csは以下のように書いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereMove : MonoBehaviour { private Rigidbody rb; private float speed; void Start() { rb = GetComponent<Rigidbody>(); speed = 5.0f; } void Update() { rb.velocity = transform.forward * speed; } } |
発射元オブジェクトの回転
続いて、発射元となるCubeオブジェクトを作成しました。
GameManager.csをつくり、Cubeに追加します。
GameManager.csは以下のように書きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] GameObject ball; private int k = 0; void Start() { StartCoroutine("BallSet"); } IEnumerator BallSet() { for (int i=0; i<20; i++) { transform.Rotate(new Vector3(0, k, 0)); k += 10; yield return new WaitForSeconds(0.3f); Instantiate(ball,transform.position,transform.rotation); } } } |
Ballのフィールドには、Sphereプレハブを入れます。
プレイしてみましょう。
10°ずつ回転しながら、0.3秒おきに発射するつもりが、突然予期しない方向へと進んでいきます。
CubeのTransformをスローで見てみましょう。
kを10ずつ増やしているにもかかわらず、回転は「10、30、60、100」のような増え方をしていることがわかります。
これは、Instantiateの回転角がクォータニオンで表現されているためです。
オイラー角へ変換して生成
ここで、 クォータニオン → オイラー角への変換メソッドが必要になります。
もう一度、GameManager.csを編集しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] GameObject ball; private float k; // public Quaternion rotation = Quaternion.identity; void Start() { StartCoroutine("BallSet"); k = 0; } IEnumerator BallSet() { for (int i=0; i<20; i++) { rotation.eulerAngles = new Vector3(0, k, 0); yield return new WaitForSeconds(0.3f); Instantiate(ball,transform.position,rotation); k += 30; } } } |
動きが見やすいように、kを30に変えています。
ゲームプレイしてみましょう。
回転しながら、全方位へ発射ができています。
オイラー角に変換したものを入れることで、回転方向へ生成することができます。
関連記事:
一度に複数のオブジェクトを発射
プレーヤーの向いている方向に発射
全方位に向けてランダム発射
Instantiateでオブジェクトの角度を変える