前の記事: C#とUnity4で書籍『Unity入門』(1) http://itouhiro.hatenablog.com/entry/20131002/unity
Chapter 5 ブロックシューター
この章で使うパーティクルシステムは、Unity3とUnity4(正確にはUnity3.4までと3.5以降)で異なるんだ。
その対策として、この本の
「Hierarchyビューの『Create』メニューから『ParticleSystem』を選択します。」
引用元: 『Unity入門』 p166
という箇所を
[GameObject - Create Empty]でカラのゲームオブジェクトを作成して「LegacyParticle」とかの名前にする。そのゲームオブジェクトに、[Component - Effect - Legacy Particle]にある 'Ellipsoid Particle Emitter', 'Particle Animator','Particle Renderer' の3つをひとつずつ追加する。
と読み替える。あとはこの本をそのまま適用できるぞ。
くわしくは
- 「旧パーティクルシステム( Shuriken の前のパーティクルシステム)を Unity 4.0 で使う方法 - 強火で進め」 http://d.hatena.ne.jp/nakamura001/20130125/1359130053
を参考にしてくれ。
ほんとにそのまま使えてる。
JavaScriptからC#への変更箇所は‥‥
Pistol.js → Pistol.cs
var bullet : GameObject = Instantiate(bulletPrefab, transform.position, transform.rotation); ↓ var bullet = Instantiate(bulletPrefab, transform.position, transform.rotation) as GameObject;
BoxGenerator.js → BoxGenerator.cs
var offsx : float = Random.Range(-8.0, 8.0); var offsz : float = Random.Range(-4.0, 4.0); var position : Vector3 = transform.position + Vector3(offsx, 0, offsz); ↓ Vector3 position = transform.position + new Vector3(Random.Range(-8.0f, 8.0f), 0, Random.Range(-4.0f, 4.0f));
Judge.js → Judge.cs
private function GetTargetColorName() : String { return targetIsRed ? "Red" : "Blue"; } ↓ string GetTargetColorName() { return targetIsRed ? "Red" : "Blue"; }
ResultScreen.js → ResultScreen.cs
function TimeUp() { state = "Time Up"; yield WaitForSeconds(3.0); state = ""; yield WaitForSeconds(0.5); state = "Show Score"; while ( ! Input.GetButtonDown("Fire1")) yield; Application.LoadLevel("Title"); } function OnGUI() { if (state == "Time Up") { ... } else if (state == "Show Score") { ... } } ↓ enum Status { playing, timeup, dispTimeup, noDisp, dispScoreWait }; Status state; float timer; void TimeUp() { state = Status.timeup; } void Update () { if (Input.GetKey(KeyCode.Escape)) Application.Quit(); if (timer > 0.0f) { timer -= Time.deltaTime; return; } switch (state) { case Status.playing : return; case Status.timeup : state = Status.dispTimeup; timer = 3.0f; break; case Status.dispTimeup : state = Status.noDisp; timer = 0.5f; break; case Status.noDisp : state = Status.dispScoreWait; break; case Status.dispScoreWait : if (Input.GetButtonDown("Fire1")) Application.LoadLevel("Title"); break; default: break; } } void OnGUI() { ... if (state == Status.dispTimeup) { ... } else if (state == Status.dispScoreWait) { ... } }
こんな感じかな。あとはRect(a,b,c,d)
をnew Rect(a,b,c,d)
にするとか、これまでやったことだ。
ResultScreen.csの書き換えが多いんだけど。
yieldの書き換えはそのままC#にできないからなー。JavaScript側では (1)単なる時間待ち (2)キー入力待ち にyield使用してる。C#では「待ち」をUpdate()の中に書いたよ。状態を表すenum Statusも導入した。
このゲーム、Androidでもおもしろく遊べるねー。パーティクルで表現した爆発もちゃんと出てるし。
Chapter 6 キャラクター・アクションゲーム
この章で使うアニメーションシステムは、Unity3とUnity4で異なる。
解決法だが、以下のようにすれば旧アニメーションシステムになるので、この本をそのまま学習できる。
リスト6-4のアニメーション確認のところでは yieldをC#で使うことができる。Start()の中だとC#でもyieldをJavaScriptと同じように使えるんだよなー。関数戻り値をIEnumeratorにしなくちゃとかあるけど。
リスト6-6で、Jump中はisGroundedではないから操作が効かなくなるんだな。
この章は最後まで完成しない。ある程度完成したところで
残りの作業については Chapter4,5とほぼ同様の作業になるため、ここでは解説を省略します
といって終わる。
音があるとゲームらしくなるね。
モバイル対応のための仮想ジョイスティックがC#で動作しない。Standard Assets (Mobile)/Scripts/Joystick.js がJavaScriptで書かれてるせいかな‥‥。
Unityの開発には JavaScitとC#、どっちがいいと思う?
C#のほうがいいところは‥‥
- UnityのJavaScriptは静的型付けだしクラスはあるし、Webブラウザで使うJavaScriptとは文法別物(ActionScript3.0によく似ている)。C#はMicrosoftのと特に文法に違いはない。だからC#はUnityと関係ない外部ライブラリ(JSON関連とか)を使える。クラス使った大規模開発ならC#のほうがよさそう。
- Unity組み込み関数は大文字始まり(Range()とかFindGameObjectsWithTag()など)。これはC#なら関数大文字が通常だから馴染むけど、JavaScriptはメソッド小文字始まりが通常なので、違和感大きい。
- Unity付属のMonoDevelopはUnityのJavaSciptではあまり補完してくれない。C#なら補完してくれてラク。
と いうところかな。
Unity入門 ~高機能ゲームエンジンによるマルチプラットフォーム開発~
- 作者: 高橋啓治郎
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/10/01
- メディア: 大型本
- 購入: 15人 クリック: 609回
- この商品を含むブログ (22件) を見る