Unityに関連する記事です

 シーン遷移を円滑にするための設計として、先のシーンを事前に読み込んでおき、準備が出来てから現在のシーンよりシーン遷移を行う機能について実装します。

 今回はタイトルシーンからメインのゲームシーンへの遷移を行い、メインシーンの読み込み時間が長いケースを想定しています。

 タイトルシーン内でメインシーンの読み込みを非同期処理で行い、読み込みが終了してからシーン遷移用のボタンを有効化することで、
ボタンを押したらすぐにメインシーンにシーン遷移できるように設計しています。


<実装動画>
動画ファイルへのリンク



事前準備を行う


 シーン遷移の実装になりますので、2つ以上のシーンを用意してください。
今回の例では、Title シーンと Main シーンを作成し、Title シーンから Main シーンへとシーン遷移させています。

 Title シーンにはゲームスタート用のボタンを1つ配置してください。


Sceneビュー画像


 以上で事前準備は完成です。


UniRx をインポートする


 UniRx アセットを利用していますので、アセットストアから UniRx のインポートをしてください。

Unity Asset Store
UniRx - Reactive Extensions for Unity
https://assetstore.unity.com/packages/tools/integr...


Title スクリプトを作成する


 ボタンの制御とシーン遷移を制御するためのスクリプトを作成します。


Title.cs

<= クリックすると開きます。



<AsyncOperation クラス>


 非同期処理であるコルーチンメソッド内で動作するクラスです。
主に次に説明をする LoadSceneAsync メソッドの戻り値として利用されており、非同期によるシーンの読み込み情報や、読み込みが終了したシーンへの遷移を一時停止したりする機能があります。
 

  private AsyncOperation async;

Unity公式スクリプトリファレンス
AsyncOperation
https://docs.unity3d.com/ja/current/ScriptReferenc...


<SceneManagement.SceneManager.LoadSceneAsync メソッド>


 SceneManager クラスのメソッドの1つです。シーン遷移を非同期処理として実行します。
戻り値は AsyncOperation 型になりますので、AsyncOperation 型の変数に代入することにより、読み込み状態の進捗を確認することが出来ます。


 // 非同期処理でシーンの遷移実行(現在実行しているシーンのバックグラウンドで次のシーンの読み込みを事前に行う)
  async = SceneManager.LoadSceneAsync(nextSceneName);

Unity公式スクリプトリファレンス
SceneManagement.SceneManager.LoadSceneAsync
https://docs.unity3d.com/ja/current/ScriptReferenc...


<AsyncOperation.allowSceneActivation 変数>


 AsyncOperation クラスの持つ bool 形の変数です。
非同期によるシーンの読み込み準備が完了したら、すぐに実行させるほか、
false に設定しておくことにより、シーンの読み込みが終了してもすぐにシーン遷移を実行せずに、
true に切り替えたタイミングでシーン遷移を送らせて実行する処理が実装出来ます。

 この変数はコルーチンメソッド内でしか動作しません。


 // 非同期処理でシーンの遷移実行(現在実行しているシーンのバックグラウンドで次のシーンの読み込みを事前に行う)
  async = SceneManager.LoadSceneAsync(nextSceneName);

 // シーンを読み込み終わってもシーン遷移は行わない状態にする
  async.allowSceneActivation = false;
 

 // 適宜なタイミングで以下を実行する

 // 非同期処理でシーンの遷移実行(現在実行しているシーンのバックグラウンドで次のシーンの読み込みを事前に行う)
  async.allowSceneActivation = true;


https://docs.unity3d.com/ja/current/ScriptReferenc...


Title スクリプトをゲームオブジェクトにアタッチして設定を行う


 空のゲームオブジェクトを Create Empty で作成し、Title スクリプトをアタッチします。
ボタンの情報を登録しておいてください。


インスペクター画像



 以上で設定は完了です。


ゲームを実行して動作を確認する


 ゲーム開始と同時にスタートボタンが押下できない状態になります。
その後、次のシーンの読み込みが完了した時点で、スタートボタンが押下できる状態になります。

 実際にスタートボタンを押してみてください。
すぐに次のシーンが開始されれば制御成功です。

 ヒエラルキーにおいても非同期で読み込んでいる次のシーンの情報を確認できます。


ヒエラルキー画像(Main シーンが (isLoading の状態で非アクティブとして読み込まれている))



<実装動画>
動画ファイルへのリンク




 以上で完成です。 

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます