食べる
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);
}チャレンジ
中級ヘビは食べ物を食べて、1点を獲得します。
GameManagerにpublic static GameManager Instance;を追加し、Awake()で設定します。また、private int score;を追加します。public bool IsFood(Vector3 cell):cellが食べ物の位置にある場合はtrueを返します。public void Eat():1点加算してから、MoveFood()を呼び出します。SnakeのStep()の最後で、GameManager.Instance.IsFood(next)の場合は、Eat()を呼び出します。
「プレイ」を押して食べ物の上に移動させると、食べ物が新しいセルに移動します。その後、「確認」を押します。
自分で試してみよう
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);
}
}
Unityゲーム:3Dスネークのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド