LoginSignup
17
17

More than 5 years have passed since last update.

【Unity】Unite 2015「Unityプロジェクトをひも解き把握するには」レポート

Last updated at Posted at 2015-04-23

レポート一覧

講演ファイル

プロジェクトをさくっと読む方法の紹介

  • なぜこんなのが必要になったのか
    • バグレポートの構造解析のため
    • サンプルシーンの解析のため
    • コード書くのが面倒でリソースの再利用を簡単にするため
      • 昔作ったプロジェクトの再利用は難しい

Unityの構造

  • プロジェクト
    • シーン
      • オブジェクト
        • コンポーネント
  • オブジェクトとコンポーネントがいろいろと動いてシーンを構成する

プロジェクトの構造

  • プロジェクトは複数のシーンを持つ
  • シーンは複数のオブジェクトを持つ
  • オブジェクトは複数のコンポーネントを持つ
  • コンポーネントは複数のアセットへの参照を持つ

コンポーネントはコールバックで動作する

  • Start
  • Update
  • FixedUpdate
  • OnColliderEnter
  • etc.

オブジェクトが動かない条件

  • 非アクティブ
  • コンポーネントを持たない
  • 参照もコールバックもない

オブジェクトへメッセージを送信する方法

  • SendMessage
  • BroadcastMessage
  • SendMessageUpward
  • AnimationEvent
  • UnityAction
  • EventSystem.Execute
  • Invoke
  • StartCoroutine

コンポーネントへメッセージを送信する方法

  • メソッドの呼び出し
  • event
  • UnityEvent
  • StartCoroutine

参照の構築方法

  • GetComponent
  • GetComponentInChildren/Parent
  • FindWithType
  • FindWithTag
  • public/SerializeFieldの変数をシーンで設定
  • AddComponentでコンポーネントを追加

オブジェクトを作る方法

  • Instantiate
  • LoadLevel
  • LoadLevelAdditive
  • new GameObject()

オブジェクトの元を得る方法

  • Resources.Load
  • AssetBundle.Load
  • Prefab

コールバックの種類

  • OnCollider/OnTrigger
    • 判定に使用される
  • OnMouse...、uGUIのコールバック
    • 入力に使用される

コンポーネントの列挙方法

  • シーン内にあるオブジェクト情報からコンポーネント一覧を取得し、
    コンポーネント一覧からコールバック一覧を取得する必要がある
  • リフレクションを使用する

文字列のメソッドコールの方法

  • 任意のメソッド名で呼ばれる
  • AnimationEvent
  • SendMessage
  • uGUIのEventSystem(シリアライズ)

コンポーネントの参照先の確認方法

  • Inspectorで確認可能
  • privateな物もdebugモードで確認可能

コンポーネントの参照元の確認方法

  • 無理

コンポーネントの依存関係の確認方法

  • シーン内のコンポーネント一覧から
    特定のコードを持つコンポーネントを取得
    MonoScriptでMonoBehaviourのコード取得

参照関係をグラフ化するツールを作成したい場合

  • dotやgmlといったフォーマットを活用する
  • コード解析がなければ正規表現で頑張る

マネージャー系オブジェクト

  • オブジェクト総数が一つでコンポーネントの参照が多い場合、
    マネージャークラスの確率が高い
  • マネージャーは大体シングルトン
  • 役割はさまざま
  • どちらかといえば外部からのメッセージで動くことが多い

ギミック系オブジェクト

  • コライダーなどで自己完結するオブジェクト
  • 他のオブジェクトに対する参照はあまりない
  • トリガーやアクションをマネージャーに通知するタイプもある
  • ステージを作る系のゲームによく見る

Updateやコルーチンで自発的に動くオブジェクト

  • メインオブジェクト
  • 多くの参照を集めているタイプで多く存在する
  • この手のオブジェクトはコードベースで動くため、コードを呼んで処理を追跡する

そのオブジェクトはどうやって参照されたのか

  • コードを追うより実際に参照させると楽

参照関係を把握する

  • 自分で動くか管理されるかの2択
  • 被参照が1つの場合、管理されている可能性がある
    • 大体マネージャー
  • 被参照が多い場合、自分で動く可能性が高い
    • 大体ギミック

検索パターン

  • ユニークなタグを持つ場合、FindWithTagで検索される
  • 親子関係の場合、親子関係で検索される
  • 名前で検索される場合もある

対マネージャー

  • コンポーネントがマネージャーに自分自身を登録する方法と
    マネージャーがコンポーネントを探す方法の2種類がある

なぜ参照を持つのか

  • 検索のキャッシュ
  • 対象の位置を得るため
  • 対象のコンポーネントの情報を得るため
  • メッセージングのため

生成コードの検索

  • シーン内に最初から配置されているか
  • シーン内でオブジェクトを生成するコードを検索する
  • ResourcesやAssetBundleなどの処理はラッピングされて
    独自に管理機能を持つケースが多い
    • その場合はラッパークラスを探す

該当のプレハブを持つシーンを探す

シーン(YAML)をGREP検索

  • メタデータ
  • シーンのフォーマットをYAMLに変換し、Grep検索
    • オブジェクト名は見つかる
  • あとはシーンをロードするコードを探す

UnityYAMLMerge

まとめ

  • シーンが持つコンポーネントを知る
  • オブジェクトの役割と参照関係を知る
  • オブジェクトが作られる条件を知る
  • コンポーネントの動くタイミングを知る
  • コンポーネントの接続方法を知る
  • オブジェクトの動きを把握すると大体シーンの構造がわかる
17
17
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
17
17