C#とUnity4で書籍『Unity入門』(2)

前の記事: C#とUnity4で書籍『Unity入門』(1) http://itouhiro.hatenablog.com/entry/20131002/unity

Chapter 5 ブロックシューター

f:id:itouhiro:20131004104713p:plain

[話者] この章で使うパーティクルシステムは、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つをひとつずつ追加する。

と読み替える。あとはこの本をそのまま適用できるぞ。
くわしくは

を参考にしてくれ。


[合いの手] ほんとにそのまま使えてる。


[話者] 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も導入した。


f:id:itouhiro:20131005221129p:plain


[合いの手] このゲーム、Androidでもおもしろく遊べるねー。パーティクルで表現した爆発もちゃんと出てるし。


Chapter 6 キャラクター・アクションゲーム

[話者] この章で使うアニメーションシステムは、Unity3とUnity4で異なる。

解決法だが、以下のようにすれば旧アニメーションシステムになるので、この本をそのまま学習できる。

f:id:itouhiro:20131005235654g:plain



リスト6-4のアニメーション確認のところでは yieldをC#で使うことができる。Start()の中だとC#でもyieldをJavaScriptと同じように使えるんだよなー。関数戻り値をIEnumeratorにしなくちゃとかあるけど。
f:id:itouhiro:20131007055718p:plain


リスト6-6で、Jump中はisGroundedではないから操作が効かなくなるんだな。



この章は最後まで完成しない。ある程度完成したところで

残りの作業については Chapter4,5とほぼ同様の作業になるため、ここでは解説を省略します

といって終わる。

f:id:itouhiro:20131007145336p:plain


[合いの手] 音があるとゲームらしくなるね。


f:id:itouhiro:20131007155622p:plain


[話者] モバイル対応のための仮想ジョイスティックが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#なら補完してくれてラク。

と いうところかな。