Unityではシーン(Scene)を切り替えて画面遷移を行うのが一般的です。しかし、私が開発しているアプリ「MinuteMind」では、シーンを分けずに1シーン&1Canvas構成とし、その中に複数のPanelを用意して表示切り替えを行う方式を採用しています。
この記事では、Unityの一般的なシーン管理の考え方から、MinuteMindでこの設計にした理由、実装上の工夫について紹介します。
Unityにおけるシーンの基本
Unityでは、ゲームやアプリの画面(タイトル、ゲーム、設定など)をそれぞれ別のScene(.unity)ファイルとして管理し、SceneManager.LoadScene()
などで画面遷移させる設計が主流です。
ただし、シーンをまたぐと状態がリセットされるという特徴があるため、状態の引き継ぎが必要な場面では注意が必要です。
状態維持が必要なアプリではシーン遷移がネックになる
たとえば、MinuteMindに実装しているポモドーロタイマーは、「どの画面にいてもカウントダウンが継続している」ことが重要です。
しかし、シーン遷移を使ってしまうと、タイマーの状態がリセットされたり、別途状態管理用のシングルトンやDontDestroyOnLoad()
のような仕組みが必要になり、実装が煩雑になってしまいます。
あえて「1シーン+1Canvas+Panel切り替え」にした理由
🎯 理由①:状態を維持しやすい
1シーン構成にしておけば、タイマーやその他の内部状態をそのまま保持したまま画面を切り替えることができます。これはシンプルかつ確実な方法です。
🎯 理由②:どの端末でも綺麗に表示できるようにしたかった
MinuteMindではCanvasを1つに統一し、その中にMainPanel
、StatisticsPanel
、SettingPanel
などを置いています。これは、Canvasのスケーリング設定(例:CanvasScaler
)を1つにまとめることで、実機の端末サイズに依存せずUIを綺麗に表示するためです。
複数Canvas構成だと、スケーリングがずれて表示が乱れることがあり、それを防ぐ意図があります。
実装概要:Panelの切り替えによる画面遷移
各画面はPanel単位で作られており、SceneController.cs
にて表示・非表示を制御しています。
public void ShowStatisticsCanvas()
{
mainCanvas.GetComponent<CanvasGroup>().alpha = 0;
mainCanvas.GetComponent<CanvasGroup>().blocksRaycasts = false;
statisticsCanvas.SetActive(true);
settingCanvas.SetActive(false);
}
この処理がしていること:
mainCanvas
(=メイン画面のPanel)を非表示にするalpha = 0
にすることで見えなくなり、blocksRaycasts = false
にすることでUI操作も無効にしている
statisticsCanvas
(統計画面)を表示settingCanvas
(設定画面)を非表示
つまり、「統計画面を表示するために、他のPanelをすべて非表示にしている」という動作です。
このように、Panel単位での表示制御を行うことで、タイマーなどのコア機能に影響を与えることなく、柔軟な画面切り替えが可能になります。
メリットと注意点
メリット
- 状態を保ったままUI切り替えが可能
- CanvasScalerの影響を全画面で統一できる
- 複雑な状態管理が不要
⚠ 注意点
- すべての画面を1シーンに詰め込むため、UI構成が複雑にならないように管理が必要
- Panelごとのオブジェクト数が増えると、初期ロード時の負荷やパフォーマンスにも注意
まとめ
Unityではシーンを分けて管理するのが定番ですが、MinuteMindのように**「状態を維持し続ける機能」と「どの端末でもUIをきれいに表示したい」**という要件がある場合、1Canvas構成でPanelを切り替える設計は非常に有効です。
自分のアプリの特性やUI要件に合わせて、柔軟にシーン設計を考えてみるのがおすすめです。
コメント