(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



Unityエディタでプロジェクトを(初回)起動した時の判定【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加



この記事でのバージョン
Unity 2018.4.17f1


はじめに

今回はUnityエディタでプロジェクトを「(初回)起動した時に処理をしたい」場合の実装方法の紹介です。

なお同様の方法で、逆に「(初回)起動時だけは処理をしない」みたいな実装も可能です。


起動時

まず起動時に処理を行いたい時によく使われるのがInitializeOnLoadという属性です。



確かにInitializeOnLoadを使えば起動時に処理を実行する事は可能ですが、

プログラムを変更した後のコンパイル後や、エディタの再生時にまで実行されてしまいます。

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]//コンストラクタがエディター起動時等に呼ばれるようになる
public static class EditorStartupExample {

  static EditorStartupExample(){
    Debug.Log("起動したよ!");
  }
  
}
f:id:kan_kikuchi:20200305191941g:plain


なので、エディタ終了時・起動時に空になるTemp内に適当なファイルを設置し、

そのファイルが存在するかで起動時か判定すると、いい感じに実装出来ます。

Tempファイルはエディタ終了時・起動時に真っ白になるので、ここにファイルが無ければほぼ初回起動と見なして良いハズです。


具体的には以下のような感じ。

using System.IO;
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]//コンストラクタがエディター起動時等に呼ばれるようになる
public static class EditorStartupExample {

  //Tempに生成する、起動時の目印ファイルのパス
  private static readonly string TMP_FILE_PATH = "Temp/StartupLandmark";
  
  static EditorStartupExample(){
    //対象のファイルがあれば起動時ではない
    if(File.Exists(TMP_FILE_PATH)){
      Debug.Log("起動時じゃないよ!");
    }
    //対象のファイルがなければ起動時
    else {
     File.Create(TMP_FILE_PATH);//対象のファイル作成
      Debug.Log("起動時だよ!");
    }
    
  }
  
}
f:id:kan_kikuchi:20200317053431g:plain



初回起動時

場合によっては"初めて"プロジェクトを起動した時だけ処理をしたいみたいな場合もあると思います。

そんな時はEditorUserSettingsを使うのがオススメです。

そのプロジェクトのみかつ、各個人の設定を行いたい場合に使えると思います。


具体的には以下のような感じ。

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]//コンストラクタがエディター起動時等に呼ばれるようになる
public static class EditorStartupExample {

  //初回起動判定用のフラグをEditorUserSettingsに保存する時のKey
  private const string FIRST_STARTUP_KEY = "FIRST_STARTUP_KEY";
  
  static EditorStartupExample(){
    //EditorUserSettingsにフラグが設定されていなければ初回起動
    if (string.IsNullOrEmpty(EditorUserSettings.GetConfigValue(FIRST_STARTUP_KEY))) {
      EditorUserSettings.SetConfigValue(FIRST_STARTUP_KEY, FIRST_STARTUP_KEY);//初回起動フラグ設定
      Debug.Log("初回起動だよ!");
      return;
    }

    Debug.Log("初回起動じゃないよ!");
  }
  
}
f:id:kan_kikuchi:20200317054601j:plain



EditorStartupConfirmer

最後に起動判定を楽に行えるEditorStartupConfirmerというものを作ったのでこれもご紹介!



使い方は簡単、InitializeOnLoadを設定したクラスのコンストラクタで

EditorStartupConfirmer.CurrentStartupTypeを確認するだけ。

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]//コンストラクタがエディター起動時等に呼ばれるようになる
public static class EditorStartupExample {

  static EditorStartupExample(){
    //起動時の種類を確認
    switch (EditorStartupConfirmer.CurrentStartupType) {
      case EditorStartupConfirmer.StartupType.First:
        Debug.Log("初回起動時だよ!");
        break;
      case EditorStartupConfirmer.StartupType.NotFirst:
        Debug.Log("初回じゃない起動時だよ!");
        break;
      case EditorStartupConfirmer.StartupType.NotStartup:
        Debug.Log("起動時じゃないよ!");
        break;
      default:
        break;
    }
  }
  
}
f:id:kan_kikuchi:20200317060142j:plain