Programming Serendipity

プログラミングを中心に種々雑多に書き留めます

Unityでコードの自動生成

みなさんは、シーン名の指定をするときにどうしてますか。直接文字列で指定するのがよくあるパターンですが、この場合、主に2つの問題点があります。

  • タイプミスによりシーン名の指定を間違えても、実行するまでエラーに気づかない
  • シーンの設定が変わるなどでその名前のシーンがもはや存在しないとき、やはり実行するまでエラーに気づかない

これを解決するためには、文字列を定数化したいことろですが、それを修正のたびに行うのは非現実的です。それこそ、手作業のリスクがそのまま残ってしまいます。

そこで、それらを自動生成することを考えます。続きからどうぞ。

リポジトリを見てもらうのが早いでしょう。こちらです。

github.com

このプロジェクトを開くと自動的に文字列定義が生成されます。(シーン名以外にも) これにより、いままで実行時に発生していたエラーをコンパイル時に検出できるようになります。

いくつか実装する中で気づいた点を解説します。

  • InitializeOnLoad属性を指定することでstaticコンストラクターがEditorのロード時に呼ばれます。
  • AssetDatabase.FindAssetst:から始まる文字列を渡すと、アセットのタイプでの検索になります(これは、スクリプトではないエディタ上でも可能な操作です)
  • エディタ上でAnimatorを取得するにはRuntimeAnimatorController ではなく UnityEditor.Animations.AnimatorControllerだそうです。
  • レイヤー名などの類は全体的に記号が使えるので、それをコードに落とし込むにあたってエスケープが必要だったので、今回はアンダーバーに置き換えました
  • InputManager.assetの情報にスクリプトからアクセスできないので、仕方がないので直接読み込んで情報取得しました

というか調べているうちに気づいたんですが、タグ名のスラッシュがシェーダーと同じようにフォルダ構造を表すんですね…。初めて知りました。 いつかこういう自動生成すらも不要になるくらいUnityが進化する日が来てほしいと願いながら。