しがないエンジニアのブログ

技術的な内容をメモ代わりにつらつら

[Unite2018] Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session84

講演者

Florian Andreas Gantzert (KLab株式会社)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan002/unite-2018-tokyounity-ui

概要

  • UI
  • 結合
  • UIアゲイン
  • おさらい

内容

  • UI
    • ビジュアルでUIを作れる(uGUI)
    • にも関わらずプログラマがUIを作るケースが多い
    • よくするための鍵は? → 結合
      f:id:turgure:20180702091757j:plain
      f:id:turgure:20180702091806j:plain


  • 結合
    • 定義
      • 一方の偏光によって他方の変更が必要になる
      • Aを変更したらBも変更しなくてはいけない
    • 密結合
      • 結合している状態
    • 疎結合
      • 結合していない状態
    • 結合レベル
      • 結合はコードの話だけではない
      • コードの結合が、データとワークフローの結合につながる
        f:id:turgure:20180704085842j:plain
    • 結合と抽象化
      • 疎結合抽象化で実現させる
      • 抽象化
        • × 汎用化、一般化
        • 縛りのないシンプルな抽象化が望ましい
    • 結合バランス
      • 疎結合にバランスがある
      • 結合のバランスがプロジェクト規模に依存する
      • 問題点
        • 孤立しているタスクのはずが
          • 巨大化
          • 副作用が発生
          • 対応が複雑化
      • バランスがずれてもまだ手遅れじゃない
      • バランスの鍵は分野相互間コミュニケーション


  • UIアゲイン
    • ワークフロー
      • 同時作業によるコンフリクトはありえる
      • ワークフロー上でそのコンフリクトを阻止できない
        • 違うレベルで阻止する必要
      • データを分割してコンフリクトを阻止
      • コード上でその分割に対応
    • データ分割
      • UI専用のシーンを用意
      • UIシーンは他のゲームと連携
      • Unityのシリアライズ機能が使えない
      • UIシーンと他のシーンはどうやって連携させる?
        • MVC・MVVM
        • UnityEngine.ExposedReference<T>?
          • Timelineで利用される
          • ランタイム時にIDで参照を解決
          • ExposedReference<T>本体側でもルックアップテーブルIDを管理する必要
        • メッセージ・バス
          • 必要な情報だけメッセージとして抽象化、バスに飛ばす
          • バスの接続先でメッセージを処理
          • 発信元、接続先は互いの情報を知らなくていい
          • どのような情報を扱うか、どういうルールにするか
          • 発信源、接続先の差し替えでデザイナ向けのデバッグ機能の追加が容易


  • おさらい
    • 結合はコードの話だけではない
      • データとワークフローでも発生する
    • 規模とともに疎結合が必要になる
    • コードの結合はデータとワークフローの結合につながる
    • 疎結合の道は抽象化で開く
    • コードとデータの疎結合はよりよいワークフローにつながる
    • シーンを分けることでUnityにおける同時作業がやりやすくなる
    • メッセージ・バスで複数のシーンやロジックなどを疎結合的につなげる


  • おまけ
    • roll a ballの改造 中上級者向け
      • テストしたい
      • ML(Machine Learning)で動かしたい
        • →入力の抽象化
        • 入力情報を管理するinterfaceを作る
    • c#における抽象化
      • インターフェース化 ←ゲームはこっちのほうがいい?
        • 処理側がタイミングを決める
      • イベント化
        • 情報元がタイミングを決める
    • c#におけるイベント化
      • 言語レベルで対応している
        • delegate, event
      • Unity APIでも使われている
        • hierarchyChangedなど