勉強会のレポート(メモ)です。
参加したのはこちら、「Roppongi.unity #1」
会場提供、懇親会支援は「メルカリ」さんです。
connpass.comハッシュタグ : roppongiunity
動画はこちら
メリカリさんには一昨日も「VRM勉強会」の会場提供をしていただきました。
時間(予定) | タイトル | 発表者 |
---|---|---|
19:30-19:40 | 会場説明など | @nkjzm |
19:40-19:50 | Humble Objectパターンな話 | @adarapata |
19:50-20:00 | Unityエディタ拡張でノードベースのシンセサイザーを作った話 | @rn49rn49 |
20:00-20:10 | GUID参照を素早く洗いたくて試行錯誤した話 | @v9129 |
20:10-20:20 | データサイエンティストから見たUnityの可能性 | @Keijipoon |
20:20-20:30 | Zenjectのススメ | @notargs |
20:30-20:40 | Unityでオニオンアーキテクチャ | @toRisouP |
20:40-20:50 | キャラが8人同時にしゃべるんだけど...とPに言われたときの戦い方 | @Takaaki_Ichijo |
20:50-21:00 | みんなに使ってもらうUnityライブラリの作り方 | @taptappun |
- LT1. Humble Objectパターンな話
- LT3. GUID参照を素早く洗いたくて試行錯誤した話
- LT2. Unityエディタ拡張でノードベースのシンセサイザーを作った話
- LT4. データサイエンティストから見たUnityの可能性
- LT5. Zenjectのススメ
- LT6. Unityでオニオンアーキテクチャ
- LT7. キャラが8人同時にしゃべるんだけど...とPに言われたときの戦い方
- LT8. みんなに使ってもらうUnityライブラリの作り方
- タイムライン
- 懇親会、展示の様子
LT1. Humble Objectパターンな話
スライド
ごたゆに10で話せなかった、スライドの後半にフォーカスした内容になっています。
HumbleObjectPaternについて
テストが書きたくて手が震えている
テストのしにくさには原因があります
密結合な話や入力イベントが絡んだ時などはしにくい。
リファクタリングしてもテストしにくいことがある。
ただテストを書けない理由は明らかにすべき。
テストの難易度#roppongiunity pic.twitter.com/oN45LSAkCJ
— シン (@Shin09shin) February 21, 2019
ピラミッドの境界をまたぐような書き方はしんどい。
なので分割したような書き方をする必要があります。
ではどうやるのか、それがHumble Object パターンになります。
つまりHumble Object Paternはテストしやすいものとしにくいものをすみ分ける実装パターン。
入力がからむ MonoBehaviourがからむとめんどくさい。
テストが書きにくい原因はだいたいMonoBehaviour。なのでロジックから抽出します。
接続の関係でLTの順番入れ替えました
LT3. GUID参照を素早く洗いたくて試行錯誤した話
話す内容
プロジェクトにある大量のアセットを消したい。
消せないものはどこで参照されているかを知りたい。簡単にいうとゴミデータを削除したい。
Reference Viewer
もともとReferenceViewerを使っていました。
これは初回実行時に参照データ生成を行います。
小さいプロジェクトならまだしも、大きいプロジェクトだとまあまあ時間かかる。
ブランチ切り替えでもおきちゃう。
なので早くしたい、プログレスバーを表示してメインを止めないようにした。
結果的に早くなったがもっと早くしたい。
最終的にチェックツールを作成しました。
UnityAPIを使用した普通の実装、15秒くらいでおわるくらいまで早くなりました。
GUIDについて
metaの中にはGUIDが入っていて読むことができます。
Scene、Prefabも中で使われているGUIDも読めばわかります。
一部gitgrep に置き換えました。結果1~2秒まで早くなりました
まとめ
git grepは最高、windowはがんばれ
GitHub - anchan828/ReferenceViewer: Unity5対応する予定
LT2. Unityエディタ拡張でノードベースのシンセサイザーを作った話
スライド
ノードをつないで音をつくるおもちゃを作りました。
音の周波数を変えたり、それらを加算したりできます。
どういう風に実装したか
xNodeというフレームワークを使うと、ノードベースのエディタが簡単に作れるんです。
作ったものはgithubで公開しています。
GitHub - Siccity/xNode: Lets you view and edit node graphs inside Unity
LT4. データサイエンティストから見たUnityの可能性
なぜデータサイエンティストがunityをやっているのか
最初やっていたこと
フライトシュミレーターの整備をやっていました。
当時、上司からARデバイスについて調べて何か作れという指示がありました。
この時、いろいろ調べましたが、いろいろなデバイスでいろいろなものが作れるんだと気づきました。
今はデータサイエンティストとして働いています。
可視化の部分を専門にやっています。
ビッグデータを地図上に可視化し、VRでも見ることができます。
Unityでは
VRのガンシューティングゲームを作っていました。
Unityは物理挙動もかってにやってくれて、Assetも充実していたのですごくびっくりしました。
Unityという武器を手に入れました、
次は何をしたいか
Unityでビッグデータの可視化をしたい。GoogleMapのAPIでいろいろできそう。
ただ、今は申請制のようで作るハードルがやや高い。
今までは地図上にデータをマッピングしたりしていましたが、
これからは3Dの街並みにデータをマッピングしたり、ビックデータとのインタラクション。
ビッグデータの理解というものも広がるんじゃないかなと思います。
Unity ML-Agentで企業の取引最適化も。(今と最適化の違いを見て、分析ができる)
まとめ
Unityのおかげで開発のハードルはだいぶ下がり、個人でも作れるようになった。
異分野(ゲーム以外でも)でUnityを使えるようになった
いままでビッグデータとかやってる人がいなかったので自分がやっていきたいなと思います。
LT5. Zenjectのススメ
スライド
Zenjectはいいぞ
Zenjectとは
オブジェクト同士の依存関係を簡単に定義できるアセットです。
依存関係はZenjectを使いましょう。
FindやGetConponentだったところを変数にように定義し、シーン内でバインディングするだけ。
もっと疎結合にしたい時はインターフェースを挟もう。
シングルトンのマネージャークラス
シングルトンの記述はなんかダサいし、使うときがっつりインスタンスしている。
ここもZenjectに治せます。
普通のクラスのように作るだけ、シングルトンの情報も持たせない。
Zenjectはいいぞ
LT6. Unityでオニオンアーキテクチャ
スライド
https://niconare.nicovideo.jp/watch/kn4031
オニオンアーキテクチャとは何か
設計指針としてはドメイン駆動設計(DDD)が根幹
ドメイン駆動設計とは何か
今から作るアプリが本質的にやりたいことをドメインといいます。
このドメインを中心に考えるやり方がドメイン駆動設計です。
実装する時に仕方なくそうなったところをわける。
例えばセーブデータの保存だと、データの保存と復元がドメイン。
他の部分はどうでもいい。
4層で構成されるアーキテクチャ
・Domain層
本質的にやりたい処理、ロジック、データ構造
・Infrastructure層
実装を置くところ、機能追加や修正などはここで変更する。
・Application層
処理の手続きを書くところ
・Presentation層
UnityとApplication層そうをつなげるところ
DIがないとまわらないのでZenjectは必須。
クリーンアーキテクチャとは本質的にはまったく同じ。
とっつきやすいほうからやりましょう。
実装の手順
下準備
層ごとにディレクトリをわける。
AssemblyDefiniionを使うと便利なのでオススメ。
Domain
名前が大事、名前には意味をもたせましょう。
構造体とクラスどっち使うかはよく考えて。
インターフェースだけ定義(こういう操作ができますよというもの)
Infra
実装を書く。
Application
手続きを書く、まあ薄くなる。
Presentation
UnityでUIとかとつなぐ。
Zenjectのインストーラーに書く・
自動でインスタンス化してくれるようにします。
仕様変更がきてもいじるところは少ない。
デフォルト値は定義
この言葉の意味はよく議論すること。
まとめ
メリット
・機能変更修正にめちゃくちゃ強い。
・アウトゲーム部分と相性がいい。
・レイヤーがわかれているので明確。
・テストとも相性がいい。
デメリット
・インゲームには適応しにくい。
・処理に対しコード記述量が増える。
・Domainの設計が難しい。
・インタフェースなど知らないとだめ。
・Zenjectがむずかしい。
自分のこの資料、まじで3時間でサンプル含めて作ったんだから褒めて! #roppongiunity
— とりすーぷ (@toRisouP) February 21, 2019
LT7. キャラが8人同時にしゃべるんだけど...とPに言われたときの戦い方
スライド
8人同時にしゃべるといわれた、これは何がやばいのか。
サウンドの再生部分についての問題
・CPU、メモリの問題
・再生時の管理
・ボイスデータの管理
ボイス再生時には制御が必要、同時再生数を制限したりとか。
じゃあこれはどこで判定するのか・・・
ボイスデータの管理の問題
エクセル管理の場合、管理用と実際のデータで差異が生まれてしまう。
ここでADX2
ADX2ではAudioClipを再生とはやらない。
キューというものを作って情報を埋め込み、キューを再生して動かす。
ここでデモ
キューの中でダッキング処理ができる
まとめ
・大量の音データの管理が得意
・同時再生時の負荷軽減もできる
・冒頭の無茶ぶりにも対応できます
書籍もでます、よろしくお願いします。
LT8. みんなに使ってもらうUnityライブラリの作り方
スライド
いままでいろいろ作ってきたのでそのノウハウを共有します。
大前提
使う人のことを考えよう
その1 Exampleをまず作る
ドキュメントやテストよりも大事。
ゲーム買ったら説明書とか読まないよね、それと同じでライブラリを落とした人はドキュメント読まない。
とりあえずExmapleを動かしてみてみる人が多い。
なので即動かすことができるように整えておきましょう。
一応テストやドキュメントも大事、書いてあると動くという証明になります。
その2 UnityPackage化しよう
つまりエクスポート。
ダウンロードしてすぐ使うので簡単にしたほうがいい。
インストールに手間取ることもない。
その3. Namespaceを作ろう
開発中はいろいろなライブラリが入る、なので明示的にわかるようにするために必要。
処理の衝突をさけるためでもある。
その4. ディレクトリは1つにまとめる
いらなくなったらすぐに消せるようにする
バージョンアップさせる時の依存関係がわかりやすくなり、バージョンアップするとき楽。
その5. ラッパーを作るのはやめよう
ラッパー(Wrapper)って何?《サンプルケース付き》 - Qiita
使ってるライブラリが他にあると、本家が更新されたらライブラリも更新しなければならない。
メンテナンスも大変、そのまま使うようにした方がいい。
まとめ
上の5点は守ろう。
ライブラリ作るときは参考にしてみて
タイムライン
今日はこれに参加!
— ムラサメ@知的好奇心に身をまかせる (@murasame_usa) February 21, 2019
会場に到着~
Roppongi.unity #1 in メルカリ@六本木ヒルズ https://t.co/rEJYtpq94g #roppongiunity
Glitch #roppongiunity pic.twitter.com/hLjZvDGnuU
— 𝕒𝕞𝕒𝕦𝕤𝕒𝕘𝕚 (@amausagiiiii) February 21, 2019
ReferenceViewer
— Kazushige Mori(Cz_mirror) (@Cz_mirror) February 21, 2019
指定したアセットについてどのアセットが参照されているかわかる#roppongiunity
Windowsにgit bashいれたら普通に動くような気もするけどどうなんだろ #roppongiunity
— とりすーぷ (@toRisouP) February 21, 2019
ノードベースで音を作ってるのしゅごい #roppongiunity pic.twitter.com/W7qbFAWiTo
— ムー (@Mu_Alexius000) February 21, 2019
xNodeというアセットを使ってノードグラフを実装できるの、良さそう! https://t.co/T8VwvJhbem#roppongiunity pic.twitter.com/vkS9CzoF7S
— 青木とと(ˊᗜˋ*) 💭 (@lycoris102) February 21, 2019
トレンド入りおめでとうございます! #roppongiunity pic.twitter.com/9SxoF0aVTb
— もんりぃ先生📚技術書典 け54👨🏫マンガでわかるUnity連載中! (@monry) February 21, 2019
BigDataをUnityで地図や地球儀にマッピングして可視化
— ドコカノうさぎ@バーチャル美少女(棒) (@patsupyon) February 21, 2019
Unityによって開発ハードルが下がることで他の分野からの活用も期待できる
自社には全然関係ないと思ってても会社でUnity使う日がくるかもしれないぴょん#roppongiunity pic.twitter.com/6893C7701d
ドメイン駆動設計とは
— Kazushige Mori(Cz_mirror) (@Cz_mirror) February 21, 2019
ドメインを中心に物事を考える#roppongiunity
技術選定の方針
— Kazushige Mori(Cz_mirror) (@Cz_mirror) February 21, 2019
ExampleやSampleがある
最新更新されている
Starの数が多い。#roppongiunity
namespaceをつけよう!これ大切。他のライブラリと名前衝突するとめんどいから。 #roppongiunity
— naka (@_daisuke0802) February 21, 2019
あとadfを定義して、ライブラリの中にversion.txtを置いて中にバージョンを書いてくれたりするとすごい嬉しい!!
— とりすーぷ (@toRisouP) February 21, 2019
#roppongiunity
Roppongi.unity は展示枠があるの素敵だよなぁ #roppongiunity
— 青木とと(ˊᗜˋ*) 💭 (@lycoris102) February 21, 2019
本編終了分までまとめました! #roppongiunity「Roppongi.unity #1 in メルカリ@六本木ヒルズ」 https://t.co/fLwRQ27vlZ
— いっこう / ikkou (@ikkou) February 21, 2019
懇親会、展示の様子
ピザがデプロイされた!#roppongiunity pic.twitter.com/HBk8y64Bzv
— ムラサメ@知的好奇心に身をまかせる (@murasame_usa) February 21, 2019
VR対戦テトリス面白かった!
— hobione (@hobi_ik) February 21, 2019
2D側のテトリスをVR側でブロックを破壊して邪魔するというゲームです
次々ブロックが落ちてくるのでVR側は結構忙しいです#まじぷろ #toy_labo #roppongiunity
なかじさんの展示乗っ取った #roppongiunity pic.twitter.com/z47XMuZqB7
— とりすーぷ (@toRisouP) February 21, 2019
今日のMagicBlockのランキングです!
— おもちゃLABO (@toy_labo) February 21, 2019
結果画面からツイート、アンケート等できます。良かったらしてください〜!
計4回の展示の総合ランキングも載ってます!今回総合1位が出たみたいですよ!しかも不利と言われているテトリスサイドから…!!!https://t.co/IbgpEaknEU
#roppongiunity
VRM勉強会の時にも展示していたおもちゃラボさんの展示レポートです。
LT7の@Takaaki_Ichijoさんは昨日の「ゲーム開発におけるサウンド実装の勘所」についても講演いただきました。
間違っている所、消してほしいツイートなどがありましたらコメントにお願いします。