Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

勉強会レポ : Gotanda.unity #10

勉強会のレポート(メモ)です。
参加したのはこちら、「Gotanda.unity #10」
ごたゆにも記念すべき10回目です。

meetup.unity3d.jp

ハッシュタグ : #gotandaunity

 

 

 

 

 

タイムスケジュール

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~ 解散

 

 

 

スポンサー様

会場提供はアカツキ
懇親会のサポートはキッズスターとワンダープラネットです。

もんりぃさん(キッズスター)

知育アプリ「ごっこらんど」をリリースしています。やってね。
正社員採用というわけではないですが、フリーランスの方募集してます。

なりきり!!ごっこランド - KidsStar.TV

 

ひらきさん(ワンダープラネット)

WANTEDLYでフォローしてください。積極採用中です。

ワンダープラネット株式会社の会社情報 - Wantedly

 

 

 

 

 

LT #1 : スクリプトの処理を効率化してゲームを軽くしよう

ゲームを作っていて画面が重い、ゲーム中スパイクが挟まるなんてことありませんか?
こういうのはすこし手直しすれば治ります。

基本的に原因はスクリプトと描画処理です。
今回はスクリプトで調べる方法と解決パターンを話します。
調べる時はプロファイラを使いましょう。
Deep Profileを使うと深くまで知ることができます。

 

どこが重いのか

プロファイラ内で大きく跳ねるフレーム、平均して大きく占めている所が重いところです。
16.67msまでに抑えると 60fpsだすことができます、

 

よくあるパターン

・Updateで不要な処理を行う。
 本当に必要な処理か考える。不要なら消す。
・空のUpdateは消す。
・不適切なLINQを使っている
 便利だが重い。基本的に使わないようにするか、一箇所にまとめる。
 結果を使いまわす時は値をキャッシュしましょう。
・ファイル入出力の回数を減らしましょう
GCを抑えましょう。
・メモリアロケーションを減らしましょう。
・ボクシングを起こさないようにしましょう

 

 

 

 

LT #2 : どこから始めるUnityテスト

speakerdeck.com


テストをどこから始めるか。よくあるコードに対してユニットテストを書いてみます。
結論をいうとしんどいので止めた方がいいです

テストしやすいものとしにくいものを切り離しましょう

UnityではUnityAPIに依存していないものはテストしやすい。
逆にUnityAPIに依存しているもの、GUIはテストしにくい。正しい動きをしているか定義することが難しい。
Inputへの依存をやめる、入力部分をインターフェースにしてキー入力を意識させない。
MonoBehaviourはテストしにくい。

 

個人開発だとテストはそこまで有効ではないが、設計の問題を見つけるのに有効です

 

 

 

 

LT #3 : ECSベースのVRMSpringBoneを実装してみた話

docs.google.com


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と暗号化

docs.google.com

フリーの時期にしていたことの話をします。
実はその間、Vroid SDKの制作に携わってました。
言っていいかわかりませんが、来週の月曜日に出ます。

 

Vroid SDKとは

VRMファイルのダウンロードと表示を行う。
VRMファイルの暗号化を行う。
 セキュリティ的な話の解決。

 

VRMのストロングポイント

・環境に依存しない
VRMファイル1つで完結している
・ランタイムダウンロードができる
・人型に特化

ここでデモ

 

現在あまりドキュメントはないのでソースコード読んで使う必要があります。
VRMには、せっかく作ったVRMが勝手に使われる問題があります。

 

UnityCipher

前職で作った暗号化ライブラリがそのまま使えるかもしれない、その名もUnityCipher。
お手軽にお堅い暗号化ができます。
ブロック暗号CBCモードを使っています。
「あああ」をあるときは「いいい」、あるときは「ううう」と暗号化するのが特徴です。

qiita.com

 

 

 

 

ここで休憩

 

 

 

 

LT #6 : PUN2を使おう!

drive.google.com

PUN2はPUNの後継バージョンです。
互換性がないが大きく改善されました。


1. 動作がちょっと軽くなりました

2. 新しいAPI

 今までSendMessageだったものがInterfaceになった。

 

3. いろいろ整理されていていい

 フォルダが整理されている、名前空間が整理されている。
 今までPUNかRealtimeでごっちゃになっていたアセンブリが整理されている。テストがかけるよ。

 

4. わりと移行ができる

移行用のドキュメントが充実しています。

 

 

 

 

LT #7 : VRM対応スマホアプリのすすめ

www.slideshare.net

Vスタンプの紹介 デモ
好きなVRMキャラクターを使うことができます。

f:id:Raspberly:20190124015423j:plain

VRMメリット

・手軽にインポートできる。
・骨が共通なのでモーションを使いまわすことができる。
・ユーザーの好きなキャラクターを登場させることができる。

 

VRMファイルの扱い

スマホで使いやすくするにはローカルのどこに保存するべきか。
アプリごとに生成されるフォルダに格納しましょう。
しかしAndroidの場合は階層がちょっと深いなので保存先を変えています。
こうするとアプリと関係ない外のフォルダなのでアンインストールで削除されないことに注意。

 

VRMスマホで使いやすくするには、スマホに送る手段が大事。
Androidの場合は指定のフォルダに移動する仕組みがアプリ内に必要。

 

 

 

 

LT #8 : もう「ぼくが持ってるUnityと違う…」ではない!HDRPで劇的にルックを変えよう!~部屋とかキャラのセットアップをしてみる。~

scrapbox.io

詳しい手順はスライドを見てください。

 

HDRPを広めるために登壇しました。
最初のセットアップに躓かないような初心者向けの内容です。

まず始め方、UnityHUBから起動しましょう。
プロジェクトテンプレートを設定しましょう。後から入れると赤いエラーがたくさん出ます。

基本的にフォトリアルと相性がいいです。

ミラー(鏡)が簡単に作ることができます。
そんなに難しくないのでおもしろく触ってみてください。
いずれガンにも効くようになります。

 

 

 

LT #9 : 簡単な弾幕をつくる

docs.google.com

弾幕の作り方について紹介します。

 

プレイヤーに弾を飛ばす

方法は2つあります。
Vector3.MoveTowardsを使う方法と、ベクトルを使う方法です。
弾を動かすにはrigidbody2dを使います。

ただしベクトルを使う場合、大きさが変わらないよう正規化をする必要があります。

 

弾を追尾させる

同じく2つやり方がありますが、軌道を修正させ続ける必要があるためUpdateでやります。
上と同様に、正規化をしないと速度が遅くなってしまう。


全方位に弾を飛ばす

弾の配置はサインコサインを使っていきます。この通りに使えばきれいになります。

三角比の拡張 | 数学I | フリー教材開発コミュニティ FTEXT

 

うずをまいて飛ばす

 放出する角度を小さくするだけで実現できます。

 

 

 

 

 

 

感想

メモリ関連とVRMの話題が多かったですね。
VRMは今流行りの技術ですし、メモリ回りは最適化の観点からも重要な所です。

 

「LT #2どこからはじめるUnityテスト」が個人的によかった。
テストがうまくいった・いかなかっただけでなく、テストがしやすいかどうかで設計の問題を見つけるという観点がとてもおもしろい。

懇親会のお寿司ではエビが不人気という知見を得ることができました。

f:id:Raspberly:20190124134846j:plain

 

今回はunity1weekMeetup2019でも好評だったホワイトボードコーナーがありました。

f:id:Raspberly:20190124134857j:plain


 

 

 

 

 

タイムライン

 

 

他の方の感想ブログ

ka8.hateblo.jp

 

 

次回のGotanda.unity#11は3月頃とのことです。
直近の勉強会ですと「Unity Audio完全に理解した」と「VRM勉強会」があります。

connpass.com

connpass.com

完全に理解したシリーズですが、Audioの次はGitらしい。