【Unity】自転しながら直進するオブジェクトを発射する方法

2024年6月1日

自転しながら直進するオブジェクトを発射する方法は、Unityでオブジェクトが回転しつつ直線的に移動する動きを実現する手法です。これを行うには、オブジェクトを生成し、移動と回転の動作を制御するスクリプトを作成します。例えば、あるスクリプトでオブジェクトをスペースキーで発射し、別のスクリプトでそのオブジェクトの回転と直進を管理します。これにより、発射されたオブジェクトが回転しながら前進するようになります。

動作イメージ

このプロジェクトでは、オブジェクトをInstantiateした際に、自転しながら発射時の方向に直進するようにします。

シーン構成

空のゲームオブジェクト

発射位置の特定発射方向決定用です。
Instantiateするスクリプトをコンポーネントととしてアタッチするためのゲームオブジェクトになります

Prefabゲームオブジェクト

スペースキーで発射されるオブジェクトのプレファブになります
一度、ヒエラルキーウィンドウで作成し、プロジェクトウィンドウのドラッグ&ドロップ、その後、ヒエラルキーウィンドウのゲームオブジェクトを作成します

作成手順

スクリプト

RotatingObjectSpawner.cs

このスクリプトは、新しいオブジェクトをInstantiateし、必要なパラメータを渡します。

using UnityEngine;

public class RotatingObjectSpawner : MonoBehaviour
{
    public GameObject objectToInstantiate; // InstantiateするPrefab
    public float moveSpeed = 5f; // 移動速度
    public float rotateSpeed = 50f; // 回転速度

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) // スペースキーを押した時にオブジェクトをInstantiate
        {
            GameObject instantiatedObject = Instantiate(objectToInstantiate, transform.position, transform.rotation);
            MoveAndRotate moveAndRotate = instantiatedObject.GetComponent<MoveAndRotate>();
            if (moveAndRotate != null)
            {
                moveAndRotate.Initialize(moveSpeed, rotateSpeed, transform.forward);
            }
        }
    }
}

MoveAndRotate.cs

このスクリプトは、Prefabオブジェクトにアタッチされ、オブジェクトの自転と直進を制御します。

using UnityEngine;

public class MoveAndRotate : MonoBehaviour
{
    private float moveSpeed;
    private float rotateSpeed;
    private Vector3 moveDirection;

    public void Initialize(float moveSpeed, float rotateSpeed, Vector3 moveDirection)
    {
        this.moveSpeed = moveSpeed;
        this.rotateSpeed = rotateSpeed;
        this.moveDirection = moveDirection; // 発射時の方向を保存
    }

    void Update()
    {
        transform.Translate(moveDirection * moveSpeed * Time.deltaTime, Space.World); // 発射時の方向に移動
        transform.Rotate(Vector3.up, rotateSpeed * Time.deltaTime); // 自転
    }
}

設定手順

  1. Prefabの設定
    • UnityエディタでPrefabを選択します。
    • MoveAndRotateスクリプトをPrefabにアタッチします。
  2. Spawnerオブジェクトの設定
    • 空のGameObjectを作成し、RotatingObjectSpawnerスクリプトをアタッチします。
    • インスペクタで、Object To InstantiateフィールドにPrefabオブジェクトをドラッグします。
    • 必要に応じて、Move SpeedRotate Speedの値を設定します。
  3. ゲームの実行
    • ゲームを実行し、スペースキーを押すと、Prefabオブジェクトがスクリプトがアタッチされたオブジェクトの方向に向かって発射され、自転しながら直進します。

解説

  • RotatingObjectSpawnerスクリプトは、指定された位置と回転でPrefabオブジェクトをInstantiateし、MoveAndRotateスクリプトを通じて移動と回転のパラメータを設定します。
  • MoveAndRotateスクリプトは、オブジェクトが自転しながら直進する動作を実現します。Initializeメソッドで移動速度、回転速度、移動方向を設定し、Updateメソッドでそれに基づいてオブジェクトを移動および回転させます。
  • Prefabオブジェクトに最初からMoveAndRotateスクリプトをアタッチすることで、RotatingObjectSpawnerスクリプトはInstantiateされたオブジェクトに対して必要な初期設定を簡単に行うことができます。

この構成により、オブジェクトが正しい方向に向かって自転しながら直進する動作が実現できます。

Unity

Posted by hidepon