Google

2011年10月3日月曜日

C#でモノビヘイビア

前々回の記事の続き。
C#でGameObjectの振る舞いを記述するクラスのひな形はこうなります。
名前は前々回作成したSampleScriptにしてあります。

JavaScriptの場合、いきなり地べたにStartとUpdateが書かれるのですが、こちらはクラスの様相を呈してます。
Js版のサンプルではpublic,private等のアクセスコントロールが結構いい加減なものが多いのですが、C#では当然きっちり書かないといけません。

1.Startメソッド

まずStart()から解説。
これはUpdateの前に1回だけ呼び出されることが保証されています。
実は、Unity3Dではコンストラクタ・デストラクタは推奨されていません。
書けることは書けますがタイミングや順序等に保証は一切ありません。
従って、普通に書くならこれがコンストラクタ扱いと考えて良いでしょう。

しかしさらにUnityにはAwake()という関数もあります。
これはシーンとその配下のGameObjectが初期化完了する前に呼び出され、順番の保証も有りません。
変数のみの初期化ならAwake、他のオブジェクトを取得したり情報を見たり設定するならStartと考えればおkかと。
何も考えずStartに全部書くのも簡単です。

2.Updateメソッド

続いてUpdate()。
これは実行中に毎フレーム呼ばれる関数です。
普通に使うならこの中に判断と動きを書くことになるでしょう。

が、UnityにはFixedUpdateという関数も存在します。
こちらは厳密に毎フレーム呼ばれるもので、解説書には重力等の制御用機能である「RigidBody」を使用するならこちらを使ったほうが良い、と書かれています。
常に一定の力を与えるケースに使われます。

っていうか、3Dで重力計算を期待してわざわざUnityを使うのだから、FixedUpdate一択?と思うかもしれません。
が、実際はそうでもないのです。
時間を表すTimeには前回のフレームからの経過秒数を示すdeltaTimeというメンバがあります。
負荷軽減にもフレームレート非依存コードの記述のためにも、UpdateとTime.deltaTimeはよく使うことになるはずです。
派生先における特化処理の記述等、普通のC#ライクに使用出来ます。

今回はここまで。


0 件のコメント:

コメントを投稿