食べる
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);
}チャレンジ
中級GameManagerで:
public static GameManager Instance;を追加し、Awake()で設定して、private int score;を追加します。public bool IsFood(Vector3 cell)を作成します。cellが食べ物の位置にある場合はtrueを返します。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);
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。