Прежде всего, он не имеет прямого отношения к вашей проблеме, но НЕ ставьте GetComponent()
или GameObject.Find()
в функцию Update()
. Эти две функции, особенно GameObject.Find()
, сверхтяжелые , поэтому рекомендуется вызывать эти виды функций внутри Start()
или Awake()
или при инициализации класса. Это может напрямую и сильно повлиять на производительность вашей игры, поэтому вот мое предложение:
[SerializeField]
private Snake_Move snakeMove;
И перетащите ваш игровой объект (к которому подключен компонент Snake_Head
) через Инспектора. Во-первых, всегда следует учитывать этот способ, а не использовать GameObject.Find()
и GetComponent()
.
Во-вторых, Float
не рекомендуется сравнивать равенство напрямую через =
, поскольку должно быть округление ошибка . Существует функция справки для сравнения двух значений с плавающей запятой в Unity, например Mathf.Approximately(float a, float b)
. Прямое сравнение двух значений float
через =
почти всегда не будет работать, как вы думаете.
В-третьих, не похоже, что в вашем коде нет функции Instantiate()
, но вы попробуйте использовать один яблочный объект, и каждый раз, когда вы его потребляете, просто меняйте его положение. Тогда почему Object.Destroy(gameObject)
существует? То, что вы делаете, просто уничтожаете яблоко, когда получаете его в первый раз. Я думаю, что вам нужно удалить функцию Destroy()
, а SpawnApple()
изменит целевую координату яблока, и позиция будет обновлена в функции Update()
.
И нет необходимости косвенно устанавливать цель и обновите его в функции Update()
. Вы можете напрямую установить положение яблока, например:
// assuming you followed my suggestio aboven about snakeMove.
public void Update()
{
SnakeAte();
Debug.Log(snakeMove.pos);
}
public void SpawnApple()
{
transform.position = new Vector2(Random.Range(-17, 17), Random.Range(-9, 9));
}
public void SnakeAte()
{
if (foodPos == snakeMove.pos)
{
SpawnApple();
}
}