Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Zenject Optionalアレコレ
Search
いも
December 15, 2018
Programming
1.5k
2
Share
Zenject Optionalアレコレ
「【年末だよ】Unity お・と・なのLT大会 2018」で発表した資料です
いも
December 15, 2018
More Decks by いも
See All by いも
UnityプログラミングバイブルR6号宣伝&Unity Logging小話
adarapata
0
620
Unityテスト活動のふりかえり
adarapata
1
620
Gather.townはいいぞ その後
adarapata
1
1.7k
Unityでの開発事例
adarapata
3
23k
どこのご家庭にもあるシーンマネージャーの話
adarapata
2
8.6k
Gather.townはいいぞ
adarapata
2
2.4k
宴はいいぞ
adarapata
0
1.9k
わかった気になるモブプログラミング
adarapata
1
160
モブワークっぽいのをやっている話/Trying mobwork
adarapata
2
1.3k
Other Decks in Programming
See All in Programming
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
110
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
130
ファインチューニングせずメインコンペを解く方法
pokutuna
0
250
Everything Claude Code OSS詳細 — 5層構造の中身と導入方法
targe
0
160
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
110
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.5k
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
180
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
580
Tamach-sre-3_ANDPAD-shimaison93
mane12yurks38
0
230
Rethinking API Platform Filters
vinceamstoutz
0
4.8k
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
3
440
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
6
1.1k
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Statistics for Hackers
jakevdp
799
230k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.1k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
140
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
53k
Designing for Timeless Needs
cassininazir
0
180
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.5k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
150
[SF Ruby Conf 2025] Rails X
palkan
2
880
Abbi's Birthday
coloredviolet
2
6.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.2k
Designing for Performance
lara
611
70k
Transcript
Zenject Optionalアレコレ いも(@adarapata) 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
自己紹介 いも(28) @adarapata XFLAG クライアントエンジニア スマブラSPはガオガエン adarapata.com 2018/12/15 【年末だよ】Unity お・と・なのLT大会
2018
今日の話 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
Zenject OptionalExtras ZenjectはDIとは直接関係ないけど便利な機能をいく つか提供している。 公式ドキュメントはあるけど、あまり日本語記事はな いので使われてるかどうかはわからない。需要はない かもしれない。 でも話そう。 2018/12/15 【年末だよ】Unity
お・と・なのLT大会 2018
Optionalな方々 TestFramework Signals MemoryPoolMonitor Re ection Baking 2018/12/15 【年末だよ】Unity お・と・なのLT大会
2018
TestFramework みんな大好きテスト機能の提供。現在は3種類のテス トに区分されている。 UnitTest IntegrationTest SceneTest Unity標準のテストクラスではDiContainerが用意さ れていないのでDIしているコードのテストが書きづ らい。なのでZenjectのテストクラスを使う。 2018/12/15
【年末だよ】Unity お・と・なのLT大会 2018
UnitTestとIntegrationTest https://speakerdeck.com/adarapata/zenjecttotesuto 以前に書いたのでこちらもどうぞ。 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
SceneTest 最近追加されてたテスト。シーンをサッと呼べる機能 が追加されている public class FooSceneTest : SceneTestFixture { [UnityTest]
public IEnumerator TestScene() { yield return LoadScene("FooScene"); // FooシーンにFooクラスがバインドされてるか? Assert.That(SceneContainer.HasBinding<Foo>()); } } 複数のシーンも一気に読み込める 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
こんなときに便利そう Zenject使いつつテスト書きたいとき というか書くならContainerを扱うのでほぼ必須 基本的にはUnitTestとIntegrationTest書いておけば なんとかなりそう SceneTestは、そもそもシーン単位でどういう風に 書いてくとベストなのかは模索中 UIにイベント流す機能もないので自前でがんば る 2018/12/15
【年末だよ】Unity お・と・なのLT大会 2018
Signals いわゆるPub/Subメッセージ機構 SignalBusを使ってメッセージを発行・購読できる UnityだとPub/SubはUniRx.MessageBrokerがよく 使われている印象 同一Container内だけでやり取りできるのが Zenject Signalの特徴 Unityアドカレで詳細を書いたのでそちらもご査収 ください。
http://adarapata.hatenablog.com/entry/2018/12/ 13/041721 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
購読側 public class UserJoinedSignal { public string Username; } public
class Greeter { public void SayHello(UserJoinedSignal userJoinedInfo) { Debug.Log($"Hello{userJoinedInfo.Username}!"); } } 送りたいイベントをclass or structにして、購読側は 受け皿のメソッドを作る 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
発行側 public class GameInitializer : IInitializable { readonly SignalBus _signalBus;
public GameInitializer(SignalBus signalBus) { _signalBus = signalBus; } public void Initialize() { _signalBus.Fire( new UserJoinedSignal() { Username = "Bob" }); } } Containerから SignalBus を受け取り、 Fire で送信する 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
Installer public class GameInstaller : MonoInstaller<GameInstaller> { public override void
InstallBindings() { SignalBusInstaller.Install(Container); // Signalを定義 Container.DeclareSignal<UserJoinedSignal>(); Container.Bind<Greeter>().AsSingle(); // Signalが来た時にGreeter.SayHelloに投げる Container.BindSignal<UserJoinedSignal>() .ToMethod<Greeter>(x => x.SayHello) .FromResolve(); Container.BindInterfacesTo<GameInitializer>() .AsSingle(); } } SignalをBindする 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
こんなときに便利そう 不特定多数からのイベントを受け取らなくてはな らないとき Pub/Subで疎結合にしたいけどグローバルにどこか らでもメッセージが来るのは不安というときに なんでもかんでもSignalにするとあちらこちらに飛 び回ってデバッグしにくいのでほどほどに(個人の 感想です) 2018/12/15 【年末だよ】Unity
お・と・なのLT大会 2018
MemoryPoolMonitor Zenject MemoryPoolの状況を可視化できる そもそもZenject MemoryPoolとは 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
Zenject MemoryPool Unityでのオブジェクトプールを実現する機能 Containerでインスタンスを管理してくれる PureClass、MonoBehavior両方対応 MonoBehaviorの場合Active/非Activeで対応す るっぽい MemoryPoolは標準機能で、MonitorがOptional 2018/12/15 【年末だよ】Unity
お・と・なのLT大会 2018
public class Foo { public class Pool : MemoryPool<Foo> {
} } public class Bar { readonly Foo.Pool _fooPool; readonly List<Foo> _foos = new List<Foo>(); public Bar(Foo.Pool fooPool) { _fooPool = fooPool; } public void AddFoo() => _foos.Add(_fooPool.Spawn()); public void RemoveFoo() { var foo = _foos[0]; _fooPool.Despawn(foo); _foos.Remove(foo); } } 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
public class TestInstaller : MonoInstaller<TestInstaller> { public override void InstallBindings()
{ Container.Bind<Bar>().AsSingle(); Container.BindMemoryPool<Foo, Foo.Pool>(); } } Factoryと同じ感じで書ける 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
MonoBehaviorの場合は MonoMemoryPool でOK public class FooBehavior : MonoBehavior { public
class Pool : MonoMemoryPool<Foo> { } } Zenject Factoryと組み合わせることもできる public class Foo : IPoolable<IMemoryPool> { private IMemoryPool _pool; public void OnSpawned(IMemoryPool p1) => _pool = p1; public void OnDespawned() => _pool = null; public class Factory : PlaceholderFactory<Foo> { } } // Foo.Factory.Create()の裏側でPoolされる Container.BindFactory<Foo, Foo.Factory>() .FromPoolableMemoryPool<Foo>(x => x.WithInitialSize(10)); 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
Zenject Pool Monitorで現在Poolしている数を 確認できる NumTotal: 現在Poolしている合計数 NumActive: 現在使われている数 Num Inactive:
現在使われていない数 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
こんなときに便利そう Zenjectに乗っかりつつも、メモリコストを抑えた いとき オブジェクトプールを自分で書くのが面倒な時に Zenject Factoryの恩恵に与れるのがミソ Monitorがあるので把握しやすい でもガリガリチューニングしたいときはそもそも Zenject使わない可能性 2018/12/15
【年末だよ】Unity お・と・なのLT大会 2018
Re ection Baking Installerの実行時間を短縮する機能 Inject時のリフレクションがボトルネックになりが ちなので、対象のメソッドやクラスの情報を予め Bakeしておく staticに情報が保持されるので速いっぽい。 裏側では cecil
というライブラリが動いてる https://github.com/jbevain/cecil 既存のアセンブリに任意のILを差し込める凄いやつ 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
[Create] -> [Zenject] -> [Re ection Baking Settings] 設定ファイルが爆誕する 2018/12/15
【年末だよ】Unity お・と・なのLT大会 2018
Include Assemblies にBake対象のアセンブリを指定 名前空間のパターンマッチングでもいいらしい(未 検証) エディタ上で確認したいときは Is Enabled In Editor
2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
早くなるの? ZEN_INTERNAL_PROFILING で確認してみる ↑を入れるとSceneContext.Awakeの実行ログが吐か れて便利 公式のSample SpaceFighter で確認してみる 2018/12/15 【年末だよ】Unity
お・と・なのLT大会 2018
Before After 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
サンプルプロジェクト規模だとわから なかった 公式だと起動時間が最大45%短縮したらしい 俺たちのZenjectを信じろ 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
こんなときに便利そう Installer部分がボトルネックになっているとき 検証は簡単なのでとりあえずやってみるのは良さ そう ファイルサイズが少し増えるはずなので注意 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018
まとめ Optional Extrasは色々面白いのがある ZEN_INTERNAL_PROFILING で数値見ていこう 日本語記事は少ないのでみんなで書こう 流行って! 2018/12/15 【年末だよ】Unity お・と・なのLT大会
2018
おわり 2018/12/15 【年末だよ】Unity お・と・なのLT大会 2018