第4回学生のためのUnity勉強会に参加しました

最近こういうのに参加出来てなかったから、そろそろまた行き始めようと思って、ちょうど見つけた第4回学生のためのUnity勉強会 in リクルート メディアテクノロジーラボ : ATNDに参加しました。UnityはJavaScript(UnityScript)*1で書いてたけど、本来のJavaScriptに慣れていればいるほど、UnityのJavaScriptで出来ないことが気になってしまうので、C#でやってみたいと思ってたところだったりします。

感想

ちょうどUnityはC#でやりたいと思っていたところ、学生のためのとある名前の通り、Unityの事だけじゃなくてC#の基本的な事も話して貰えました。というよりC#の基本的なところを詰め込みで話しつつ、Unityでの使いやすさみたいなのに触れる形でよかったです。スライドのタイトルも「Unityで覚えるC#」だし。
スライド57ページを1時間ちょいでという事もあって、かなり駆け足で進んでたので、最初は理解が説明についてけるかなと思ったけど、説明やスライドへのまとめ方がうまいのか、聞いてるだけで普通についてけてました。C#ならではの機能も結構紹介されてて、1時間ちょっとの聞いただけだけど、C#の事を分かった気分になりました。
学生のための勉強会だけど、学生じゃなくても参加しても良いという事で参加しましたが、周りをみるとあまり学生っぽい人は多くなかったです。会の最後に挙手でざっくりと数えてたけど、半分弱って感じでした。

URL

スライド

Unityで覚えるC#

勉強会のサイト

Facebookにログイン | Facebook

Facebookグループがサイト代わりぽい。

メモ

スライドが公開されてるので、以下は自分がメモした事を的当に、スライドとかぶってるかもだけど書いておきます。
ここに書くにあたって、勉強会で取ったメモと記憶を頼りに、自分の言葉で書いてるので、勘違いとか間違いとかニュアンス違うとか、あると思います。

リファレンスはMSDNを見ろ

C# 6.0 のドラフト言語仕様 | Microsoft Docs
この辺かな?

コンポーネント志向

Unityでは継承よりコンポーネントとしてコード書いた方が良い場合が多い。端的に言えばMonoBehaviorを継承するとUpdate()やAwake()などが使えるから、その辺使って作ればコンポーネントになる。GameObjectを継承するより、そうやって作ったコンポーネントをGameObjectに付けたり外したりするやり方。
例えば、キャラクターのGameObjectに、プレーヤーキャラクターになるコンポーネント付けたり、敵として振舞うコンポーネント付けたり、サポートキャラになるコンポーネントと付け替えたりするみたいな事、だと思う。継承で作ってしまうと、敵から仲間に代わるみたいなGameObjectが作れない*2ことになってしまう。

コンストラクタ

MonoBehaviorを継承したクラスは、コンストラクタを実装する事はUnity側から非推奨。Awake()やStart()を使うべきで、そうじゃないとUnityがそのオブジェクトを管理できない。

デストラクタ

C#はGCがあるので、基本的に使わない。

iOSではSystem.GC.Collect();を定期的に呼んだほうがいいらしい | PC向けに作成していたものをiOSへ移植する時のTips - 強火で進め http://goo.gl/CgLyi #uniben4

Twitter. It's what's happening.

ハッシュタグでちらっと見かけた。

プロパティ

いわゆるクラスのプロパティではなく、C#の機能の事らしい。

public Vector3 velocity{
  get { return rigidbody.velocity; }
  set { rigidbody.velocity = value; }
}

getter/setterを簡潔に書ける。setterを書かずにRead Onlyにしたり、アクセス修飾子も書ける。C#の便利な機能だけど、残念ながらこの書き方だとUnityのインスペクタからは見えない。

インデクサー

スライド18ページ目だけど、どうやらスライドに間違いがあるらしい。ただ、Unityではあまり使わないという話だったので、さらっと流れました。

アトリビュート

クラスやメソッドにメタデータを付けられるC#の機能。例えばSerializable属性をつけるとインスペクタから見えるようになるらしい。

namespace

多分普通にnamespace。Unity的には、MonoBehaviorを継承したクラスはnamespaceの中に入れると、なんか見つからなくなってしまうらしいので、namespace外にしないとのこと。

ジェネリック

かなり便利で一押しなC#の機能。だがUnityが提供するメソッドはあまりジェネリックを使ったものが多くないらしい。

ラムダ式

無名関数的な。イベントリスナー*3に登録するメソッドで、そのイベントでのみ使用するものを作るときに便利。インスタンスメソッドとして作っちゃうと、本来イベントからしか呼ばれない想定のメソッドなのに、別の開発者が勝手に使ったりするかもしれないし、機械生成APIにも載って煩わしい。

MonoDevelopは便利

MonoDevelopのリファクタリング機能を使えば、クラス名やメンバー*4名を変えると、呼んでる所や参照してる所も合わせて変えてくれる。Unity側でもちゃんと変わってる。
とあるメソッドの宣言へのジャンプや、何処から呼んでるかも、コンテキストメニューから出せる。普通にIDE。
ただし、sendMessage()は引数が文字列リテラルだから、リファクタリング機能が通用しない。

MonoDevelopにvimモードがある

どの程度のサポートか、どこから設定するかは忘れたけど、たしかあったはずとの事。

ブレークポイントのトレース

Run > Attach to processでUnityのプロセスにアタッチすれば、ブレークポイント置いてトレースできる。ただし、ブレークしたまま放置したりすると、MonoDevelopが不安定になりやすいとか。

MonoDevelopの.NETのバージョン

MonoDevelopでコンパイルを実行する事で、C#のコードとしてちゃんと書けてるか確認できる。これはUnityとは無関係のものなので、Unityの中で発生するエラーは当然分からない。Unityは.NET 4.0だが、MonoDevelopの対象バージョンが.NET 3.5になっている事があるので、4.0に設定しておくとエラー検出もより正確になる。

ほかにもメモは書いたけど

割とスライドにも、Unityではって話も書いてあるので、劣化コピーみたいな内容になりそうなのでこのくらいにしておきます。

その他

前回

mikami’s dialy

前回は「1時間でFPSを作る」という内容だったらしい。面白そうだし、探せば資料はあるはずだと思うけど、とりあえずまとまってるエントリーがあったのでURLだけ置いておきます。

会場

Ring

会場提供はリクルートメディアテクノロジーラボなんだけど、なんか学生限定イベントがあるので学生の方良かったら参加してください的な話が最後にありました。そういう告知する為の会場提供って意味合いもあると思うんだけど、学生じゃなくてすいません。

ついで

http://dl.dropbox.com/u/5606304/JSvsCSharp.pdf

JavaScriptとC#で同じコードを書いて、殆ど変わらないよねってPDF。

*1:オブジェクトリテラルが書けないなど、JavaScriptってよりUnity JavaScriptて呼んだ方がいいんじゃないかと思ってたら、ほんとに以前はUnityScriptって呼ばれてたらしいです。

*2:GameObjectを一旦消して、コードとしては別物のGameObjectを作れば出来るけど

*3:C#だとイベントリスナーって言葉なのかは不明。デリゲート+イベントという機能らしいので、イベントハンドラとかイベントリスナーとかとは、違った仕組みかも

*4:メソッドやメンバー変数