勉強会のレポート(メモ)です。
参加したのはこちら、「Gotanda.unity #10」
ごたゆにも記念すべき10回目です。
- タイムスケジュール
- スポンサー様
- LT #1 : スクリプトの処理を効率化してゲームを軽くしよう
- LT #2 : どこから始めるUnityテスト
- LT #3 : ECSベースのVRMSpringBoneを実装してみた話
- LT #4 : Unity(C#)メモリ小話
- LT #5 : VRMと暗号化
- LT #6 : PUN2を使おう!
- LT #7 : VRM対応スマホアプリのすすめ
- LT #8 : もう「ぼくが持ってるUnityと違う…」ではない!HDRPで劇的にルックを変えよう!~部屋とかキャラのセットアップをしてみる。~
- LT #9 : 簡単な弾幕をつくる
- 感想
- タイムライン
- 他の方の感想ブログ
タイムスケジュール
19:00~ 受付開始
19:30~ イントロダクション
19:40~ LT枠前半
LT #1 会場/アカツキ枠 Norihiro Funakoshi : スクリプトの処理を効率化してゲームを軽くしよう
LT #2 Hiroto Imoto : どこから始めるUnityテスト
LT #3 mao : ECSベースのVRMSpringBoneを実装してみた話
LT #4 Nozomi Tanaka : Unity(C#)メモリ小話
LT #5 小林拓 : VRMと暗号化
20:20~ 休憩
20:25~ LT枠後半
LT #6 Tomohiro Okamura : PUN2を使おう!
LT #7 Naoya Mizota : VRM対応スマホアプリのすすめ
LT #8 joshuaarthurelcaro : もう「ぼくが持ってるUnityと違う…」ではない!
HDRPで劇的にルックを変えよう!~部屋とかキャラのセットアップをしてみる。~
LT #9 aoiaioi : 簡単な弾幕をつくる
21:00~ クロージング/懇親会準備
21:05~ 懇親会
22:00~ 解散
スポンサー様
会場提供はアカツキ。
懇親会のサポートはキッズスターとワンダープラネットです。
もんりぃさん(キッズスター)
知育アプリ「ごっこらんど」をリリースしています。やってね。
正社員採用というわけではないですが、フリーランスの方募集してます。
ひらきさん(ワンダープラネット)
WANTEDLYでフォローしてください。積極採用中です。
LT #1 : スクリプトの処理を効率化してゲームを軽くしよう
ゲームを作っていて画面が重い、ゲーム中スパイクが挟まるなんてことありませんか?
こういうのはすこし手直しすれば治ります。
基本的に原因はスクリプトと描画処理です。
今回はスクリプトで調べる方法と解決パターンを話します。
調べる時はプロファイラを使いましょう。
Deep Profileを使うと深くまで知ることができます。
どこが重いのか
プロファイラ内で大きく跳ねるフレーム、平均して大きく占めている所が重いところです。
16.67msまでに抑えると 60fpsだすことができます、
よくあるパターン
・Updateで不要な処理を行う。
本当に必要な処理か考える。不要なら消す。
・空のUpdateは消す。
・不適切なLINQを使っている
便利だが重い。基本的に使わないようにするか、一箇所にまとめる。
結果を使いまわす時は値をキャッシュしましょう。
・ファイル入出力の回数を減らしましょう
・GCを抑えましょう。
・メモリアロケーションを減らしましょう。
・ボクシングを起こさないようにしましょう
LT #2 : どこから始めるUnityテスト
テストをどこから始めるか。よくあるコードに対してユニットテストを書いてみます。
結論をいうとしんどいので止めた方がいいです。
テストしやすいものとしにくいものを切り離しましょう
UnityではUnityAPIに依存していないものはテストしやすい。
逆にUnityAPIに依存しているもの、GUIはテストしにくい。正しい動きをしているか定義することが難しい。
Inputへの依存をやめる、入力部分をインターフェースにしてキー入力を意識させない。
MonoBehaviourはテストしにくい。
個人開発だとテストはそこまで有効ではないが、設計の問題を見つけるのに有効です。
LT #3 : ECSベースのVRMSpringBoneを実装してみた話
UniVRMにあるVRMSpringBoneをPureECSベースで動作する低負荷なSpringBoneを実装できるか検証した話。
このLTにはポインタの知識が必要です。
設計について MonoとESCの連携について
その前に従来について、従来は揺れものの数が多いと負荷が大きくなった。
ECSベースでやるのなら、エンティティについては主にノードとコライダーを使います。
これを1つ1つエンティティ化していきます。
Nodeには位置や回転のデータ、コライダーにはコライダーのデータを持たせます。
揺れものの階層それぞれにエンティティが生成されます。
ここで課題。
PureECSでは参照型を持たせることはできない(Transformなど)、位置や回転については考える必要があります。
Transformの解決
ここで時間切れ、続きはスライドで。
共通の値を持たせるためにポインタを使いました。
LT #4 : Unity(C#)メモリ小話
Gotanda.unity #10 メモリと闘う者達 〜GC編〜 - Speaker Deck
メモリには保存場所が二種類ある
スタックとヒープです。
スタックを使うことができるのは限られています。
プリミティブ型はスタック、それ以外はだいたいヒープです。
C#とメモリの使い方
C#にはGCというものがあり、メモリのお掃除を自動でやってくれます。
発生条件は物理メモリが足りない時と、GC.Collectが呼ばれた時。
そしてヒープメモリの使用量がしきい値を超えた時です。
C#では到達可能性というものを見ています。
変動する条件はヒープへのメモリ確保が原因です。
ヒープへの確保を抑えましょう。
ボックス化、クラス型のオブジェクト生成が原因になるため回避しましょう。
ボックス化
値型をobject型(参照型)として扱うときスタック上からヒープ上に値をコピーする処理。
ボックス化は適度に省きたい。
メソッドの引数にobjectを使わないようにする。
また一部のUnityクラスはDictonaryでボックス化がおこる。
・ボックス化は値型の扱い方の問題です。ジェネリックは使ってok。
・アウトゲームなど、ボックス化しても問題ない場面では気にしなくてもよい。
・クラス型オブジェクトの生成は回避。ラムダ式も避けましょう。
・事前確保で避ける手もあるが現実的ではない。
・複製を行わないデータは構造体で作るといい。
・クラスの機能を使わざるをえない場合はもちろんクラスで。
まとめ
・スタックとヒープを意識しましょう。
・GCの発生条件を意識しよう。
・new、ボックス化を抑える。
LT #5 : VRMと暗号化
フリーの時期にしていたことの話をします。
実はその間、Vroid SDKの制作に携わってました。
言っていいかわかりませんが、来週の月曜日に出ます。
Vroid SDKとは
VRMファイルのダウンロードと表示を行う。
VRMファイルの暗号化を行う。
セキュリティ的な話の解決。
VRMのストロングポイント
・環境に依存しない
・VRMファイル1つで完結している
・ランタイムダウンロードができる
・人型に特化
ここでデモ
現在あまりドキュメントはないのでソースコード読んで使う必要があります。
VRMには、せっかく作ったVRMが勝手に使われる問題があります。
UnityCipher
前職で作った暗号化ライブラリがそのまま使えるかもしれない、その名もUnityCipher。
お手軽にお堅い暗号化ができます。
ブロック暗号CBCモードを使っています。
「あああ」をあるときは「いいい」、あるときは「ううう」と暗号化するのが特徴です。
ここで休憩
LT #6 : PUN2を使おう!
PUN2はPUNの後継バージョンです。
互換性がないが大きく改善されました。
1. 動作がちょっと軽くなりました
2. 新しいAPI
今までSendMessageだったものがInterfaceになった。
3. いろいろ整理されていていい
フォルダが整理されている、名前空間が整理されている。
今までPUNかRealtimeでごっちゃになっていたアセンブリが整理されている。テストがかけるよ。
4. わりと移行ができる
移行用のドキュメントが充実しています。
LT #7 : VRM対応スマホアプリのすすめ
Vスタンプの紹介 デモ
好きなVRMキャラクターを使うことができます。
VRMメリット
・手軽にインポートできる。
・骨が共通なのでモーションを使いまわすことができる。
・ユーザーの好きなキャラクターを登場させることができる。
VRMファイルの扱い
スマホで使いやすくするにはローカルのどこに保存するべきか。
アプリごとに生成されるフォルダに格納しましょう。
しかしAndroidの場合は階層がちょっと深いなので保存先を変えています。
こうするとアプリと関係ない外のフォルダなのでアンインストールで削除されないことに注意。
VRMをスマホで使いやすくするには、スマホに送る手段が大事。
Androidの場合は指定のフォルダに移動する仕組みがアプリ内に必要。
LT #8 : もう「ぼくが持ってるUnityと違う…」ではない!HDRPで劇的にルックを変えよう!~部屋とかキャラのセットアップをしてみる。~
詳しい手順はスライドを見てください。
HDRPを広めるために登壇しました。
最初のセットアップに躓かないような初心者向けの内容です。
まず始め方、UnityHUBから起動しましょう。
プロジェクトテンプレートを設定しましょう。後から入れると赤いエラーがたくさん出ます。
基本的にフォトリアルと相性がいいです。
ミラー(鏡)が簡単に作ることができます。
そんなに難しくないのでおもしろく触ってみてください。
いずれガンにも効くようになります。
LT #9 : 簡単な弾幕をつくる
弾幕の作り方について紹介します。
プレイヤーに弾を飛ばす
テスト
— 相生葵 (@pirorirori_n712) October 14, 2018
可愛いキャラクターは【Rド】様(https://t.co/80g5E20XwZ) pic.twitter.com/kLBg9BhWEw
方法は2つあります。
Vector3.MoveTowardsを使う方法と、ベクトルを使う方法です。
弾を動かすにはrigidbody2dを使います。
ただしベクトルを使う場合、大きさが変わらないよう正規化をする必要があります。
弾を追尾させる
追尾弾
— 相生葵 (@pirorirori_n712) October 21, 2018
単純にvelocityに値を入れると、プレイヤーに近づくにつれ速度が遅くなってしまう…
可愛いキャラクターは【Rド】様(https://t.co/80g5E20XwZ …) pic.twitter.com/d3nsKedGQi
同じく2つやり方がありますが、軌道を修正させ続ける必要があるためUpdateでやります。
上と同様に、正規化をしないと速度が遅くなってしまう。
全方位に弾を飛ばす
弾を飛ばす
— 相生葵 (@pirorirori_n712) October 14, 2018
可愛いキャラクターは【Rド】様(https://t.co/80g5E20XwZ) pic.twitter.com/xRGBRfFGgQ
弾の配置はサインコサインを使っていきます。この通りに使えばきれいになります。
三角比の拡張 | 数学I | フリー教材開発コミュニティ FTEXT
可愛いキャラクターは【Rド】様(https://t.co/80g5E20XwZ … …) pic.twitter.com/X8xTfU3pbU
— 相生葵 (@pirorirori_n712) January 22, 2019
うずをまいて飛ばす
うずまき
— 相生葵 (@pirorirori_n712) January 22, 2019
可愛いキャラクターは【Rド】様(https://t.co/80g5E20XwZ …) pic.twitter.com/rVtIzUS11Q
放出する角度を小さくするだけで実現できます。
感想
メモリ関連とVRMの話題が多かったですね。
VRMは今流行りの技術ですし、メモリ回りは最適化の観点からも重要な所です。
「LT #2どこからはじめるUnityテスト」が個人的によかった。
テストがうまくいった・いかなかっただけでなく、テストがしやすいかどうかで設計の問題を見つけるという観点がとてもおもしろい。
懇親会のお寿司ではエビが不人気という知見を得ることができました。
今回はunity1weekMeetup2019でも好評だったホワイトボードコーナーがありました。
タイムライン
【Gotanda.unity #10】
— 青木とと(ˊᗜˋ*) Gotanda.unity#10 1/23(水) (@lycoris102) January 23, 2019
設営準備に来てますー!#gotandaunity pic.twitter.com/wNfwWDEpxx
わいわい。
— コスッキー (@QBMK_IQU) January 23, 2019
インフルエンザに配慮して会場にマスクを用意しているとは。 #gotandaunity
来ました❗#gotandaunity
— 大熊 元気@デジタルツイン (@JNTEST23) January 23, 2019
よろしくお願いします😆https://t.co/HZz8XsihpT pic.twitter.com/0GalabAl7s
Update()でGetComponentみたいなのをやめようー。
— さやちゃんぐbot (@songofsaya_) January 23, 2019
[SeriarizeField]private someObject;でインスペクターから設定しておくものを使う、みたいな。#gotandaunity
「テストのしにくさから設計の問題を把握する」なるほど #gotandaunity
— やがて寿司になる (@maruju_fav) January 23, 2019
Zenject入門その1 疎結合とDI Container https://t.co/2QGv5ePfFd #Qiita
— とりすーぷ (@toRisouP) January 23, 2019
今回の内容に近いのはこれかな!参考になれば! #gotandaunity
名前空間の整理で思い出した。UnityのSDKとかライブラリの正しい作り方とか記事をちゃんと書いたほうがいいかもとか思い始めた #gotandaunity
— 小林 拓 (@taptappun) January 23, 2019
Androidのフォルダ関連は闇深い...
— KappaBull🥒 (@KappaBull) January 23, 2019
#gotandaunity
プロジェクトテンプレート:HDRP を選ぶ
— えむにわ (@m2wasabi) January 23, 2019
大事なことだー #gotandaunity
青木ととが悪い #gotandaunity
— ヤマト (@minotarow) January 23, 2019
五反田Unity次は3月!
— Yu (@yuma1217_ja) January 23, 2019
発表が全部よかったため、初登壇はしづらそうな気持ちになった(いい意味で)
#gotandaunity
今日の進捗#gotandaunity pic.twitter.com/7f8N2Gawqo
— シン (@Shin09shin) January 23, 2019
撤収しました!
— 青木とと(ˊᗜˋ*) Gotanda.unity#10 1/23(水) (@lycoris102) January 23, 2019
トークされた皆さん、参加者の皆さん、アカツキの @tk_adio さん、運営の @monry さんと @pinori さん、ありがとうございましたー!🎉
今後もごたゆにを宜しくお願いしますー!🙇#gotandaunity pic.twitter.com/u8cgyYUHKe
はー、今日も楽しかった!😆
— もんりぃ先生👨🏫マンガでわかるUnity連載中! (@monry) January 23, 2019
ごたゆにはトークの濃淡気にせず喋れる場なので、初登壇の方も居ればガチ勢の方も居たり、と良い意味でゴチャ混ぜな勉強会でございます。
登壇者のジョブはエンジニアが多めですが、非エンジニア職の方の登壇もお待ちしておりますよ!#gotandaunity
次回、初登壇枠で応募してみようかな #gotandaunity
— KappaBull🥒 (@KappaBull) January 23, 2019
懇親会、フォローはしてるけど(ほぼ)初めて見る人たちに囲まれて話を聞いてた。
— Nozomi Tanaka (@nozomin770) January 23, 2019
ゲームジャムは行ったほうがいい、実践的なゲームジャムの進め方、DI最高、MonoBehariour使う限り重い、などなど高レベルな話ばかり聞けた #gotandaunity
会場ではUnityでご覧頂いたスライドですが、unitypackageを公開しております。(動作未確認だけれども…)。
— さやちゃんぐbot (@songofsaya_) January 24, 2019
アセットとかは取り除いてある、純粋にスライド部分のみの構成です。https://t.co/euuC7MOcYm#gotandaunity https://t.co/8ZQGXO379m
他の方の感想ブログ
次回のGotanda.unity#11は3月頃とのことです。
直近の勉強会ですと「Unity Audio完全に理解した」と「VRM勉強会」があります。
完全に理解したシリーズですが、Audioの次はGitらしい。