12/08/2018, 15:04

Day 3 - Space shooter 2

さて、スペースシューター作りの続きをやっていきます。 前回まではプレイヤーの機体の作成をして弾を撃てるようにしました。 Infinity bullet しかし、撃てるようにしただけでは一つ問題というか気になる点があります。 実は今、弾を発射していくと弾が消えずにゲーム上で無限に増えていっているんです。 ゲーム画面上では弾は上に飛んで見えなくなるのでわかりませんが、ヒエラルキーウィンドウはこのようになっています。 Bolt(Clone)というのが弾のオブジェクト、これがどんどんと増えていっています。 そこで、弾が画面外に行ったら消してあげるようにします。 ...

さて、スペースシューター作りの続きをやっていきます。 前回まではプレイヤーの機体の作成をして弾を撃てるようにしました。

Infinity bullet

しかし、撃てるようにしただけでは一つ問題というか気になる点があります。 実は今、弾を発射していくと弾が消えずにゲーム上で無限に増えていっているんです。

ゲーム画面上では弾は上に飛んで見えなくなるのでわかりませんが、ヒエラルキーウィンドウはこのようになっています。

Bolt(Clone)というのが弾のオブジェクト、これがどんどんと増えていっています。 そこで、弾が画面外に行ったら消してあげるようにします。

そのために作るのが、こちら。

このように、見えない四角形をゲーム画面周りに配置します。 この見えない四角形に弾が触れると弾が消える、というようにします。

こちらはバージョン違いによるプログラムの書き方の違いは無く、チュートリアルどおりに記入してOKです。

~~
public class Destroybyboundary : MonoBehaviour
{
    void OnTriggerExit(Collider other)
    {
        Destroy(other.gameObject);
    }
   
}

どうやらこのOnTriggerってのが接触判定をしているみたい。 ゲーム画面は四角形の内側にあるから、四角形の外側に出たら判定が出るっぽいですね。

このプログラムを見えない四角形に組み込んでやると、弾が消えるようになります。 実際のようす ↓

うまく消えていますね。

Making obstacle

次は障害物の作成をしていきます。 宇宙での障害物といえば飛んでる岩ですよね。

アセットストアからダウンロードしてある岩のモデルを 空のゲームオブジェクトに入れてあげるだけで、岩の見た目が完成します。

しかし、このままでは当たり判定も動きも何も無い岩。 というか処理上は岩でもなんでもない概念と化しています。

rigidbodyを適用してあげたりは今までもやりましたが 今回は、宇宙をただよう岩ということで、ランダムに回転するようなプログラムを組み込んでやります。

~
public class RandomRotator : MonoBehaviour
{
    public float tumble;

    void Start()
    {
        GetComponent<Rigidbody>().angularVelocity = Random.insideUnitSphere * tumble;
    }

}

これで滑らかに回転するみたい。 GetComponentというのを用いるのは昨日調べたからすぐに修正、早速起動してみよう! ↓

OMG

なんか…なんか回転が遅い… 緑色のCapsuleColliderはなめらかに回転しているのに 岩の部分の回転がラグってるような挙動をしてる。

うーんすごく気になるけど、とりあえず完成させるのを目標にしよう。 先に進めない程のバグではないはず。 と、思っていたらそのすぐ先の岩の破壊エフェクトを作ろうの時点で 岩を破壊出来ないというバグに見舞われたため、岩を最初から作り直すことにしました。

すると普通に回転するようになった。なんで? スクリプトの打ち間違いかな? 自分の目では違いが分からないが、ネットのサービスをつかって2つのテキストの差を見ます。

左が成功した時のもので、右が失敗したときのもの

The two files are identical(2つとも一緒だよ) あれ…ここが間違っていたわけではないのか

他に違いがあるとすればAsteroidのコンポーネントの部分だけだな…

えぇ…何が違うんだこれ… 並び順やCapsuleCollider(当たり判定の時に使うもの)の大きさか?と思ったけれど どれだけ数値を再現しても起こった現象の再現が出来ない。

なら、バグった時のプロジェクトをもう一度読み込んで 当たり判定や回転のスクリプトなどを一個一個消して確認したら普通に動いた…

その時のPCの調子が悪かったのか?プロジェクトの保存をミスったか? どちらにせよ再現出来ないのであれば一旦置いておきましょう。

To be continued...

再発した頭痛が酷いので記事自体はここで終わりにします 一応ゲーム部分は完成しました。スコア表示やゲームオーバーの表示などがまだですが。 次の記事では、完成したものと制作過程で分からなかったことについてまとめます。 今日はここまで。

0