みなさんは、シーン名の指定をするときにどうしてますか。直接文字列で指定するのがよくあるパターンですが、この場合、主に2つの問題点があります。
- タイプミスによりシーン名の指定を間違えても、実行するまでエラーに気づかない
- シーンの設定が変わるなどでその名前のシーンがもはや存在しないとき、やはり実行するまでエラーに気づかない
これを解決するためには、文字列を定数化したいことろですが、それを修正のたびに行うのは非現実的です。それこそ、手作業のリスクがそのまま残ってしまいます。
そこで、それらを自動生成することを考えます。続きからどうぞ。
リポジトリを見てもらうのが早いでしょう。こちらです。
このプロジェクトを開くと自動的に文字列定義が生成されます。(シーン名以外にも) これにより、いままで実行時に発生していたエラーをコンパイル時に検出できるようになります。
いくつか実装する中で気づいた点を解説します。
InitializeOnLoad
属性を指定することでstaticコンストラクターがEditorのロード時に呼ばれます。AssetDatabase.FindAssets
にt:
から始まる文字列を渡すと、アセットのタイプでの検索になります(これは、スクリプトではないエディタ上でも可能な操作です)- エディタ上でAnimatorを取得するには
RuntimeAnimatorController
ではなくUnityEditor.Animations.AnimatorController
だそうです。 - レイヤー名などの類は全体的に記号が使えるので、それをコードに落とし込むにあたってエスケープが必要だったので、今回はアンダーバーに置き換えました
InputManager.asset
の情報にスクリプトからアクセスできないので、仕方がないので直接読み込んで情報取得しました
というか調べているうちに気づいたんですが、タグ名のスラッシュがシェーダーと同じようにフォルダ構造を表すんですね…。初めて知りました。 いつかこういう自動生成すらも不要になるくらいUnityが進化する日が来てほしいと願いながら。