Есть
Урок 6 из 14 курса Игра на Unity: 3D-змейка на Coddy.
Змейка съедает еду, когда её голова попадает на клетку с едой. Обе позиции заданы целыми числами, поэтому сравнивать их с помощью == безопасно: Unity считает две позиции Vector3 равными при использовании ==, если расстояние между ними меньше 0.00001, а при добавлении целых клеток разница никогда не бывает настолько маленькой.
Змейка знает, когда делает шаг; GameManager знает, где находится еда, и ведёт счёт. Поэтому после каждого шага змейка спрашивает, а GameManager отвечает: IsFood(cell) возвращает значение bool, а Eat() добавляет очко и перемещает еду. Змейка обращается к GameManager через статический Instance — синглтон, с которым ты познакомился в курсе C# для 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): возвращает true, еслиcell— позиция еды. - Напиши
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);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.