Quantcast
Channel: KLab Engineer Advent Calendarの記事 - Qiita
Viewing all articles
Browse latest Browse all 25

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

$
0
0

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

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

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

(なげぇ

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

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

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

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

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

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

使い方

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

https://github.com/luckin403/editor-play-starter/blob/master/Assets/Product/Script/Editor/EditorPlayStarter.cs#L40-L55

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

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

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

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

https://github.com/luckin403/editor-play-starter/blob/master/Assets/Product/Script/Editor/EditorPlayStarter.cs#L23-L34

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にアタッチします

https://github.com/luckin403/editor-play-starter/blob/master/Assets/Product/Script/BaseEntry.cs#L7-L13

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暴発を防いでいます

使ってみて

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


Viewing all articles
Browse latest Browse all 25

Trending Articles