いいかげん年功序列的にUnity中級者に押し上げられてしまった身としては、C#の文法でスクリプトを書けることについて改めて見つめなおす必要があるだろう、とは常に思っていまして。そんなところに今回の勉強会でして、これは他の用事をおしても行かねば!と気合い入れて参加してきました。
日本Androidの会Unity部の皆様ありがとうございます!
資料、口頭、ライブコーディングから見て気がついたところなど色々と。
(個人的な気付きが中心なので、そこ違う!というツッコミは随時お願いします。)
「Unityでもう少しc#を書きたい人のためのLINQ入門」
@moririring さん (関西から参戦!)
資料
■LINQの利用について
・ふつうのfor文は「手続き的な書き方」。Linqは「宣言的な書き方」。
・あたりまえだが、複雑なワンライナーがいいわけではない。
・LINQの書き方はQuery Syntax と Method Syntaxの二種類。
・有名な話、UnityではiOSでAOT関連でのトラップがあるので注意。
・LINQはループを隠蔽している。ループ数を少しでも減らそう。メソッドの順番が重要。宣言した順(左から右へ)処理が進むので、Whereとか数を絞るフィルタリング系を先に書く。
・遅延実行を意識する。LINQはデータを加工する段で実体化される。実際に値を入れる瞬間など。LINQ書いた箇所では処理されない。ブレークポイント貼るとわかる。LINQで宣言された値が利用されるところではじめて実体化される。
・むだな処理に気をつける。たとえば、CountとAnyは内部のループ回数がぜんぜん違う。
■Visual Studio関連
・Unity 5 Import Packageからメニューから無くなってる。Unity VSがインストールしているフォルダの中にパッケージあり。
(これはPCに複数バージョンのUnityを入れている場合も同様っぽい)
・Macの場合は同等のインテリセンス機能が使えるOmniSharpがいいよ。
・リファクター機能
選択部分を切り出して関数化する。メソッドの抽出。
・Unity VSの機能
右クリックからオーバーライド関数の宣言を生成できる機能。
ブレークポイントを貼った実行で、Unity側からプレイスタートしたい場合は
VSでAttach to Unityを押してからUnity EditorでPlayを押す。
・(VSの話ではないが)積極的にvarを使おう
型推論してくれる。右辺値が参照型でnewとかしている長い関数の場合はおすすめ。
■感想:
自分の周囲にはLinq推しに恵まれているので、プロジェクトに少しずつ導入して入るものの
(具体的にはUIのシステムで、NGUIの複数のパネルに対して操作するところとか。)
=>ってなんやねん!とか思ってたタチでした。所謂おまじないでコードカイているというか。実際はこれ、アロー演算子。
講演はライブコーディングしながらのくだりが最高で、まずはふつうのfor文で作った処理をまず作る。そこからスタートして、条件判定の部分をメソッド化して、デリゲートで呼び出す、呼び出し側を削って削ってラムダ式に書き直して。。。と、だんだんLinqの形に近づけていく方式。これはすごくわかりやすかった。どういう意図であの記述になっているのか?が順を追って理解できるというか。録画して繰り返し見たいくらいです。
あいえみゅねれーらぶる。
「UniRxとかReactivePropertyとか」
@Grabacr07さん。
資料
・Linq to Events。Linq to Events。すなわちRx。
さきほどまでの(moririringさんの)話はコレクションを扱うLinq to Objectだったが、これは時間軸の概念。
・「UniRx」はUnityにReactive Extensionsの考え方を導入する。
大事なことですが、
オレオレライブラリではない!ちゃんとした考えに基づいて作った「移植」。
同じ使い方がほかの言語で使えるので、学習コストは無駄にならない。
・変化をストリームで拾ってくる処理を書く場合、初期値の供給があるかどうかは、UIに使うものとしては非常に大事。UniRxにはそのへん気遣って作られている。
・UIの入力判定系は、普通のやり方はOnClickにAddListner生やしたりするがUniRXを使えばStart()の中で宣言するだけ。Updateでぐるぐる回さなくてよい。
・
Reactive XというウェブサイトがReactive Extensionsリファレンス的に使える。英語だけど図付きでわかりやすい。
・日本語資料は@toRisouP氏の
「未来のプログラミング技術をUnityで」おすすめ。
(公演当日の前日に出たばかり。 最前列講演者ど真ん前に座っていた@toRisouPも苦笑い。)
■感想:
資料の中でC#はいろいろなところで活躍してます!と、「C# Everywhere」と銘打ったスライドにPSM Studioが出て泣いた。
UniRxはUIまわりの待ち処理にかなり有効そうなので順繰りに触っていく予定。
「OrangeCube 自社フレームワーク」
岩永信之さん
資料
■自社フレームワーク
・Unityの課題を解決するために自社フレームワークを用意した。
・自社で作っているゲームは、アクション性は少なくUIのページ数が多いタイプ。
通信周りの非同期処理を楽にしたい。
・非同期処理担当"IteratorTasks"
.Net 4のTasksの移植のようなもの。(Unityは.Net3.5相当なので使えない)
C# 5.0で解決している問題だが、Unityでは使えないので「もどき」をつくった。
標準ライブラリの互換ライブラリ作って、は超バッドノウハウっす...。Unityがry(以下5回ほど繰り返し
・ストリームからのバイト読み込みとかはゲームが止まる原因になりがち。
しっかり非同期で読むような設計をする。
・MVPに当てはめるとView側に当たるOnClickとかの方に処理のコードが増えるのはよくない。
ゲームロジック側、Model層が主役であるべき。そこで、ゲームロジックからビュー側に命令して、ユーザの選択結果を待つような設計にした。
(このへんから話に追いつけなくなる。ごめんなさい。)
■Visual Studio関連
・VSのクラス生成「Usage First」という考え方で、先に使う側で存在しないクラスを呼び出す処理を書いて、あとからメソッドを建てる。
・usingしてないクラスの呼び出しも、覚えていたら先に書いておいてVSの機能でusingを後から足す。
・get setの自動実装
・すべてのメソッドの上にgitとの連携を表示する"1 reference| 0 authors | 0 changes"と灰色で出てた。
(これはUltimateエディション専用機能だとTwitter経由で別の方に教えてもらいました)
感想:
ぶっちゃけ紹介の内容は流石「C#でぐぐるとトップで出てくる」だけありまして超応用的。
C#からC#コードを生成しまくる話とか、、、
自分のレベルではまだ縁遠い話でしたが、行き着くところまで探求するとこういうことができる、という一つの指標としてガッツリ見るだけ見てました。
貴重だったのはものすごい速度のVSの機能使いまくりコーディングがライブで見れたこと。
本職が開発ではないので、なかなかそうした現場を見る機会がなく。貴重でした。
●勉強会全体を通して●
LINQの勉強会ということでしたが、登壇者4名が全員Visual Studio推しだったことと、ライブコーディングが数回あったのでVisual Studioの働きっぷり堪能の巻!、という感想です。
ふつうのUnity勉強会はノウハウ情報共有が主ですが、自分が最近知りたいと思っている「ふだんどういうスタイルでコーディングしていて、どういう細かい機能やツールを使っているのか?どういう考え方で設計しているのか? 」の一面が見れる回だったなと。
この系統のシリーズでまたやってもらいたいなぁ、と思いつつ、次はもう少し理解が追いつくように切磋琢磨。
余談ですが、UniRXライブコーディングの時にストリームをチェックして戻り値をboolで返す処理を三項演算子でササッと書くくだりがあったのですが、そこがすんなり理解できたあたり自分の成長を感じました。(こなみ)