Unity Game Development Essentials を参考に、本に書いてあるソースコードを実際にコンパイルしてみました。この本ではすべてのソースコードがJavascriptで書いてあります。しかし私はC#の方に慣れているので本のソースコードをすべてC#で書き直しました。ここでわかった点がいくつかあるので紹介しようと思います。
まずは特定のコンポーネントがあることを保証する「RequireComponent」についてです。
Javascriptではスクリプトの最後に
@script RequireComponent(クラス名)
と書き加えることでスクリプトをオブジェクトに追加したとき自動的にクラス名で指定したコンポーネントがあるかどうかを確認して、なければ追加します。C#では@ではじまる文は文法エラーになってしまいます。C#のスクリプトでコンポーネントを確認するためには属性(Attribute)を使います。MonoBehaviourクラスを継承するカスタムスクリプトクラスの宣言部の真上に
[RequireComponent(typeof(クラス名))]
と書くことで実現できます。
次にyieldを利用した子ルーチン(WaitForSecondsなどの遅延機能を利用する場合)の違いです。例として0.35秒を遅れさせる場合を考えてみます。
Javascriptでは
yield new WaitForSeconds(0.35);
とすることで何の問題もなく動きます。しかしC#ではもっと別の処理が必要です。命令文自体は
yield return new WaitForSeconds(0.35f);
とすることで済みますが、この命令文が含まれている関数はIEnumeratorの戻り値である必要があります。しかし
void OnGUI()などの関数のなかではこういった子ルーチンを呼び出すことができません。コンパイルは通りますが関数の呼び出しが無視されます。C#子ルーチンを呼び出すためにはMonoBehaviourのメソッドであるStartCoroutine()を使います。
IEnumerator Delay()
{
yield return new WaitForSeconds(0.35f);
}
という子ルーチンを呼び出すためには
StartCoroutine(Delay());
のように書きます。
大変参考になりました。ありがとうございます。Unity 3d Game Development by Example Beginner’s Guideに「この本は初心者向けだからjavascriptで記述するけど、unityに慣れたらC#の方が良いよ」と書かれてありました。そしていざC#で書こうとするとKANOさんが記事にして下さった部分(@scriptなど)で躓いてしまう。マニュアルにUsingC#ってコンテンツもありますが、yieldの様に気付きにくいコードもあるので、この記事は大変勉強になります。
参考にしてくれてありがとうございます。