4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KLab EngineerAdvent Calendar 2018

Day 8

Unityの各シーンをモックデータで再生してくれる君

Posted at

この記事は KLab Engineer Advent Calendar 2018 の8日目のエントリです。

はい。前日まで何も準備できてなかったほっへんです。
Unity2018のこと書くとかいいながら今回はUnityでプロジェクト開発した際に作ってみて便利だったツールを紹介します

その名もUnityの各シーンをモックデータで再生してくれる君

(なげぇ

え?普通にシーンのPlayボタンを押せばよくね?って思ったあなた。甘いです!

https://github.com/luckin403/editor-play-starter
(サンプルもあるよ!

どういうケースで使えるの?

Unityでプロジェクト開発をする場合、当然APIサーバを用意する訳ですがサーバ側の実装が終わってなかったり、初期化処理やログイン等の処理が最初のシーンにしかないあまりに以下ような経験を方もいらっしゃると思います

  • 自分が作ったシーンの動作を確認するためにいちいち最初のシーンから再生する必要があるのがめんどい!!
  • 自分のシーンを作ったはいいが遷移元のシーンがまだ実装中なので確認できない...
  • サーバ側の実装はまだなのでモックデータで動かしたいけど、つなぎ込み時モック消したり、ビルドされたバイナリにモックデータ(デバッグ用コード)が含まれてほしくない...
  • シーンの初期化処理はAwake/Startで行っているので、それより前にモックデータを注入したい

EditorPlayStarterはそれらの悩みを解決してくれます

使い方

まずは各データやプラグインの初期化処理、ログインリクエスト処理等を以下の箇所に記載します

EditorPlayStarter.cs
static void InitializeApp(Action loadMockDataScene)
{
    InitData();
    RequestLogin(loadMockDataScene);
}

static void InitData()
{
    // データを初期化したりー
}

static void RequestLogin(Action callback)
{
    // ログイン処理を行ったりー
    callback();
}

次に各シーンのモックデータの記述とシーンのロード処理を記述します
もしサーバの実装が完了している場合はここにHomeInfoを取得するために必要なリクエスト処理を記述します
ちなみに記述する場所はEditorスクリプトにあたるので__バイナリのビルド時には含まれません__!(ログインの箇所ももちろん同じ

EditorPlayStarter.cs
private static readonly Dictionary<string, Action> ReloadActionBySceneName = new Dictionary<string, Action>
{
    // ここにシーン名ごとのモックデータでのロード処理を書いてください
    {
        "Home",
        () =>
        {
            // モックデータ
            HomeSceneEntry.HofeInfo = new HomeInfo("プレイヤー名", "コメント", 99); // 今回は雑にstatic空間に...
            SceneManager.LoadSceneAsync("Home");
        }
    },
};

あとは↓のようなOnValidateを再生したいシーンの各HierarchyルートのGameObjectにアタッチします

void OnValidate()
{
    if (Application.isPlaying && UnityEditor.EditorPrefs.GetBool("MockReloadMode"))
    {
        gameObject.SetActive(false);
    }
}

あとはシーンを再生するだけ!

仕組み

EditorPlayStarterでは大きく2つのことをやっています

  1. UnityのPlayボタンを検知してシーンの再ロード処理を行う
  2. 再ロード直前に発火にするAwake/OnEnable/Startの暴発対策

1のPlayボタンイベントの検知についてはここを読んでもらえれば一目瞭然だと思いますので割愛

2のAwake暴発ですがこれは

  • OnValidateが__シーンが実行状態〜Awakeが発火するまでの間に唯一発火する__特殊なイベントであること
  • OnValidateイベントはEditor上でしか発火しないこと
    の2つの特性を使って、OnValidate時にGameObjectを非アクティブにすることでAwake暴発を防いでいます

使ってみて

プロジェクト初期開発時は各シーンが各プロジェクトメンバーによって並列で実装されるのでかなり便利だった印象です
またゲーム画面でありがちなインゲームのリザルトシーンは挙動を逐一確認するためにインゲームパートを終わらせなければいけないところをいろんなパターンのモックデータを用意することで素早く確認サイクルが回せた点も良かったと思います

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?