2024年8月24日SHAREポストシェアはてブLINE目次シーン(Scene)とは既存のSceneクラス一覧Sceneの移動シーンのサンプルシーンの移動処理の動き。MZにおけるSceneとは、機能を集合させる場、及びUIの機能を操作する場だ。わかりやすく書くと各画面(タイトル画面・マップ画面など)を作る機能となる。オーディオ、グラフィック、UI、データベースを各所から引っ張り出し、そのシーンに合うように組み立てていく。プラグイン開発では既存のシーン更新の他に、既存とは全く異なる独自UIやゲームシステムを導入する場合に使用する。UnityのSceneと似たような意味合いだが、UIグループごとに1シーン作る点は異なる。理論上だが、新規シーンを作成することでカードゲームやオセロ、音ゲーなどどんなゲームも作成可能となる。イメージが湧きにくいので既存で用意されているシーンを紹介する。マップシーン(Scene_Map)タイトルシーン(Scene_Title)メニューシーン(Scene_Menu)戦闘シーン(Scene_Battle)代表的なシーンはこの4つだ。タイトルシーンではタイトルや背景の表示、各種コマンド選択処理など、マップシーンではキャラの移動やタイルの表示など、他APIでまとめている処理の呼び出しや簡単な処理を定義している。マップシーンで別マップに移動する場合、新たなマップシーンインスタンスを生成して移動する。その一方UIを定義するシーンは各画面ごとにScene_〇〇とクラスが定義してあり、該当のシーンを呼び出す。Scene_Menuのみ紹介したがScene_Save(セーブ画面)、Scene_Skill(スキル画面)など複数のシーンが定義してある。以下はコアスクリプトのrmmz_scenes.jsファイルに記載されているSceneクラスの一覧だ。各種シーンのスーパークラス。ゲーム実行直後に1回のみ呼び出される。戦闘画面やマップ画面で使用するヘルプメッセージやゴールド表示などの各種共通ウィンドウ設定。表を親子関係のみに絞ってクラス図にした。Sceneの移動シーンの呼び出し方法は主に3種類。//3.1つ前のシーンに戻るgoto全く別のシーンに移動する。前のシーンに戻ることが無い前提であり、現在以下のシーンはメモリから削除される。タイトル画面からマップ画面への移動、マップ画面から別のマップ画面への移動などで使われている。push今のシーンを現在の状態で画面を静止させたまま現在のシーンはメモリで確保しつつ、次のシーンへ移動する。前画面がそのまま残るため、前シーンの画面を消したりフィルターをかけたい場合は次シーンのcreateメソッドで処理を適宜記述する。マップ画面からメニュー画面への移動、マップ画面から戦闘画面への移動、メニュー画面からスキル画面、セーブ画面など各種別UI画面への移動などで使われている。poppushで移動したシーンを1つ戻す。戻した際、Scene_〇〇で保持している値はそのまま維持している。Aシーン→Bシーン→Cシーンと移動した後、Cシーンからpopした場合、Bシーンに戻る。再度BシーンからpopするとAシーンに戻る。gotoで移動した後はメモリが初期化するため、popで呼び出せなくなる。シーンのサンプル以下はSceneクラスを新規作成するプラグインのひな型だ。オーバーライドで使いそうなメソッドをピックアップしている。サンプルシーンの開始。//作業中フラグ、trueだとシーンチェンジが開始する。//作業中フラグ、trueだとシーンチェンジが開始する。}})();プラグインコマンドでシーンを呼ぶようにしているので、実行すると真っ暗な画面になれば成功だ。空の何も処理がないシーンとなる。Scene_〇〇はデフォルトが真っ暗な画面で、適宜必要に応じて修正していく。各処理の説明をしていく。initializeコンストラクタ。SceneManager.gotoなどの命令が実行された直後に呼び出される。クラス内の変数の初期化などを行う。create生成メソッド。initializeの次に実行する。画像、UIの描画などを行う他、初期化処理として必要だがinitializeではエラーになるような他クラスの生成・利用も行う。この処理の後、ローディング画面が表示される。isReady準備フラグ。createの次に発生しtrueになるとstartに移行する。デフォルトでは、画像やエフェクト、フォントのプリロードが終わったらtrueになる。他、プリロード対象を追加したい場合などはここで処理を加えると良い。start1フレーム目の処理。ローディング画面中に呼ばれるので前準備の中で重い処理はこちらで行うとよい。この処理が終了直後にローディング画面が外れる。update毎フレーム実行される処理。このメソッドで更新処理を行う。isBusySceneManager.pushなどで終了処理が走った際、まだ終了させないために利用しているフラグ。デフォルト(Scene_Base)だとフェード処理をしている間Trueになる。このメソッドがfalseにならない限りシーン移動は一時停止している。terminate終了処理。クラスの破棄などメモリのクリアを行う。以下はサンプルという文字を表示するプラグインだ。文字は方向キー押下でその方向に移動する。キャンセルボタンで前の画面に戻る。サンプルシーンの開始。//方向キー押下で文字を移動する。}})();単純なシーンだが、シーンクラスでできることは把握できると思う。RPGツクールのAPIの他、pixi5やJavaScriptのAPIを使えばどんな仕様でも実現できるクラスがこのScene_Baseを継承したクラスになる。シーンの移動処理の動き。シーンの移動・更新処理はSceneManegerのchangeScene、UpdateSceneに記載されている。以下はSceneManeger独自の動きについてはなるべく省き、SceneManagerのメソッドや変数の動きに注目すして2メソッドを読み解いた流れだ。イベントでSceneManager.gotoなどを実行すると即座にコンストラクタとしてinitializeが呼ばれる。その後、前シーンの終了処理を経て新シーンのcreateを実行する。create実行後にローディング画面が表示される。この段階では前シーンの破棄はしない。ローディング画面中にisReadyが呼ばれTrueになると次の処理に進む。ピクチャ・エフェクト・オーディオのプリロードが終わればTrueになるが、独自に処理を加えることもできる。isReadyがTrueになると次シーンの準備ができたと判断、前シーンのエフェクト処理と前シーンが破棄される。その後Startを実行する。Start実行後ローディング画面が終了する。この段階でSceneをpixiへ登録するため、これ以降はリアルタイムで画面表示に反映する。以降は毎フレームの更新処理となる。入力データ、エフェクトの更新処理が入った後、次画面への移動可否の確認。isStartedがtrueの場合、updateを実行する。isStartedは_startedがtrueになる場合にtrueとなるが独自に処理を続行してもよい。_startedはstart実行時からtrueになる。isStartedがfalseの場合はそのフレームでのupdate処理をスキップする。イベントでSceneManager.gotoなど次画面への移動が決定後、isBusyの判定を行う。フェード処理などすぐに次画面に移動すると違和感のある処理が終了するまでtrueとなるが独自に処理を続行してもよい。falseになることで次のterminateを実行する。フローチャートだと以下のようになる。関連リンク当サイトのRPGツクールMZプラグイン開発のトップページ。他の記事へのリンクをまとめている。変数・スイッチ・セルフスイッチ【RPGツクールMZプラグイン開発】この記事を書いた人さとゲームレビューブログを経て、好奇心のままにゲーム開発の沼に浸かった人。RPGツクールとUnityの忘備録を記していきます。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。【RPG...さとゲームレビューブログを経て、好奇心のままにゲーム開発の沼に浸かった人。RPGツクールとUnityの忘備録を記していきます。