UnityでUI開発を高速化した件
御厨 雄輝
2019/07/24 Gotanda.unity #13
話すこと
• 自己紹介
• Kick-Flight
• UI開発高速化のために行ったこと(3点)
自己紹介
御厨 雄輝(みくりや ゆうき)
株式会社サイバーエージェント
2013年度入社
エンジニア
▼趣味
地下アイドル
ボルダリング
ポケモンカード
Kick-Flight
UI開発高速化のために行ったこと
Q. なぜ高速化した?
UI開発高速化のために行ったこと
TGS
2018
闘会議
2019
CBT
2018/09 2019/01 2019/05
UI開発高速化のために行ったこと
TGS
2018
闘会議
2019
CBT
2018/09 2019/01 2019/05
インゲーム 新キャラ サーバ
UI開発高速化のために行ったこと
A. 高速化しないと間に合わない
(ゲームの面白さを伝える部分の開発に比重をおいていた)
UI開発高速化のために行ったこと
Q. 何をした?
UI開発高速化のために行ったこと
A1. UI基盤機能を作る
UI開発高速化のために行ったこと
Unityのデフォルト機能で補えないもの
UI基盤機能を作る
▼要件が不明でも必須なもの
• 画面遷移
• 画面
• ダイアログ
• ボタン
▼要件によって必要なもの
• ドラッグアンドドロップ
• グリッドスクローラー(列、行)
• スナップスクローラー(iOSホーム画面)
• etc
UI基盤機能を作る
▼画面設計方針
• 画面用ライフサイクルを作る
• 画面遷移マネージャで各処理を呼ぶ
▼移動前画面
OnDisableStart
OnDisableCoroutine
OnDisableEnd
▼移動後画面
OnEnableStart
OnEnableCoroutine
OnEnableEnd
遷移
UI基盤機能を作る
▼ダイアログ設計方針
• ダイアログ用ライフサイクルを作る
• ダイアログマネージャで各処理を呼ぶ
▼ダイアログ
OnCreate
OnOpen
OnClose
開く
閉じる
UI基盤機能を作る
▼ボタン設計方針
• イベント用のインターフェースを実装
• タッチ、リリース、クリック、長押しを実装
• 外から処理を設定し使用する
• アニメーション、SEは継承クラスで実装
▼ボタン
IPointerClickHandler
IPointerDownHandler
IPointerUpHandler
Update(LongPress)
UI基盤機能を作る
▼意識すべきこと
• プロジェクト固有化しない
• サードパーティ製のアセットありきにしない
→ 別案件でも展開できるくらいの深さ(余計なものを作らない)
→ それより先は継承して作る
UI開発高速化のために行ったこと
A2. デザインのレギュレーション
を決める
デザインのレギュレーションを決める
有象無象なUIデザインが生まれると
有象無象なUI実装が生まれる
デザインのレギュレーションを決める
デザインのレギュレーションを決める
▼デザイナに伝えたUnityのあれこれ
• 9Slice
• Color(乗算)
• SpriteAtlas
• Mask
デザインのレギュレーションを決める
▼9Slice
• ImageのSlice機能を用いて余計な画像を作ってしま
うロスを減らす
• エンジニアがどの素材を使えばいいか悩むロスを減
らす
デザインのレギュレーションを決める
▼Color(乗算)
• 白色画像に色をのせてUIをつくり余計な画像を作っ
てしまうロスを減らす
• プログラムで色を定義することで素材作成でのミス
を減らす
デザインのレギュレーションを決める
▼SpriteAtlas
• パフォーマンス観点で無限に画像素材を増やしたくない理由
の説明(ドローコール、メモリ)
• レギュレーションの指標にする
→ まとめることができるところをまとめる
デザインのレギュレーションを決める
▼Mask
• パフォーマンス観点で修正される可能性のある多用した
くない表現の説明
• Maskを使わない素材の作り方
はじめからMaskされた素材を使う フレームをのせてMaskを使用しないデザインにする
UI開発高速化のために行ったこと
A3. レギュレーションをもとに
Prefab化
レギュレーションをもとにPrefab化
▼本件に必要だったもの
• ダイアログ
• ボタン
• サムネイル
レギュレーションをもとにPrefab化
レイアウトさせる箇所を減らす
(エンジニア、デザイナ問わず)
レギュレーションをもとにPrefab化
Nested Prefabでやりやすくなった
レギュレーションをもとにPrefab化
レギュレーションをもとにPrefab化
AnchorでPrefabを置いた親に合わせて
適切なレイアウトになるように設定する
レギュレーションをもとにPrefab化
AnchorでPrefabを置いた親に合わせて
適切なレイアウトになるように設定する
レギュレーションをもとにPrefab化
AnchorでPrefabを置いた親に合わせて
適切なレイアウトになるように設定する
レギュレーションをもとにPrefab化
UI開発高速化のために行ったこと
▼まとめ
• UI基盤機能を作る
• デザインのレギュレーションを決める
• レギュレーションをもとにPrefab化
UI開発高速化のために行ったこと
▼まとめ
• UI基盤機能を作る
• デザインのレギュレーションを決める
• レギュレーションをもとにPrefab化
→ レイアウトするオブジェクトも
共通化することが重要
UI開発高速化のために行ったこと
▼まとめ
• UI基盤機能を作る
• デザインのレギュレーションを決める
• レギュレーションをもとにPrefab化
→ UIのレギュレーション整備は
UXに好影響
ありがとうございました!

UnityでUI開発を高速化した件

Editor's Notes

  • #3 アジェンダ
  • #4 入社時からUnityをさわりはじめ現在3本目のUnity製スマホゲームを製作中 LT初登壇なのでおてやわらかに…
  • #5 株式会社グレンジで開発中のアクションタイトル 先日CBTを行いリリースに向け絶賛開発中 現在事前登録中なので是非公式サイトをのぞいてみてください
  • #6 3Dのキャラを操作し360度飛行しながら4対4で対戦を行うアクションゲーム 様々なキャラクターや多彩なスキルを使用しマルチプレイの対戦を行う 本日は本ゲームのUI開発についてお話させていただきます
  • #7 そもそもなぜ高速化が必要だったのかという点について説明
  • #8 直近のキックフライトのイベント 先日開催したCBTに加えトーキョーゲームショウやニコニコ闘会議への出展など短期のスパンで大きいイベントが立て続けにあった
  • #9 ユーザにお披露目したTGSまではゲームの本質的な部分(ゲームルールやバトルまわり)の改修に力を入れており闘会議までは新キャラの追加、CBTまでにはAPIやデータの疎通実装など短期間で重要な機能の実装が必要だった 闘会議までは出展ということもありバトルができるところまでで大丈夫だったがCBTではゲームを通しての一連の機能が必要になった
  • #10 出展でゲームの本質部分であるインゲームでダイレクトに面白さを感じてもらうためそちらに力をさきたい状況だった UIの実装に手間取らない環境整備をしておかないと間に合わないというスケジュール感
  • #11 ただUI実装は得意とするところであったので任せてくださいという感じで進めた 何をしたかについて3つのポイントを伝える
  • #13 Unityのデフォルト機能で補えないコンポーネントのスクリプト作成を行う
  • #14 大抵のゲームでは要件が不明でも必要な機能が想像できる 仕様展開が行われる前に先回りして実装することができる これらの機能は資産化するので会社として作っておくことが望まれる 先回りで浮いた時間を使って要件によって必要なものを作る
  • #18 アニメーションやSEなどプロジェクト固有となりそうな処理は基盤的な機能に含めると別の箇所で使用するにも汎用性がなくなる 余計な機能を増やして作る側も使う側も時間をとらないように必要最低限のものをつくり継承先で機能を増やす Androidのバックキー対応などでもこのような基底機能の存在は開発速度を上げるために重要
  • #20 デザインの数だけ実装が必要
  • #21 左がフォントのレギュレーション、右がカラーのレギュレーション 他にも多々あるがわかりやすい例としてこの2つを載せた デザイナに数を絞り整えていってもらう作業 決まってしまえばプログラムで定義できることが多いので実装もある程度安心できる
  • #22 デザイナに伝えて理解しておいてもらったほうが良いUnityの機能 実際に使用する素材の書き出し方に関わるのでデザイナにオリエンして理解してもらった
  • #28 本件で必要になった共通化できるオブジェクト ゲームを作っていれば同じような感じになると思う
  • #29 考慮すべきなのはレイアウトさせる箇所を減らすという点 プロジェクトによってエンジニアがレイアウトしたりデザイナがレイアウトしたりフローは様々だと思うが職種の違いは関係なく人の違いによってレイアウトの精度のブレは出てしまう ここをPrefabでカバーできる設計を目指していくと良い
  • #30 以前はレイアウトさせる箇所を減らす設計を目指すためにプログラムでひと手間必要だったがUnity 2018.3から追加されたNested Prefabでやりやすくなったと感じる
  • #31 シンプルなダイアログを作成する場合の例です
  • #32 これはダイアログの背景 親に配置するだけでタイトル位置と白い部分のレイアウトが担保される
  • #33 閉じるボタン ダイアログ下部からの距離を指定している
  • #34 ダイアログ内ボタン ダイアログ下部からの距離を指定している
  • #35 AnchorがつけられたPrefabを配置していき数値をいじることなくレイアウトを完成させる例 レギュレーションを決めたうえで部品を作っておくと配置するだけでレイアウトできる 以前は調整を反映させるためにprefabの参照をもって生成するプログラムを書いたりしていたが Nested Prefabがあることで細かな調整も一斉に反映できるようになった これも高速化につながった
  • #36 以上3点がUI開発を高速化させるために行った3つのこと 主にレギュレーションの整備、共通化をキーワードに実装コストを下げていく方針で高速化を行った エンジニアだけで完結しないので骨が折れる作業だが これらの項目はUI実装のクオリティアップのために高速化にかかわらずやったほうがいいこと
  • #37 エンジニアがプログラムで意識することがある共通化のようなデザインパターンはUI実装でも同じだと思っている 同じものを使い回すことでバグのリスクを減らせるし実装コストも減らせる またレイアウトはデザイナ視点からでしか評価しづらいところなので狙い通りに行かないことがあるのも吸収でき UXの向上につなげることができる
  • #38 レギュレーションの整備はUXにも繋がる 学習コストやインタラクションのブレがなくなることでユーザー体験の最適化を行うことができる 近年はどの企業さんもゲームのクオリティが高いのでUXの最適化は市場でいっぽぬきんでるためにも捨てがたいところだと思う 以上でまとめとさせていただきます