【Unity】2Dシューティングを作る ~シーンの切り替え~

Unityでシーンの切り替え unity

プレイするゲームがないなら、自分で作ればいいじゃない!

ということで初心者が Unity を使って「ゲームを作る」ゲームをやっていきます!

今回は「シーンの切り替え」の記事です

 

スポンサーリンク

内容

「タイトル⇒ゲームメイン」のように

シーンからシーンの切り替えを実装していきます

 

シーンを作成

アセットにシーンを作成します

Unityでシーンを作成
今回はTItleSceneを追加

 

シーンを追加

シーンの追加は「ビルド設定」から行います

Unityでビルド設定を開く

 

ビルド設定

プロジェクトビューから

追加したいシーンをドラッグアンドドロップ

ビルド設定でシーンの追加

※タイトルなどの起動時に実行したいシーンは1番上にしておくといい

 

作成したシーンの編集

今回はタイトルのシーンを作成したので

タイトルの画像を用意しました

これをシーンに配置して、C#スクリプトをアタッチします

透過もできてない変な画像に…

 

※画像がない場合は空のオブジェクトを作成して、C#スクリプトをアタッチする

 

スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Title : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            // コルーチン開始
            StartCoroutine(LoadScene());
        }
    }

    // シーンをロードする(非同期)
    IEnumerator LoadScene()
    {
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SampleScene");

        // ロードがまだなら次のフレームへ
        while (!asyncLoad.isDone)
        {
            yield return null;
        }
    }
}

 

using UnityEngine.SceneManagement;

SceneManager を書きやすくするための1文

この1文がない場合は「UnityEngine.SceneManagement.SceneManager.~」

と書かなければならない

 

StartCoroutine(LoadScene());

コルーチンを実行する

コルーチンについては後述

 

SceneManager.LoadSceneAsync(シーン名 or シーン番号);

シーンを非同期でロードする

AsyncOperation を返し、isDone が true になったら

ロードが完了し、シーンが切り替わる

 

SceneManager.LoadScene(シーン名 or シーン番号);

今回は使っていないが

これでもシーンを同期でロードし切り替えることができる

ロードの時間分、動作が停止してしまうため

LoadSceneAsync の使用が推奨されている

 

実行すると

キー押下でタイトルからゲームメインに切り替わりました!

 

コルーチンについて

雑に説明すると

「少し機能が追加された関数=コルーチン」

IEnumerator 関数名(~) でコルーチン実行が可能になる

 

処理を一旦止められる

コルーチンは処理を一時中断して、その続きから処理を再開することができる

今回の処理で言うとロードが完了するまで

whileの中身を1フレームに1回処理しています

 

yield return null;

この処理が走ると、処理を中断して

次のフレームで Update 関数がすべて呼び出された後に処理を続行する

 

yield return new WaitForSeconds(float seconds);

この処理が走ると、指定した秒数の間処理を中断して

Update 関数がすべて呼び出された後に処理を続行する

 

yield return new WaitForFixedUpdate();

この処理が走ると、処理を中断して

すべてのスクリプトで FixedUpdate 呼び出された後に処理を続行する

 

他にもありますが、詳しくはこちら

 

これだけでは使い方がピンとこないですが

重要な要素っぽいので積極的に使っていこうと思います

 

サンプル動画

タイトル、ゲームメイン、ゲームオーバーのシーンを作り

「タイトル⇒ゲームメイン⇒ゲームオーバー⇒タイトル」

と遷移するようにしてみました!

 

さいごに

シーンの切り替えというより、コルーチンがメインになってました(笑)

次はタイトル画面を改良する予定です

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
unity
スポンサーリンク
シェアする
かれいどブログ

コメント