Amazonで商品を見るセール会場へ

Unityでシーンを切り替える方法|SceneManagerとUI画面の違い

別のSceneファイルへ移る場合はSceneManager、同じScene内でメニューを開く場合はUIの表示切替を使います。Animatorでパネルを動かしても、別のSceneは読み込まれません。ここではButtonからtop→homeへ移る最小のC#例を先に説明し、後半で同一Scene内のUIスライドを分けて扱います。

Scene登録はUnity 6.3のBuild Profiles、UIはuGUI 2.0の公式資料に照合しています。掲載画像12点は旧記事の資料で、現在のEditorで新しく撮影したものではありません。今回のコードのUnityコンパイル、Scene読み込み、Animator動作は未実施です。

目次

Sceneの読み込みとUI画面切替の違い

項目・症状設定・確認先
別のSceneへ置き換えるSceneManager.LoadSceneのSingle。最小例はtopからhomeへ。Scene内の通常オブジェクトも切り替わる。
現在のSceneを残して追加するLoadSceneMode.Additive。追加したCamera/EventSystem/UI、アクティブScene、アンロードを管理する。
同じSceneでパネルを開く・閉じるGameObject.SetActiveなど。別Sceneの読み込みは行わない。ボタンでUIを切り替える手順へ。
同じSceneでパネルをスライドするRectTransformをAnimationで動かす。後半のUI移動例。表示範囲と遷移条件を指定する。
画面を重ねてフェードするCanvasGroup/RenderTextureの記事へ。見た目の効果と読み込みタイミングを分ける。

1.topとhomeを作り、遷移先を見分けられるようにする

  1. 新しい検証用Sceneをtopとして保存します。Canvas内へButtonを作り、文字を「homeへ」にします。Canvas・EventSystem・利用する入力方式が揃っているか確認します。
  2. topを複製してhomeとして保存します。homeの背景や文字を変えて、遷移できたか見分けられるようにします。ファイル名のhomeとコードで渡す名前を揃えます。
  3. この例でボタン設定を行うのはtopです。複製したhomeに同じGameControllerやOnClickを残すと、homeを再ロードする構成になるため、home側の不要な登録を外します。
  4. Scene名が同じファイルを別フォルダーに作った場合は、名前だけでは区別できません。最小例は重複名を避け、必要な場合は公式APIで指定できるパスを確認します。

次は旧記事のScene作成画面です。新しいUnity 6.3の画面ではありません。

保存したシーンを複製し名前を変更してボタンテキストや背景色を変えた状態。

2.Unity 6.3のScene Listへ登録する

  1. File → Build Profilesを開き、使用するplatform profileまたはbuild profileを選びます。PlatformのScene Listは既定で表示されます。
  2. 個別build profileへ独自のScene Listを追加する場合は、Add Settings → Scene Listを選びます。Scene Listを追加していないbuild profileはglobal scene listを使うため、どちらのリストを使っているかを先に確認します。
  3. Projectからtopとhomeを使用するScene Listへ登録し、両方のチェックが有効でビルド対象になっていることを確認します。topを最初にして開始Sceneを決めます。
  4. 名前で読むこの最小例にhomeの固定indexは必要ありません。index指定を使う場合は使用するリストの順番を控え、Sceneの追加・除外・並べ替え後に再確認します。

参照したUnity 6.3のScene List公式資料は、このAdd Settingsの手順を説明しています。旧版や別版のOverride Global Scene Listという欄を、そのまま6.3の操作名として置き換えないようにしてください。

次の2画像は旧Build Settings/Scenes In Buildの登録資料です。Unity 6.3では上の手順へ読み替え、画像の欄を探すだけで止まらないようにします。

Build Settingsを開いてScenes In Buildの枠内へ作成した2つのシーンをドラッグアンドドロップして登録する様子。
ビルド設定画面の枠内へ作成した2つのシーンを登録する操作。

3.GameControllerをButtonのOnClickへ登録する

GameController.csを作り、次の既存の最小コードを保存します。ファイル名とクラス名をGameControllerに揃え、ConsoleにC#エラーがない状態にします。この例はLoadSceneでhomeを指定し、引数を受け取らないpublic voidメソッドをButtonへ登録します。

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

public class GameController : MonoBehaviour
{
    public void toGameScene()
    {
        SceneManager.LoadScene("home");
    }
}
  1. topのHierarchyに空のGameObjectを作り、GameControllerと名付けます。保存したGameController.csをアタッチします。Project内のスクリプトファイル自体と、Hierarchyのコンポーネント付きオブジェクトを区別してください。
  2. ButtonのOn Click()で+を押し、HierarchyのGameControllerをObject欄へ入れます。関数はGameController → toGameScene()を選び、同じイベントを重複登録しないようにします。
  3. topからPlayを開始し、Buttonをクリックします。期待する結果はhomeの背景や文字に変わり、Sceneがhomeへ置き換わることです。Consoleエラーが出た場合は、その内容を控えて後述の確認順へ進みます。
  4. Editorの確認後は、使用するprofileでビルドしたアプリでも遷移を確認します。EditorでSceneを開けることだけでは、ビルド対象のリストへ登録できている確認になりません。

以下は旧記事のコンポーネントと遷移GIFです。上の操作を今回実施した証拠ではありません。

作成した空のオブジェクトにスクリプトをアタッチした状態。
ボタンをクリックしてシーンが遷移する様子。

この最小コードにローディング画面、連打抑止、エラー回復、戻る操作、フェード待ちは含まれません。Buttonが一度反応する構成を先に確認し、実際のゲームでは読み込み中の操作と失敗時の復帰を追加してください。

LoadScene・LoadSceneAsync・Additiveの選び方

次の呼び出し断片はメソッド内で使うAPI例で、これだけをC#ファイルとして保存するものではありません。LoadSceneの公式資料では、読み込みは即時完了ではなく次の描画フレームで完了し、引っかかりを避けたい場合はLoadSceneAsyncを使うよう案内しています。

SceneManager.LoadScene("シーン名");

LoadSceneAsyncを選ぶ場合は、たとえばSceneManager.LoadSceneAsync("home", LoadSceneMode.Single)から返るAsyncOperationの完了を待ちます。非同期APIを呼ぶだけで、完了前の後続処理・連打・画面操作が管理されるわけではありません。この最小記事には、完成した非同期ローディングUIのコードや測定結果は掲載していません。

追加したSceneをアンロードする

SceneManager.UnloadSceneAsync(1);

この断片の1は「今のScene」ではなく使用中のScene Listのindexです。読み込まれていないSceneへ無条件に実行せず、Additiveで追加した対象と残すSceneを先に決めます。UnloadSceneAsyncの戻り値で完了を確認します。GameObjectの破棄とAssetのメモリー解放は同一ではなく、公式資料はAssetを別に扱うことも説明しています。

indexとAdditiveの呼び出し例

// 番号1のシーンに遷移
SceneManager.LoadScene(1);

// 現在のシーンを残したまま追加読み込み
SceneManager.LoadScene(1, LoadSceneMode.Additive);

Singleは通常のSceneを置き換え、Additiveは現在のSceneを残します。Additiveを使うだけで共通UIやポーズ処理が完成するわけではありません。重複CameraやEventSystem、どのSceneがアクティブか、どのSceneをアンロードするかを決めてください。現在のindex+1で次へ進む場合も、最後のSceneや除外Scene、並べ替えの条件を確認します。次の画像は旧例の資料です。

シーン番号の加算による遷移処理の記述例。

旧記事の参考リポジトリは補助資料です。ここで示した現行手順との一致や、同じ環境での動作を新たに確認したものではありません。

同じScene内のUIをスライドする場合

ここからはSceneManagerを使わず、同じSceneの2画面をAnimationで移動する構成です。旧画像は当時の例として保持します。現在の説明では、常に有効なPanelsRootの下にView1/View2を並べ、移動用クリップを往路・復路で別に作ります。旧例のSpeed=−1だけで逆再生する設定へ依存しません。

RectTransformと表示範囲

  1. Canvas内にUIViewportを作り、表示領域を決めてRectMask2Dを追加します。PanelsRootを子にし、AnchorsをMin(0,0)/Max(2,1)、offsetMinとoffsetMaxを0にします。LayoutGroupでこのRectTransformを別に制御しない構成にします。
  2. PanelsRootの子にView1とView2を作ります。View1はMin(0,0)/Max(0.5,1)、View2はMin(0.5,0)/Max(1,1)、両方の余白は0。各Viewに背景と移動用Buttonを配置します。
  3. View1を見せるPanelsRootのアンカーはMin(0,0)/Max(2,1)、View2を見せる位置はMin(−1,0)/Max(1,1)です。offsetは0を保持します。親の幅をWとするとRoot幅は2W、移動量は−Wという計算上の構成です。今回Unityで寸法測定した結果ではありません。

次は旧階層・Animationの3画像です。現在のUIViewport/PanelsRootという命名や設定を撮影したものではありません。

親階層に作成したオブジェクトを複製した構成。
キーフレームの設定とループ設定を外したアニメーションクリップ。

4つのAnimator状態を明示する

  1. UIViewportへAnimatorと専用Controllerを追加し、子PanelsRootのAnchor Min/Maxを記録します。View1Hold、ToView2、View2Hold、ToView1の4クリップを作り、すべてLoop Timeをオフにします。
  2. View1HoldはView1の位置、View2HoldはView2の位置を保持するキーにします。ToView2は0秒にView1位置、0.5秒にView2位置。ToView1はその逆を正方向のクリップとして記録します。両アンカーと必要なoffsetを揃え、記録後はRecord/Previewを解除します。
  3. AnimatorにView1、ToView2、View2、ToView1の4状態を作り、それぞれに対応クリップをMotionとして入れます。既定状態はView1、各Speedは1です。「3状態」と数えず、待機2+移動2に分けます。
  4. TriggerをGoView2とGoView1の2つ作ります。View1→ToView2はGoView2、View2→ToView1はGoView1をConditionsに指定し、Has Exit Timeはオフ、Durationは0にします。
  5. ToView2→View2とToView1→View1は移動後の遷移です。Conditionsを付けず、Has Exit Timeをオン、Exit Time=1、Duration=0にします。待機状態からTriggerなしで自動遷移する接続は作りません。
  6. View1のButtonはOnClickの対象をUIViewportにし、Animator.SetTrigger(string)へGoView2を指定します。View2のButtonも同じAnimatorを対象にGoView1を指定します。
  7. PlayでView1→View2→View1の位置・マスク領域・ボタン入力を確認します。遷移中の連打や途中キャンセルには別の入力管理が必要で、この最小Controllerだけで解決済みとはしていません。

以下の3画像は旧Animator設定と旧結果です。4状態・往復2クリップの現在の説明を実行した証拠ではありません。

Animatorウィンドウ内で右クリックしてCreate StateからEmptyを選択しステートを作成する手順。
アニメーションの割り当てとパラメーターや遷移条件を設定した状態。
ボタンをクリックしてアニメーション付きで画面表示が切り替わる様子。

シーンが読み込めない・ボタンが反応しない場合

項目・症状設定・確認先
Sceneが登録されていないというエラーhomeの綴り、保存済みのSceneファイル、使用するprofile/globalのScene List、チェックの有効状態を確認。
OnClickにtoGameSceneが出ないConsoleのC#エラー、GameController.csとclass名、コンポーネントの付いたHierarchyオブジェクト、public voidメソッド、対象のOnClickを確認。
Buttonが押せないEventSystemと入力方式に合う入力モジュール、CanvasのGraphicRaycaster、上に重なるGraphicとCanvasGroupのRaycast設定を確認。
homeに移っても同じ画面に見える背景/文字を変えたか、複製したSceneやButton登録が同じままか、Hierarchyとロード対象を確認。
indexで別Sceneへ移る現在使うScene Listの順を確認。別profileや並べ替えでindexが変わる条件を固定しない。
AdditiveでCameraやUIが重なる読み込んだSceneと共通Sceneの役割を確認。重複するCamera/EventSystem・アクティブSceneとアンロード対象を整理。
UIが移動しない・戻れない4状態のMotion、Triggerの綴り、往復クリップの両アンカー、offset、Exit Time、LayoutGroupとの競合を確認。

掲載コードの記事用リポジトリは別保存先の旧例です。現在のBuild ProfilesやUI構成まで含む検証済みプロジェクトを配布しているとはしていません。技術仕様はLoadSceneAsyncとAnimation transitionsの対象版資料で確認してください。

Unityの基礎と学習の記事は、ほかにもあります。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Unityのおすすめ書籍

開発PCの選び方

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次