化学出身者がUnityを1年間勉強してみる

Unityを中心とした独学記録

いらいら棒のゲーム1回目

Unityちゃん講座も殆どが終わりゲームの骨格を作成する場面になったためいらいら棒(ボール転がりゲーム)のステージつくりをやってみた。

今回ゲーム中に登場させるオブジェクトは次の通り。

・静止状態のオブジェクト配置

・一定運動するオブジェクト配置

接触することで消えるオブジェクト配置

接触することで落下するオブジェクト配置

接触するとアイテム化するオブジェクト配置

・特定状態で作動するオブジェクト配置

1つ目はcubeからオブジェクトを作成して配置するだけなので容易。

2つ目はRigidbodyで可能ではあるが他にtransform.positionというのを定義する必要があった。ここら辺の定義や変数を引っ張るのは正直いまいち分かってないので復習する必要がありそう。また、サンプルゲームでの回転床はどうやらアニメーションで行っており、よく分からないのでパス。

3つ目はOnCollisionEnterを使い、if関数を用いてプレイヤータグのオブジェクトが触れればx秒後に消えるという風にしたら解決。以下メモ代わりのコード。

public class Opendoor : MonoBehaviour
{

    // オブジェクトに接触したらボールを削除する処理
    void OnCollisionEnter(Collision other)
    {
        // 接触するオブジェクトのタグが"Player"であれば
        if (other.gameObject.CompareTag("Player"))
        {
                // オブジェクトを1秒後に削除する
                Destroy(gameObject, 3.0f);
        }
    }
}

4つ目は3つ目のDestoryをVector3型に変えれば可能だと思う。今回は消滅だけで事足りたのでパス。
3,4つ目に言えることだが、接触、なのでプレイヤーとy軸に差があった場合、横から触れても時間のカウントが始まる。今回は3Dだが高さの概念は入れないので問題ないが、空間を用いたギミックを用意する場合この方法では無理になるかもしれない。
5つ目は講義中でもやったが、OnTriggerEnterを使えば可能。Unity上でIs Triggerにチェックを入れる必要がある。OnCollisionEnterとの違いはTrigger型なら物理演算は行わないので接触検知のみで可能、つまりプレイヤーの保持していた運動を妨げないというところで、主に触れれば消えるものに使える。また、消えるのは非アクティブ可させているので、SetActive(false)となる。

private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Coin"))
        {
            other.gameObject.SetActive(false);//非アクティブ化
            count = count + 1;//カウントを+1
            SetCountText();//countの値をCountTextに置き換える?

6つ目は5つ目のcountの値が一定値以上だとそのオブジェクトが消えるというもの。一番苦戦したものである。
最初に行ったのは3つ目のif関数にcountを入れたもの。確かにオブジェクトは消えたものの、そのcountはそのオブジェクト内のみのcount。一方、私が行いたいのは5のcount値を用いたもの。

public class Door : MonoBehaviour
{
    public int count;
    void OnCollisionEnter(Collision col)
    {
        // 接触するオブジェクトのタグが"Floor"であれば
        if (count >= 1)
        {

            // オブジェクトを1秒後に削除する
            Destroy(gameObject, 1.0f);
        }
    }
}

このDoor型オブジェクトのcountはこのスクリプト上のみでの呼称になるため、他スクリプトでいくらcountが変化しても関係ないというもの。試しpublic型なのでcount =5としてやれば問題なく消えた。
解決策として、本来行いたいcountが行われているスクリプト(本ゲームでは全てPlayerオブジェクトのスクリプト)上で作用させることで上手くいった。なので、5のスクリプトの続きに次のように書いた。

 void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.CompareTag("Door"))

        {
            if (count >= 1)
            {
                other.gameObject.SetActive(false);
            }
        }
    }

これで、countが1以上ならDorオブジェクトは消えることになる。

折角if文を使っているのだから、countが1未満ならエラーメッセージを返すようにしてみようかな。メッセージを表示すること自体は簡単だが、一定時間後に消えるにはどうすればいいのだろうか。まあこれは余力があればする。


とりあえず15時間ほどゲーム制作に時間を使う予定だったが、ここまでで5時間ほど経過している。実現したい挙動は概ね達成できたので残りはオブジェクトを配置していく。
あとは落下時ゲームを再度読み込むスクリプトが必要だが、ゴールオブジェクトと同じくこれは講義の内容そのままなので最悪コピペでも問題ない。