音無サノトの空想録

ゆるい漫画を描いています

【ゲーム制作】Unity 公式チュートリアルの玉転がしゲームを改良① アイテム数を増やす

どうも音無サノトです(^^)/

前回までのゲーム制作で一通り玉転がしゲームを完成させました。

今回からはちょっと改良を加えていこうかなと思います。

 

ちなみに最初の制作はこちら↓

otonasisanoto.hatenablog.com

 

4月7日だから1か月以上かかっていますね。ただブログにまとめたり土日しかやっていないので、実質の稼働時間は10時間もいかないと思います。

 

ちなみにプレイ動画がこんな感じ。


【Unity】玉転がしゲームを作ってみた

 

はてなブログに動画を入れてみたかったので Youtube に投稿しました。 

動画キャプチャやら Youtube への投稿など、色々な副産物的なスキルがつきました。

ただ今の時代はこれくらいできて当たり前ですかね。大学生の頃、教授とデスクトップを共有しながら作業するなんてこともやっていたので IT すげえなとか思います。

 

さて、本題のゲームの改良です。今回はアイテム数を増やしてみようと思います。

 

 

アイテム数を増やす

まずアイテムは Pick Ups の子オブジェクトとして管理しています。

f:id:otonasisanoto:20190511115454p:plain

 

現在、12個ほど設置されているので4個増やしてみたいと思います。

Ctrl + D で複製して

f:id:otonasisanoto:20190511115739p:plain

 

四隅に追加しました。

f:id:otonasisanoto:20190511115840p:plain

 

これでアイテム数を増やすことができました。

ただし、これだとスクリプトを変更しないと上手くいかないところがあります。

 

アイテム数の増減に対応できるようにスクリプトの変更

まず変更しなければならないのは PlayerContoller のこの部分。

f:id:otonasisanoto:20190511120135p:plain

ここはアイテム数をカウントしていき12個以上になったら「You Win!」と表示する処理です。この12個の部分が数値で直接記入しているため、今回の様にアイテムを増やした場合、数値を変えないといけなくなります。

 

4個増やして、16と数値を記入してもいいのですが、それだとアイテムが増減する度にスクリプトを変えなければいけません。

そこで、アイテムが増減してもプログラムを変更せずに済むようにします。

 

方法としては何種類かありますが、今回は親オブジェクトとなる Pick Ups を検索し、子オブジェクトの数を取得するようにします。

 

スクリプトを以下のように変更します。コメントをつけている3行だけ変えればOKです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerContoller : MonoBehaviour
{
    public float speed;
    public Text countText;
    public Text winText;

    private Rigidbody rb;
    private int count;

    private int PickUpNum; // アイテム数を格納

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText();
        winText.text = "";
        PickUpNum = GameObject.Find("Pick Ups").transform.childCount; // Pick Upsを検索し、子オブジェクトの数を取得
    }


    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement * speed);

    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            count = count + 1;
            SetCountText();
        }
    }

    void SetCountText()
    {
        countText.text = "Count : " + count.ToString();
        if(count >= PickUpNum) // 子オブジェクトの数で判定する
        {
            winText.text = "You Win!";
        }
    }
}

 

それでは処理の説明をします。

まず、アイテム数を取得してそれを格納する変数を用意します。

f:id:otonasisanoto:20190511121648p:plain

 

次に Start() 関数内にアイテムの個数を取得する処理を追加します。

f:id:otonasisanoto:20190511121751p:plain

GameObject.Find("オブジェクト名") でゲーム内のオブジェクトを検索しています。

そして、transform.chilCount でその子オブジェクトの個数を取得しています。

こうすることで Pick Ups で管理されているアイテムを増やしたり減らしたりしてもスクリプトを変える必要がなくなります。

 

後は if 文の判定を数値から PickUpNum に変更すれば完了です。

f:id:otonasisanoto:20190511122015p:plain

 

実際にゲームを再生すると、16個取った時にテキストが表示されることを確認できます。

f:id:otonasisanoto:20190511121208p:plain

 

ちゃんとできていますね(^^♪

 

次回はこのゲームに敵でも追加してみようかなと思います。

 

本日は以上となります。最後まで読んでいただきありがとうございました!