В любом столкновении участвуют два объекта GameObject, верно? Я хочу знать, как мне решить, какой объект должен содержать мой OnCollision*
?
В качестве примера, давайте предположим, что у меня есть объект Player и объект Spike. Моя первая мысль - поставить скрипт на плеер, который содержит такой код:
OnCollisionEnter(Collision coll) {
if (coll.gameObject.compareTag("Spike")) {
Destroy(gameObject);
}
}
Конечно, та же самая функциональность может быть достигнута, вместо этого имея скрипт на объекте Spike, который содержит такой код:
OnCollisionEnter(Collision coll) {
if (coll.gameObject.compareTag("Player")) {
Destroy(coll.gameObject);
}
}
Хотя оба они действительны, для меня более логично было иметь сценарий на проигрывателе, потому что в этом случае, когда происходит столкновение, на проигрывателе выполняется действие .
Однако, что заставляет меня сомневаться, это то, что в будущем вы можете захотеть добавить больше объектов, которые убьют игрока при столкновении, таких как враг, лава, лазерный луч и т. Д. Эти объекты, вероятно, будут иметь разные теги. Итак, сценарий на проигрывателе станет:
OnCollisionEnter(Collision coll) {
GameObject other = coll.gameObject;
if (other.compareTag("Spike") || other.compareTag("Lava") || other.compareTag("Enemy")) {
Destroy(gameObject);
}
}
Принимая во внимание, что в случае, когда скрипт был на Spike, все, что вам нужно было бы сделать, это добавить этот же скрипт ко всем другим объектам, которые могут убить Player, и назвать скрипт как-то так KillPlayerOnContact
.
Кроме того, если у вас есть столкновение между игроком и врагом, то вы, вероятно, хотите выполнить действие на обоих . Так в таком случае, какой объект должен обрабатывать столкновение? Или оба должны обрабатывать столкновения и выполнять различные действия?
Я никогда не создавал игры какого-либо разумного размера, и мне интересно, может ли код стать грязным и сложным в обслуживании по мере роста, если в начале вы ошиблись. Или, может быть, все способы действительны, и это не имеет значения?
Любое понимание высоко ценится! Спасибо за ваше время :)
Tag.SPIKE
вместо этого?