第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#の事を分かった気分になりました。
学生のための勉強会だけど、学生じゃなくても参加しても良いという事で参加しましたが、周りをみるとあまり学生っぽい人は多くなかったです。会の最後に挙手でざっくりと数えてたけど、半分弱って感じでした。
メモ
スライドが公開されてるので、以下は自分がメモした事を的当に、スライドとかぶってるかもだけど書いておきます。
ここに書くにあたって、勉強会で取ったメモと記憶を頼りに、自分の言葉で書いてるので、勘違いとか間違いとかニュアンス違うとか、あると思います。
リファレンスはMSDNを見ろ
コンポーネント志向
Unityでは継承よりコンポーネントとしてコード書いた方が良い場合が多い。端的に言えばMonoBehaviorを継承するとUpdate()やAwake()などが使えるから、その辺使って作ればコンポーネントになる。GameObjectを継承するより、そうやって作ったコンポーネントをGameObjectに付けたり外したりするやり方。
例えば、キャラクターのGameObjectに、プレーヤーキャラクターになるコンポーネント付けたり、敵として振舞うコンポーネント付けたり、サポートキャラになるコンポーネントと付け替えたりするみたいな事、だと思う。継承で作ってしまうと、敵から仲間に代わるみたいなGameObjectが作れない*2ことになってしまう。
コンストラクタ
MonoBehaviorを継承したクラスは、コンストラクタを実装する事はUnity側から非推奨。Awake()やStart()を使うべきで、そうじゃないとUnityがそのオブジェクトを管理できない。
デストラクタ
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ではあまり使わないという話だったので、さらっと流れました。
namespace
多分普通にnamespace。Unity的には、MonoBehaviorを継承したクラスはnamespaceの中に入れると、なんか見つからなくなってしまうらしいので、namespace外にしないとのこと。
ラムダ式
無名関数的な。イベントリスナー*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ではって話も書いてあるので、劣化コピーみたいな内容になりそうなのでこのくらいにしておきます。
その他
前回
前回は「1時間でFPSを作る」という内容だったらしい。面白そうだし、探せば資料はあるはずだと思うけど、とりあえずまとまってるエントリーがあったのでURLだけ置いておきます。
*1:オブジェクトリテラルが書けないなど、JavaScriptってよりUnity JavaScriptて呼んだ方がいいんじゃないかと思ってたら、ほんとに以前はUnityScriptって呼ばれてたらしいです。
*2:GameObjectを一旦消して、コードとしては別物のGameObjectを作れば出来るけど
*3:C#だとイベントリスナーって言葉なのかは不明。デリゲート+イベントという機能らしいので、イベントハンドラとかイベントリスナーとかとは、違った仕組みかも
*4:メソッドやメンバー変数