🦁

【Unity】 RAYSER(V3)という視点変更をする3Dシューティングゲームを作ってみました

2022/05/28に公開

RAYSER(V3)について

一週間ゲームジャム「そろえる」でRAYSER(V3)という3Dシューティングゲームをリリースいたしました。RAYSERというゲームは昔テグザーというレーザーを駆使して敵を殲滅するゲームがあり、そのレーザーを再現してみたいと思い作り始めたゲームです。そこからボスの追加をRAYSER(V2)で行い、そこからストーリーなどを付与して展開によってビューを切り替えるシューティングゲームにしていきたいと思い、RAYSER(V3)を作り始めました。
https://unityroom.com/games/rayser_v3

ゲームの進行中の視点変更について

今回ゲームで一番力を入れたのがゲーム進行時のカメラの切り替えになります。RAYSER(V3)はゲームの進行状況に応じて、トップビュー、サイドビュー、フロントビューの3つの視点に切り替わります。

視点ごとのバーチャルカメラの切り替え

具体的にはCinemachineを導入して、トップビュー、サイドビュー、フロントビューの3つのバーチャルカメラを設定して、ゲームの進行状況に合わせてカメラを有効にすることで実現しています。
https://twitter.com/Cz_mirror/status/1522106503913775105?s=20&t=19tsGRr6CHJTtusqa_v2iw

エディタ上でのバーチャルカメラの設定

バーチャルカメラをエディタ上で設定しておき、各カメラのPriorityを調整しておき、スクリプトで状況に応じてカメラのON・OFFを行うことで視点の切り替えが簡単に実現することができました。

フロントビューカメラの設定

ゲーム開始時はフロントビューのカメラのみを有効にしておき、Priorityは他のカメラよりも低めの8などにしておきます。

トップビューカメラの設定

トップビューのカメラはPriorityを10にして、無効にしておきます。

切り替えたいタイミングでトップビューのカメラを有効にすると、トップビューのカメラが優先されてトップビューに切り替わります。

サイドビューカメラの設定

サイドビューのカメラも同様に、事前にPriorityを調整しておき、有効・無効を切り替えることでサイドビューへの切り替えも可能です。

カメラ切り替えのスクリプト

以下一部カメラ操作の処理を抜粋したものになります。
ゲームのイベントに合わせて、カメラの有効・無効を行うことで先ほどの様な視点変更が実現できます。

    public class EventPlayerMove : MonoBehaviour
    {
        /// <summary>
        /// Cinimacihne用メインカメラ
        /// </summary>
        [SerializeField] private GameObject MainCamera;

        /// <summary>
        /// バーチャルカメラ上部
        /// </summary>
        [SerializeField] private GameObject VirtualCameraTop;

        /// <summary>
        /// バーチャルカメラ側部
        /// </summary>
        [SerializeField] private GameObject VirtualCameraSide;

        /// <summary>
        /// バーチャルカメラ背後
        /// </summary>
        [SerializeField] private GameObject VirtualCameraBehind;

        /// <summary>
        /// ゲーム開始時の自機の位置
        /// </summary>
        [SerializeField] private Vector3 gameStartPosition = new Vector3(1000, 100, 0);

        /// <summary>
        /// ゲーム開始時の自機の目標位置
        /// </summary>
        [SerializeField] private Vector3 gameStartPositionGoal = new Vector3(0, 100, 0);

        /// <summary>
        /// ゲーム開始地点までの移動時間
        /// </summary>
        [SerializeField] private float gameStartTime = 3f;

        /// <summary>
        /// ゲーム開始時
        /// </summary>
        private void GameStartMove()
        {
            gameObject.transform.position = gameStartPosition;
            VirtualCameraTop.SetActive(false);
            VirtualCameraSide.SetActive(false);
            transform.DOMove(gameStartPositionGoal, gameStartTime)
                .OnComplete(() => GameStartEventEnd())
                .Pause()
                .SetAutoKill(false)
                .SetLink(gameObject)
                .Restart();
        }

        private void GameStartEventEnd()
        {
            VirtualCameraTop.SetActive(true);
            MessageBroker.Default.Publish(new GameStartEventEnd { EventEnd = true });
        }

    }

こちらを応用することでボス戦ではトップビューよりも若干斜めの視点にしたりすることで奥行きをだしたりしています。

ソースコード

noteでRAYSER(V3)のソースコードについての記事を公開しています。
https://note.com/cz_mirror/n/nab02963f8425

Discussion