Проблемы с производительностью Unity Поиск игровых объектов?
Мой простой сценарий должен следовать за игроком, но он перестал находить игровой объект с тегом "Player"... Единственное решение, которое я смог найти, - создать новый тег, назначить его своему игроку, а затем изменить имена тегов. во всех сценариях.
Я нашел другой способ найти объект игрока, и он мне больше нравится, но я новичок в этом и не знаю, повлияет ли это на производительность. Вот мой оригинальный код, который не мог правильно найти тег
public Vector3 offset;
private Transform player;
void Awake (){
player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update (){
transform.position = player.position + offset;
}
Если я сделаю это общедоступным, чтобы я мог перетащить свой объект проигрывателя на скрипт в инспекторе, это повлияет на производительность и это не хорошая идея?
Мой здравый смысл говорит мне, что это плохой способ сделать это, потому что я видел сценарии других людей, и они используют FindGameObjectWithTag(). Зачем пытаться писать лишние строки, если вы можете просто сделать это так...
public Vector3 offset; // The offset at which the Health Bar follows the player.
public Transform player; // Reference to the player.
void Update ()
{
transform.position = player.position + offset;
}
Кто-то, пожалуйста, дайте мне знать, потому что я новичок в этом, и я не хочу начинать делать вещи неправильно. Спасибо!
2 ответа
Ваш второй код абсолютно прав. Некоторые люди используют FindGameObjectWithTag()
но другие используют открытую переменную. Вот и вся причина, по которой Unity может предложить их в редакторе. Таким образом, вы можете просто перетащить материал в сценарии:)
Я лично использую общедоступную переменную, когда нахожусь в ситуации, которая похожа на вашу, то есть у вас есть один сценарий и один проигрыватель, который вы хотите, чтобы он был присоединен к сценарию.
Я считаю, что в этом случае использование публичной переменной на самом деле правильно. Представьте себе, если позже вы решите сделать префаб другого игрока, переключитесь на него, проведите несколько тестов, переключитесь позже... вы можете легко изменить их в редакторе. Если вы использовали FindGameObjectWithTag()
, вам придется изменить теги на обоих сборных. Ошибка склонна.
Теперь представьте, если у вас есть несколько сценариев, использующих Player. В этом случае, если вы хотите изменить префаб Player, вам придется вручную изменить все ссылки в редакторе. Это большая работа, так что, возможно, вы просто захотите пометить что-нибудь еще.
С точки зрения производительности, использование общедоступной переменной на самом деле быстрее, потому что это прямая ссылка на объект, в то время как FindGameObjectWithTag()
будет искать объект. Но это на самом деле не имеет значения, потому что FindGameObjectWithTag()
очень быстро
Это не должно быть проблемой производительности. FindGameObjectWithTag возвращает список объектов, соответствующих тегу, который вы передаете в качестве параметра, обычно он используется, когда есть несколько объектов, имеющих этот тег. В сценарии, в котором у вас есть много объектов с тегом, и вам нужна ссылка на них все, ссылаться на них вручную через открытые переменные нецелесообразно; Более того, могут быть динамически сгенерированные объекты, на которые вы не можете ссылаться до их создания.