もんりぃ is undefined.

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

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:良い意味でも悪い意味でも

esa.io で席次表をつくってみました

はじめに

私が務める株式会社キッズスターでは esa.io という情報共有サービスを利用しています。

esa.ioMarkdown でドキュメントを書くことができ、組織内での情報共有のしやすさに重点を置いて設計されています。

私も個人的に契約しており、登壇資料の骨子を書いたり、書籍の下書きをしたり、ポエム的なテキストとかを書いたりしています。

で、この esa.io で席次表を作ってみたら、思いのほかヨサソウだったので、その件について綴ります。

Why?

弊社では個人のエンジニアさんやデザイナさんに業務委託という形でお仕事をお願いするコトがそこそこあります。

んで、そんな業務パートナーさんによってはオフィスを作業場にしてもらうことも多いのですが、「プロジェクトで関わっていないと全く接点が無くて、名前は勿論、人となりとかも分からん!」というケースも少なくありません。

なので、関わってもらう際に、チョットでもメンバーに関する情報が多い方が良いかな?と思い立って作ってみました。

How?

f:id:monry84:20180717150046p:plain

こんな感じ。*1*2*3

Table 記法のセル内に、メンバー絵文字 という機能を用いたアイコンが並んでいるだけのシンプルな表です。

スクショだと分からないけど、メンバー絵文字自体に自己紹介ページへのリンクを張ってあります。

所感

敢えて情報量は少なくして、「この席の人、どんな人?」って思った時に、各々で書いた自己紹介を見る、という遷移にしているところがちょっとミソかな、と。

まだ全員が自己紹介書いているわけじゃ無いけど、これを期に書いてくれる人が増えたりすると良いなぁとか思ったりします。

esa.io の textarea はちょっとした Markdown エディタ的な機能があり、Table 記法の補助をしてくれたり、List 記法の * とかを自動補完してくれたり、とお節介すぎない便利さが溢れており、個人的には「そうそう、こういうコトなんだよ〜」と感動したりしていますw

また本記事のように、ユーザ側での工夫をできる余地があるのも esa.io の良いところかなぁ?とか思ったりもします。

なんか、esa.io の宣伝記事みたいになっちゃってるのは気の所為ってコトでw

2018/07/18 11:30 追記:

この esa 記事を書いたコトで、みんなが自己紹介を更新するキッカケになったようで、ちょこちょこアップデートが入ってみるっぽい。

自己紹介記事については、また別途書こうかな。

*1:左上の猫は、毎年初詣の時に買い増している招き猫。

*2:中央上部の「こ く ば ん」は、文字通り黒板。建物が元中学校で、教室居抜きなので。

*3:左上の草原は、通称芝生エリア。子ども向けアプリをお子さんに試してもらうときとか、打ち合わせとか、社内飲みとかで使う。

リモートワーク Rev.16 / リモートリモート

はじめに

  • 最近めっちゃサボりがちなリモート記事を久しぶりに書きます。
  • このところは、自宅では無く、知り合いのオフィスやカフェなどでリモートワークするようになっており、その辺の感想とか。

KPT

Keep

  • やはり、人の目がある環境でのリモートワークは捗りまくる。
  • 特に知り合いの目であるコトが重要な気がしてきた。
    • 別に監視されているわけじゃ無いんだけどね。
  • 今リモートの時にお世話になっているブシツとFJORDさんの何れも外部モニタがあるので、これもとても良い。
    • 今後自宅リモートの頻度を増やす場合には、モニタ必須だな…。
  • 会社的にも、リモートワークが普通の働き方になってきた。

Problem

  • そろそろ鍵会員化を検討しないと気まずい。
    • レギュレーションとか聞いておこう。
  • 仕事し過ぎちゃう。
    • 鍵の関係で遅くまで居るわけにいかないので、地元駅に戻ってきてからカフェで追加作業する、みたいな感じになっている。
    • まぁ、負担になってないから、そこまで Problem じゃない…?
  • リモートワークの時の MTG が未だに問題として残っている。
    • 音が飛びがちだったり、状況がわからなかったり。

Try

  • FJORD リモートの頻度増やす?
    • まぁ、私の一存で決められることでもないので、様子を見ながら。

所感

  • 相当リモート慣れしてきました。

Unity 2018.2 で個人的に気になるポイント #Unity

はじめに

  • 2018/07/10 (Tue) 21時頃(日本時間) Unity 2018.2 がリリースされました!
  • まだ日本語訳された記事は出ていませんが、本家のブログ記事を読んで「おお、ヨサソウ!」とか思ったモノを感想とともに書き殴ります。

Graphics

C# Animation Jobs

  • 独自のスクリプトからアニメーションを操作できるようになる、という感じでしょうか。
  • Playables がどうこう、って書いてあるので、今後は Playables API 側にどんどん寄せていく感じなのかな?
  • 自前で Thread 立てていろんな計算させることができそうなので、ちょっと重めの計算させるときとかに便利かも?
  • ECS と組み合わせたりできるのかなぁ?あんま意味ない?

2D

Pixel Perfect Camera (Preview package)

  • まだプレビューとのコトだけど、いわゆるピクセルパーフェクトなカメラ。(そのまま)
  • 公式の記事見てもらうのが分かりやすいけど、ドット感のあるゲームが簡単に作れるようになりそう。

2D Sprite Renderer “Sort by Pivot Point”

  • 今まで SpriteRenderer の前後関係は Sprite の中心とかでしか制御できなかったのが、Sprite の Pivot で並び替えることができるようになったらしい。
  • あんまり SpriteRenderer 使ってないマンなので、大幅に恩恵を受けることは無いんだけど。
  • これまではユーザが頑張って計算していたのが不要になるって感じかな。

2D Hexagonal Tilemaps

  • Tilemap で六角形のタイルを並べられるようになる。
  • 工夫次第で Final Fantasy Tactics 的なマップも作れる…?無理かな?

SVG Importer (Preview package)

  • 遂に!待望の!SVG が!
  • SVG: Standard Vector Graphics 形式がどのくらい利用されているかは知りませんが、嬉しい人には嬉しい?

New 2D APIs

The new 2D Atlas API lets you write custom tools to create or update atlases.

Editor – general

Support for using .java and .cpp source files as plugins in a Unity project

  • おお!わざわざ Android Studio 使って自前の .jar とか作らなくても良くなった!
  • 毎回「めんどくせー」って言いながら作ってたので助かる!

Unity Hub

  • v1.0 がそろそろ出るトノコト。
  • インストールロケーション選べるっぽいのでヨサソウ!

Cinematics

Recorder 1.0

Core Engine

Addressable Asset System

  • 個人的に一番気になってる機能!
  • 「オレオレ ResourceManager」を撲滅しないと!w

End of support for UnityScript

おわりに

  • Unity Technologies 的には予定通りなんだろうけど、かなりハイペースでリリースされていて、追いつくのが大変です…!
  • 既存プロダクトをいつアプデするのか?という問題が常につきまとうけど、早めに対応していきたいなぁ…。
    • 安定性の問題は若干あるし…。
    • 裏側で準備進めておいて、次の Minor Version が上がるタイミングとかかなぁ?
    • 「2018.2 の適応は 2018.3 が出てから」みたいな?

JetBrains Rider 2018.2 EAP を試してみた

EAP is 何?

  • Early Access Program の略
  • こちら から参加可能
  • ユーザにプレリリース版をお試しで使ってもらい、フィードバックを集めるための仕組み
  • JetBrains さんは Minor リリース前にこの EAP を実施している

で、どうよ?

  • Rider 2018.1 から比べてどうなったのか?を雑に書き殴る

良くなった

ログ

f:id:monry84:20180704114227p:plain

  • Unity のログと繋げるの良い!
  • 直接該当行に飛べるから超便利

新しい Solution Explorer

  • これまでも、 Autoscroll from Source という エディタのタブを切り替えたときに Solution Explorer が追従して選択状態にしてくれる機能 はあった
  • が、コイツが曲者で、素早くタブを切り替えると Solution Explorer にフォーカスを持って行かれてタブ切り替えができなくなる問題があった
  • それが 新しい Solution Explorer では解決してる っぽい!
  • どういうロジックかは分からんけど、遅延して読み込んでる…のかな?

これからに期待

Typo…?

  • スクショ撮るの忘れちゃったんだけど、日本語コメントが軒並み Typo として扱われてしまった
  • Unity 固有のキーワードとかも Typo 扱いに…
  • Typo 検出は直ぐにオフにしてしまった

AssemblyDefinition 対応はマダっぽい?

  • この Issue を見るに、まだ Plugin 側に反映はされてなさそう
  • でも、とても期待しています!

名称の自動選択

f:id:monry84:20180704115514g:plain

  • メソッド名を決める時とかに、戻り値の型に応じてヨシナに AsObservable とかをサジェストしてくれる機能が元々ある
  • これがとても便利なのだが、サジェスト時に1個目が選択状態になっていないため、一回下キーを押さないと決定できない
  • 一回直ってたバージョンもあるので、デグってんじゃないかと思うんだけどどうなんだろ…?