もんりぃ is undefined.

育児ネタとか、技術ネタとか。

AssetBundle の地雷を踏んだお話し

はじめに

今日また Unity の AssetBundle の地雷を踏んだので、同じ地雷を踏まないように記録として残します。

なお、この地雷は私自身が埋めたものであり、普通に使う分には起きないものなのでご安心ください。

経緯

とあるプロダクトの AssetBundle を更新したところ、以下のような不可思議な現象が発生するようになった。

  • 最新版(v1.1.0 としておく)を新規インストールする分には問題ない
  • 一つ前のバージョン(v1.0.0としておく)を(DeployGate などから)インストールする分にも問題ない
  • v1.0.0 で AssetBundle をダウンロードしておいて、v1.1.0 で AssetBundle を更新すると 一部の AssetBundle のみ更新されない
  • しかも、「v1.0.0 でダウンロードだけした場合」は問題無く、「v1.0.0 でダウンロードし、実際に使われている画面まで進んだ場合」が NG

とても不可解な現象で、CDN のキャッシュとかも疑ったけど問題無さそうだった。

前提

とあるプロダクトの AssetBundle 要件としては以下のような感じだった。

  • タイトル画面に入るタイミングで必要な AssetBundle を全てダウンロードする仕組みになっている
  • AssetBundle Manifest を用いずに、URL のみでキャッシュ管理を行っている
  • URL の中に各 AssetBundle のバージョン的なものを示す数値が含まれる
    • https://example.com/v1/foo.unity3d
    • https://example.com/v1/bar.unity3d
    • https://example.com/v2/foo.unity3d
    • みたいな感じ
  • ダウンロードのみを行うメソッドと、読み込みを行うメソッドが分かれている

原因

前提のなかで記載している「読み込みを行うメソッド」の中で使っている UnityWebRequestAssetBundle.GetAssetBundle()オーバーロード(string url, uint crc) ではなく (string url, Hash128 hash, uint crc) になっており、更に hash には new Hash128() を渡すという状態になっていた。

分析

詳細な仕様は分からないが、キャッシュ周りの仕組みは以下のようになっていると考えられる。

なお、 crcチェックサム)については話がヤヤコシクなるので割愛。

  1. ダウンロードされた AssetBundle を GetAssetBundle() の引数に応じて保存
    • hashversion が渡されていない場合は、AssetBundle の実体から取得できる AssetBundle Name *2 をそのままファイル名として利用して保存 *3
    • hashversion が渡されている場合は、 AssetBundle Name と hashversion をファイル名に加えて利用して保存
  2. GetAssetBundle() の引数に渡された URL と AssetBundle Name との対応表的なものを別途保存
    • ココでは hash とか version は記録されていないんじゃないかと思われる

で、今回のケースの場合、ダウンロード時と読み込み時に引数が異なってしまっていたコトが原因で、以下のような感じになったものと推察される。

ここでは、 https://example.com/v1/foo.unity3d, https://example.com/v2/foo.unity3d という AssetBundle をダウンロードする場合を考える。

  1. v1.0.0 のダウンロード処理
    • 対応表に https://example.com/v1/foo.unity3d に該当する AssetBundle Name が見付からないのでダウンロードが開始される
    • hash ナシのファイル foo.unity3d が保存される
    • 対応表に "https://example.com/v1/foo.unity3d":"foo.unity3d" 的な情報が書き込まれる
  2. v1.0.0 の読み込み処理
    • 対応表に 1. で保存されたhttps://example.com/v1/foo.unity3d に該当する AssetBundle Name はあるが、キャッシュの実体として hash アリのファイルが見付からないので、ダウンロードが開始される
    • hash アリのファイル 00000000000000000000000000000000-foo.unity3d が保存される
      • new Hash128() を渡してしまっているので、実際のハッシュ値00000000000000000000000000000000 とかになると思われる
  3. v1.1.0 のダウンロード処理
    • 対応表に https://example.com/v2/foo.unity3d に該当する AssetBundle Name が見付からないのでダウンロードが開始される
      • URL のバージョン番号のところが異なるのでキーがないはず
    • hash ナシのファイル foo.unity3d が更新される
    • 対応表に "https://example.com/v2/foo.unity3d":"foo.unity3d" 的な情報が書き込まれる
  4. v1.1.0 の読み込み処理
    • 対応表に 3. で保存された https://example.com/v2/foo.unity3d に該当する AssetBundle Name があり、更に 2. で保存された hash アリのファイル 00000000000000000000000000000000-foo.unity3d が存在するため、キャッシュから読み込みが行われる
    • 結果として古いファイルが読まれてしまう!

所感

いや、はい。同じオーバーロード使わなかったオレが悪いんです。

引数省略せずに、素直に AssetBundleManifest.GetAssetBundleHash() とかで取得出来る Hash を使うと良いんじゃないでしょうか。

この辺のキャッシュの詳細な資料ってどこかに転がっていませんかねぇ…?

*1:ホントは改竄対策とか中途切断のコトとか考えるとダメなんだけど、日和ってます

*2:Inspector で設定するアレ

*3:いや、内部的にはハッシュ値とか取ってるかもだけど分からん

Unity 2018.3 Beta で気になったポイント

はじめに

2018/09/11 に Unity 2018.3.0b1 が公開されました。

2018.2 がリリースされてから結構経過していますが、無事にベータリリースが行われて安心しています。

ってことで、リリースノート読んで気になった項目をピックアップしてみたいと思います。

ピックアップ

Features

新機能について。

Android: Added support for requesting permissions at runtime.

  • これで Native Plugin 書かなくて済む…!

Android: Kotlin source files now can be used as plugins.

  • Kotlin 書いたコトないけど、嬉しい人多いっぽい。

Android: OpenJDK will be included into Unity Android support, user will no longer be required to install Java.

  • 遂に Java8 のインストールから解放される…w

Editor: Introduced searchable Unified Settings window for Project Settings and Preferences

  • 何が何処にあるのか分からん問題が解消される。

Editor: Rider installation path detection in Editor Preferences.

  • JetBrains さんとの蜜月関係が良いですね。いいぞもっとやれ。

Graphics: Added memoryless framebuffer depth to iOS Metal.

  • 良く分かってないけど、iOS でのパフォーマンス良くなるのかな?

Multiplayer: Added support for providing a custom network transport implementation to be used by Unity Multiplayer's high-level API. Refer to the documentation on UnityEngine.Networking.NetworkManager.activeTransport for details.

  • これは例の GCP と組んで民主化が云々のヤツかな?

Package Manager: Added support for packages in the Project Browser.

Physics: Added complete set of non-allocating 2D queries to new multi-scene PhysicsScene2D type.

  • サッパリ何のこっちゃか分からんけど、なんか気になる。

Physics: Added the ability to have a per-scene physics world allowing separate simulation and queries (3D physics).

  • マルチシーン関連の Physics が改善されてるのかな?

Playables: Exposed the time wrap mode for Playables.

  • 経過時間分かるとかだったら嬉しいけど、そうなのかな?違う?

Playables: Implemented a method to send notifications through the playable system.

  • Playable イベント関連の話かな?

Player: [Also mentioned under API Changes] Added AssetBundle.RecompressAssetBundleAsync API to re-compress downloaded AssetBundles from one compression methodology to another runtime supported compression methodology. Moved BuildCompression, CompressionLevel and CompressionType out of the UnityEditor.Experimental.Build.AssetBundle namespace and into UnityEngine.

  • AssetBundle おじさんとしては気になる。
  • ランタイムで再圧縮できるとかそういう話?

Prefabs: New Improved Prefab Workflows (Not preview nor Experimental)

  • Nested Prefab キタ━━━━━(゚∀゚)━━━━━!!!!
  • Not preview nor Experimental という所につよさを感じるw

Scripting Upgrade: Enabled Roslyn compiler and C# 7.2 when targeting the new scripting runtime.

  • C# 7.2 キタ━━━━━(゚∀゚)━━━━━!!!!
  • Preview 外れるの早かった!(Incremental Compiler のコトで良いんだよね?)

Scripting Upgrade: The .NET 4.x scripting runtime is now the default. The .NET 2.0 scripting runtime has been deprecated and support for it .NET 2.0 will be removed in a future release.

  • ようやく .NET 4.x がデフォになってくれた!
  • むしろ遅すぎたくらいだw

Backwards Compatibility Breaking Changes

破壊的変更について。

Android: Deprecated Internal build system

  • マジか。ビルドシステム Gradle に切り替えないと…。

Web: WWW is now obsolete. Use UnityWebRequest instead.

  • 今までありがとう。 R.I.P.

Changes

Build Pipeline: Calling BuildPipeline.BuildPlayer while scripts are being compiled will now wait for compilation to complete before beginning the build process, rather than aborting compilation.

  • 地味に困ってた感じもあるので嬉しい。

iOS: iOS/tvOS simulators players are now distributed as dylibs.

  • 遂にシミュレータが使える…?元々使えたっけ?

iOS: The Mono scripting backend has been marked as deprecated.

  • 今までありがとう。 R.I.P.

Improvements

2D: Added an option in Sprite Editor to display pivot position in pixels and snap pivot to pixels when you drag it.

  • まだそこまで Sprite Editor ガッツリ使ってないけど、レベルデザイナさん的には嬉しい?

2D: Added Isometric support for 2D Tilemap.

Android: Added option to start Android app in non-fullscreen mode.

  • Android の非フルスクリーンが使えるようになる。
  • 今までは Native Plugin 書いてたからちょっと便利になるね。

Android: Added WebCamTexture acceleration for Android 5.0 and later.

  • WebCamTexture が Android でのパフォーマンス良くなる。
  • VTuber 業が捗りますね。

Android: Improved player loading time on Android devices.

  • Android 版のアプリ起動時間長かったから嬉しい。

Animation: Animator will not automatically create an empty output when it doesn't have an AnimatorController assigned

  • 不要なアセットが作られなくなる。
  • 毎回消してたりするのでちょっと嬉しい。

Editor: Added warning when assembly definition file (asmdef) assemblies are not loaded on startup where one or more of their asmdef references are not being compiled due to having no scripts. Also added warning when compiling asmdefs with no scripts in the Editor.

  • Assembly Definition 周りのサポートもより手厚くなってきてる。

Package Manager: Add references to package manager asmdef files from the Object Selector

  • UnityEngine.TextMeshPro とかを直編集で追加してたから助かる。

Package Manager: Upm now provides the author information of packages

Physics: Upgrade the PhysX version to 3.4.2. This is the latest release up to date.

  • そもそも今のバージョン知らないけど、より速くなるらしい。

UI: Added Sprite Atlas Late-Binding support for UI.

  • Sprite Atlas の遅延読み込みサポート。
  • Addressables との絡みもあるけど、メモリ効率考えると嬉しい話だ。

Web: UnityWebRequest will now support cookies in the same game session. Also added API to remove them.

  • UnityWebRequest で Cookies サポートか。
  • 普通に Token で認証してるケースが多い感じもするけど、嬉しい人は嬉しそう。

API Changes

2D: New experimental API to set preview texture for SpriteEditorWindow with Experimental.U2D.ISpriteEditor.SetPreviewTexture. Importers that support ITextureDataProvider can also provide custom SpriteEditorWindow preview texture by implementing Experimental.U2D.ITextureDataProvider._previewTexture.

  • まだ Experimental だけど、 SpriteEditor 周りのエディタ拡張が便利になってくる…!

iOS: Added support for Telephoto, Dual Back and True Depth cameras on iOS devices (new enum WebCamKind, new properties WebCamDevice.kind, WebCamDevice.depthCameraName, WebCamTexture.isDepth).

  • 結構 WebCam 周りの対応に力を入れてくれている。
  • VTuber 関連のブームもあるので、正しいタイミングな気もする。

Scripting: Added an optional exitCode parameter to Application.Quit().

  • ビルドおじさん歓喜

Fixes

気になるのはイッパイあるけど、そもそも項目がメッチャ多いので、かなり抜粋。

Asset Import: Fixed issue with MonoBehaviours and ScriptableObjects not being recognized in .NET 4.x .dlls after changing scripting runtime version from .NET 3.x to .NET 4.x. (1012922)

  • ウチのケースが該当してるのかは分からんけど、偶に認識されないコトがある問題が解消される?されない?

Build Pipeline: Fixed issue where EditorBuildSettings was not updated when a scene was moved or renamed.

  • Scene のファイル名変えても Scenes in Build の中身が変わってくれない問題が直ったらしい。嬉しい。

Editor: Fixed an issue where "Shift+Tab" does not navigate backwards on OSX. (1065620)

  • 気付いてなかったけど、 Shift + Tab 利いてなかったんだね。

所感

待望の Nested Prefab 来ましたね!

そして、 C# 7.2 もマジで嬉しい!

全体的に 2D 系のサポートを頑張っている印象があります。

個人的には Unity Package Manager の民主化がいよいよ間近…?という感じがしてソワソワしています。

Unity を batchmode で起動した場合に EditorApplication.update が走らないコトがある問題

前提

  • 今、お仕事で「Jenkins 上で AssetBundle のビルドを走らせて、終わったら差分を S3 に上げつつ GitHub にも push して PullRequest を作る」という仕組みを作ろうとしています。
  • そのためには、 -batchmode というコマンドライン引数を付けて、 -executeMethod 引数で実行する public static な自作メソッドを指定して Unity を起動したうえで、そのメソッド内で BuildPipeline.BuildAssetBundles() なるメソッドを叩く必要があります。
    • いや、 -batchmode 使わない方法もあるかもだけど、CI する上ではほぼ必須のオプションだと思ってます。
  • で、更に、処理が終わったら自動的に Unity Editor が Exit して欲しいので -quit オプションも付けます。

現象

  • 非同期なコードが一切実行されない!
    • 最初は UniRx を使って async/await を使う感じの実装にしてました。
    • で、動かないんで「async/await だめかー。素直に UniRx で SelectMany とか Concat とかで処理繋ぐかー。」って書き換えてもダメ。
  • というか、ログを仕込んで確認したところ UnityEditor.EditorApplication.update がコールバックされている気配がない。

調査

  • Unity Answers で同じような悩みを持つ人の質問を発見。
    • 回答曰く「 -batchmode でも EditorApplication.update 動くよー」トノコト。
  • 更に深掘りしてググった所 -quit が怪しい説に辿り着く。*1
  • で、試しに -quit を外したところ見事に動く。
  • 推測も含むが、 EditorApplication.update のコールバックが発動するのは -executeMethod で指定したメソッドの処理が終わった後からになるっぽく、その所為で -executeMethod の処理シーケンスの中では非同期的な処理を仕込んでも何も起きなかった、という感じっぽい。

対策

  • 関連する全ての非同期なコードを同期なコードに書き換えました。
  • 基本的には、CI 環境にインストールされている aws コマンドとか、 git コマンドとか、 hub コマンドとかを叩くだけなので、 System.Diagnostics.Process をゴリゴリ回せば OK ってコトで。

所感

  • いやー、罠だった。
  • でも、お陰で UniRx の MainThreadDispatcher とかを熟読できたので、良かったってコトにしておこう。

*1:そう思った根拠となる記事を見失ってしまいました…。

リモートワーク Rev.17 / 一緒にお出かけ

はじめに

  • ここ1ヶ月くらい、毎週火・水・木をリモートワークデーにしています。
  • この記事も、自宅リモートからのオフィス移動中に書いてます。
    • 妻と娘と一緒に家を出て、駅までお喋りしながら歩いて、駅で別れて電車なう。
  • てことでいつもの振り返り。

KPT

Keep / Good

  • めっちゃ集中できる。
  • コワーキングスペースで作業する時は、他人の目があるので良い意味で刺激になる。
  • 家族とも触れ合える。
    • 妻と娘のお出かけに合わせて外で昼食をとる、といったコトもできている。

Problem

  • 社内の状況把握が難しくなる
    • もともと情報共有が上手な組織ではなかったので、Pull 型の情報取得をしないとダメな感じ。
    • とは言え、だいぶ esa に情報を残す習慣が出来てきているので、以前よりはマシなのかな?(比較できないので憶測。)
  • コワーキングスペース代がバカにならない
    • 定額利用的な方式でお金を払っているので、それなりに家計にインパクトがある。
    • が、逆に「副収入を得るぞ!」という気持ちになれるので、追い込み駆動開発ができるメリットもあるw
  • やっぱりいつまでも仕事してしまう
    • 個人活動の時間を捻出できない原因の一つなので問題。

Try

  • esa をチェックする時間を設ける
  • コワーキングスペース代をちゃんと回収する
    • アイディアはあるので、時間作って実行するだけ!
    • 副収入関連の税金とか調べないと…。
  • ちゃんと定時で切り上げる
    • タイマーとか仕込む

Assembly Definition Files の地雷ポイントについて解説してみる

はじめに

この記事はUnityゆるふわサマーアドベントカレンダー 2018の7日目の記事になります。

qiita.com

6日目の記事は@Nitudonさんの「IncrementalCompiler時代のUnityC#Tips(C#7.2)」でした!

私の記事では、Assembly Definition Files を使う上での地雷ポイントをダラダラと書き殴ってみたいと思います。

🤔 Assembly Definition Files is 何?

もの凄く粗く言うと「Unity における C# スクリプトコンパイル単位を分割する機能」って感じです。

詳しくは Gotanda.unity #7 にて LT をした際の資料がありますので、そちらをご参照くださいませ。

speakerdeck.com

また、テラシュールブログさんの記事もとても分かりやすいので、あわせて紹介しておきます。

tsubakit1.hateblo.jp

💣 地雷ポイント

この記事では、上記 LT 資料の後半に書いた内容を深掘りしてみたいと思います。

1: AssetBundle と組み合わせるとヤヤコシイ

Scene / Prefab / ScriptableObject などを AssetBundle から読み込んでいる場合に、それらの Asset から参照されるスクリプトを Assembly Definition Files 対応する場合は、AssetBundle の再構築が必須になります。

詳しい顛末はこちらの記事にまとめてありますので、ご参照くださいませ。

2: static メソッドを用いている場合に参照の追加でハマりがち

そもそも Assembly Definition Files を適用した場合、 .asmdef ファイルの単位で dll が分割されることになるので、そのままでは dll 外のクラスなどが参照できなくなります。

この問題を回避するために、References という機能が用意されており、「この .asmdef から生成される dll は、References に定義されている .asmdef から生成される dll 達を参照する」という設定を施すことができます。

この機能を設定する必要がある時というのは The type or namespace name 'FooBar' could not be found. Are you missing an assembly reference? といった類いのコンパイルエラーが出るので、その型を含む .asmdef を探して References に追加するワケです。

で、この節での地雷ポイントとしては「親クラスで定義されている static メソッドを用いる場合には親クラスが属する .asmdef も References に追加する必要がある」という点になります。

例えば以下のようなコード群があるとします。

// Parent.cs (A.asmdef)
public abstract class Parent
{
    public static void Foo()
    {
        // Do something
    }
}

// Child.cs (B.asmdef)
public class Child : Parent
{
}

// Usage.cs (C.asmdef)
public class Usage
{
    public void Bar()
    {
        Child.Foo(); // ココで、本来は Parent のメソッドである Foo() を Child 経由でコールしている
    }
}

このような構造の場合、 B.asmdef から A.asmdef を参照し、 C.asmdef から B.asmdef を参照するだけで問題無さそうにも見えますが、実際には Usage.cs から Parent.cs に含まれる static メソッドを実行しているため C.asmdef からは B.asmdef に加えて A.asmdef も参照しないと NG というコトになります。

static が不必要に濫用されているプロジェクトの場合、この辺の管理が相当大変になることが予想されます。

3: partial クラスが使いづらくなる

元々 C# には partial という仕組みがあり、あるクラスの定義を複数のファイルに分割定義することができます。

// Foo1.cs
public partial class Foo
{
    public void Bar()
    {
    }
}

// Foo2.cs
public partial class Foo
{
    public void Baz()
    {
        this.Bar();
    }
}

この分割されたクラスを別々の Assembly として定義し、dll を分割した場合にはお互いに参照ができなくなるため、たとえ References の設定をしていたとしても this.Bar(); の行でコンパイルエラーが発生します。

partial は、Assembly の中での分割定義をサポートする機能に過ぎないため、Assembly Definition Files を用いる時点で殆どその機能を有効に使えなくなると言えます。

4: IDE のサポートが薄い

Visual Studio や JetBrains Rider などの IDE 側のサポートがまだ薄いため、2018年8月上旬時点では「自動的に import を追加する際に、 .asmdef も修正する」といった気の利いた機能がありません。*1

毎回 Unity Editor と IDE とを行き来するのがちょっとだけ面倒だったりするので、IDE 側の手厚いサポートが待たれますね。*2

5: 時々「全スクリプトコンパイルが無効になる」などの謎エラーが発生する

原因がサッパリ分からないのですが、時々以下のような現象が発生します。

  • 全ての Scene, Prefab, ScriptableObject が参照するスクリプトが Missing になる
  • -batchmode 引数を付けてコマンドラインから起動する際に -executeMethod で指定するクラスを見つけてくれなくなる

これらの現象が発生すると、マシンを再起動する別のバージョンの Editor で開き直すかをしないと現象が改善しません。*3

Library/ScriptAssemblies/ 以下を全消ししても改善しないことから、マシンレベルで何らかのキャッシュをしてしまっているものと思われますが、今の所詳細は不明です。

🎉まとめ

適切に使えばコンパイル時間が短くなるなどのメリットがある Assembly Definition Files ですが、未だに多少の問題点が残っていたり、これまで使えていたハックが使えなくなる可能性があったりします。

各プロジェクト毎に、「導入すべきかどうか?」は適宜判断する必要がありそうです。

さて、Unityゆるふわサマーアドベントカレンダー 2018の8日目は@baba_s_さんの「TextMesh Pro で文字列中に表示したい画像を Sprite Atlas に簡単にまとめられる「Simple Sprite Packer」紹介」です。楽しみですね!

*1:私が知らないだけで、「あるよ!」という場合にはコメント欄などでお教えいただけると幸いです。

*2:Rider は 2018.2 というバージョンでサポートされるという噂があります。

*3:完全にこれで直るかどうかは怪しい所だったりもしますが、経験上コレで何とかなっているケースが多いです。

おなかソフトの DontDestroyOnUnload #1 に参加してきました

なにそれ?

  • connpass
  • Unity Technologies Japan を退職し株式会社オーナカ(おなかソフト)を立ち上げられた伊藤周さんがメインパーソナリティを務めて繰り広げられる座談会形式の勉強会
  • 2018/07/30 に第1回が開催され、80人近い Unity デベロッパが会場のドリコムさんに集結

トークセッション

スピーカー

  • 株式会社オーナカ 伊藤周さん
  • 株式会社 Kissaki 井上徹さん
  • 個人ゲーム開発者 とりすーぷさん
  • 株式会社ドリコム 西村拓也さん

内容

Singleton について

  • 毎度お馴染み SingletonMonoBehaviour をはじめとする Singleton パターンについて議論
  • 結論としては、「必要に応じて」という感じ
    • もちろん、絶対悪などではなく、理解して使う分にはアリ
  • テストを書きにくい、とかは「ホントそれな」という感じ
  • 個人的感想としては、「可能であれば Singleton 的な責務を Zenject に寄せるとスッキリするのでは?」と思った。

MVC, MVP について

  • これも中々に議論が白熱しがちな内容
    • 皆さんとても冷静にトークしていました
  • これも、結局の所は適材適所という話なんだけど、「インゲームでは無理して使わない」という意見は興味深かった
  • Clean Architecture 派の私としては、どうにかしてインゲームにも活かしたいなぁとか思ってるので、色々模索したい

サウンドについて

  • これも思うところがある人は多そう
  • 私は殆ど知見がないので「へー」という感じでした
  • 個人的には、BGM は Singleton に近い形で実装して、SE とかボイスは Timeline ってのが面白いかもなぁ?とか思ってるマン

懇親会

  • 物凄く盛り上がってた
  • 知り合いの近くに行ってからその場に居る初めましての人とお話しする、みたいな流れで色々な方とお話しできた
    • 「マンガでわかる Unity」をご存じの方も居て嬉しかった
  • さすがドリコムさんは、イベント運営慣れしている感じで「とても滞りない進行だなぁ」と感心しきりだった
  • 勉強会の内容とは関係ないけど、ドリコムさんのカフェスペースは、ボドゲとかダーツボードとかあって楽しそう && 全体的にウッディーでお洒落感ハンパなかった

所感

  • 個人的な収穫の一つは UniRx 作者の @neuecc さんとお話しできたコト
    • 尊敬するエンジニアの一人とお話しできるって、冷静に考えると凄い話だ…!
    • 他にも UTJ の中の人やら、日本 Android の会 Unity 部の人やら「つよいひと」が沢山いらして、色々お話しできて良かった!
  • 第2回の話も早速動き出しているようで、自分も僭越ながら「AssetBundle ビルドとか Player ビルドとかについて語りたいです!」と挙手させていただいたので、上手く行けばバ美肉できるかも!?w

Gotanda.unity #7 に登壇しました

はじめに

2018/07/25 (Wed) は、Gotanda.unity の第7回にして開催開始1周年という記念すべき回が開催されました!

Gotanda.unityid:lycoris102 が主催する Unity の勉強会イベントで、タノシム株式会社株式会社キッズスター とで懇親会費の協賛を行っており、私自身も運営スタッフとして関わっております。

今回は mixi Inc. さんに会場をお借りして開催いたしました。

LT 大会というコトで、私も登壇側として発表を行ったので、そのことについて纏めます。

登壇

speakerdeck.com

最近色々とハマってる *1 AssemblyDefinition について話してきました。

8分の持ち時間の中で、スライドの枚数が50枚を超えるという暴挙をヤラカシているので、今までにないくらいのスピードで喋りましたw

内容が内容なので、あまり端折るのも違うかなぁ?と思い、スライドをガッツリ書いてしまったので、会場のフィードバックを確認しながら進めることができなかったため、「実際どうだったのか?」が気になる所ではあります。

補足

スライドの中で Animated GIF を使っている箇所があるのですが、 SpeakerDeck に上げる際に PDF 化した時点でアニメーションしなくなってしまうので、以下に補足します。

P.29 .asmdef ファイルを作る

P.37 依存管理

P.41 Editor Assembly

所感

第7回は約70名の方にお越し頂いて、登壇者やスタッフや会場の mixi さんの方などあわせると80名以上の Unity エンジニア・デザイナが集まるという状況でした!

回を重ねる毎にどんどん規模が大きくなっており、需要の大きさみたいなものを感じております。

懇親会も大変盛り上がって、改めて「有意義な会だなぁ…!」と感じました。

パーソナライズされた結果かもしれませんが、トレンド入りもしたみたい?

*1:良い意味でも悪い意味でも