矢印の回転と発射の技術資料

この資料では、Unityを用いて、矢印をマウスの方向に回転させ、その矢印の向きに基づいてオブジェクトを発射する方法について解説します。特にベクトルの正規化を使用し、発射の方向を一定に保つための方法に焦点を当てています。

1. 目的

この技術資料の目的は、ベクトルの正規化がどのように動作するかを理解し、オブジェクトの回転および発射処理にどのように適用できるかを学ぶことです。また、発射物の物理挙動を制御する基本的な手法を提供します。

2. 前提条件

  • Unityの基本操作
  • 2D物理エンジンに関する基本知識
  • 初歩的なC#スクリプトの理解

3. 環境設定

  1. Unityプロジェクトの作成
    Unity Hubを使用して新しいプロジェクトを作成します。テンプレートとして「2D」を選択します。
  2. スプライトの準備
    矢印と発射する球のスプライトを準備し、それぞれのオブジェクトに割り当てます。
  3. シーンの設定
  • 矢印のオブジェクト(例: long_head_right_green_arrow)を作成します。
  • 矢印の先端に球が発射される位置(例: ShootPosition)をTransformとして配置します。

矢印の回転軸をスプライトエディターを使って、左にずらしています

4. スクリプトの説明

スクリプトファイル: ArrowController.cs

using UnityEngine;

public class ArrowController : MonoBehaviour
{
    public GameObject circlePrefab; // 発射する球のプレハブ
    public Transform spawnPosition; // 球の発射位置
    private Vector3 arrowDirection; // 矢印の方向

    public float initialVelocity; // 発射の初速
    private bool isAngleLocked = false; // 角度が固定されたかどうかを管理

    void Update()
    {
        if (!isAngleLocked)
        {
            RotateArrowToMouse(); // マウスの方向に矢印を回転させる
        }

        if (Input.GetMouseButtonDown(0)) // 左クリックで角度を確定
        {
            isAngleLocked = true;
        }

        if (Input.GetKeyDown(KeyCode.Space)) // スペースキーで球を発射
        {
            ShootCircle();
        }
    }

    // 矢印をマウスの方向に回転させる
    void RotateArrowToMouse()
    {
        Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mousePosition.z = 0f; // z軸を無視して2D座標系で計算する

        Vector3 direction = mousePosition - transform.position; // 矢印の位置とマウスの位置の差
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; // 角度をラジアンから度に変換
        transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle)); // 矢印を回転させる

        // 正規化して矢印の方向を決定
        arrowDirection = direction.normalized;
    }

    // 球を発射する処理
    void ShootCircle()
    {
        GameObject circle = Instantiate(circlePrefab, spawnPosition.position, Quaternion.identity); // 球を生成
        Rigidbody2D rb = circle.GetComponent<Rigidbody2D>(); // 球にRigidbody2Dコンポーネントを取得
        rb.AddForce(arrowDirection * initialVelocity); // 正規化された方向に初速を掛ける
    }
}

5. 正規化について

ベクトルの正規化とは?

ベクトルの正規化は、そのベクトルの長さを1にする操作です。ベクトルの方向はそのまま維持されますが、長さが1に調整されます。この正規化が重要な理由は、オブジェクトを移動させる際に、一貫した速度で移動させることができるからです。

例: 正規化しない場合
もし正規化せずに矢印を回転させ、球を発射すると、矢印とマウスの距離によって速度が変わってしまいます。つまり、矢印とマウスの距離が遠いと球が速く発射され、近いと遅く発射されます。

正規化することで得られるメリット
矢印がどの方向を向いていても、一貫した初速度で球を発射できるようになります。これにより、動きが予測可能になり、ゲームのプレイ体験が向上します。

6. 球の発射

矢印の向きに基づいて球を発射するため、以下の処理が行われます:

  • 発射位置の決定
    球は矢印の先端に配置されます。発射位置は、矢印の位置に基づいています。
  • 力の加算
    Rigidbody2Dを使って球に力を加え、矢印の方向に発射します。この力の方向は、前述のベクトルの正規化によって一貫しています。

7. 実行と確認

  1. ArrowControllerスクリプトを矢印オブジェクトにアタッチします。
  2. circlePrefabとして発射する球のプレハブを指定し、spawnPositionに矢印の先端の位置を指定します。
  3. プレイモードで動作を確認し、マウスに従って矢印が回転し、スペースキーで球が発射されることを確認します。

8. まとめ

この技術資料では、ベクトルの正規化がどのように矢印の回転や球の発射に役立つかを説明しました。正規化することで、矢印の方向に基づいてオブジェクトを一貫した速度で発射することが可能になります。また、簡単な回転と発射の実装を通じて、2Dゲーム開発における基本的な物理挙動の理解を深めることができました。

9. 次のステップ

このシステムをさらに発展させて、発射物の重力や反射、複数のオブジェクトの管理など、さらに高度な機能を実装することができます。

Unity

Posted by hidepon