Menu
CoddyTech

食べる

Coddyの「Unityゲーム:3Dスネーク」コースのレッスン 6/14。

ヘビは頭がエサのセルに乗ると、エサを食べます。どちらも整数の位置にあるため、==で位置を比較しても安全です。UnityのVector3に対する==は、2つの位置が0.00001未満の距離にある場合、それらを等しいと判定します。また、整数のセルを足しても、それほど小さな隙間は生じません。

ヘビは自分が移動したタイミングを把握し、GameManagerはエサの位置を把握してスコアを管理します。そこで、移動のたびにヘビが尋ね、GameManagerが答えます。IsFood(cell)はboolを返し、Eat()はポイントを加算してエサを移動させます。ヘビはstaticなInstanceを通じてGameManagerにアクセスします。これは、C# for Unityの学習で出会ったシングルトンです。

移動した後に、頭が入ったセルについて確認します。グリッド上の鍵も、同じ方法で拾います。

transform.position = next;
if (key.position == transform.position)
{
    keysHeld++;
    key.gameObject.SetActive(false);
}
challenge icon

チャレンジ

中級

GameManagerで:

  1. public static GameManager Instance;を追加し、Awake()で設定して、private int score;を追加します。
  2. public bool IsFood(Vector3 cell)を作成します。cellが食べ物の位置にある場合はtrueを返します。
  3. public void Eat()を作成します。scoreに1を加算し、MoveFood()を呼び出します。

Snakeでは、Step()の最後、頭が移動した後に、頭のセルに食べ物がある場合はEat()を呼び出します。

Playを押して食べ物に向かって進み、次にCheckを押します。

自分で試してみよう

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public Snake snake;
    public GameObject foodPrefab;
    private Transform food;

    void Start()
    {
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    void MoveFood()
    {
        int x = Random.Range(-snake.edge, snake.edge + 1);
        int z = Random.Range(-snake.edge, snake.edge + 1);
        food.position = new Vector3(x, 0f, z);
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityゲーム:3Dスネークのすべてのレッスン