W każdej kolizji występują dwa GameObjects, prawda? Chcę wiedzieć, jak zdecydować, który obiekt powinien zawierać mój OnCollision*
?
Jako przykład załóżmy, że mam obiekt Player i obiekt Spike. Moją pierwszą myślą jest umieszczenie w odtwarzaczu skryptu zawierającego taki kod:
OnCollisionEnter(Collision coll) {
if (coll.gameObject.compareTag("Spike")) {
Destroy(gameObject);
}
}
Oczywiście taką samą funkcjonalność można uzyskać, zamiast tego mając skrypt na obiekcie Spike, który zawiera kod taki jak ten:
OnCollisionEnter(Collision coll) {
if (coll.gameObject.compareTag("Player")) {
Destroy(coll.gameObject);
}
}
Choć obie są poprawne, to więcej sensu dla mnie mieć skrypt na odtwarzaczu , ponieważ w tym przypadku, gdy w wyniku zderzenia się dzieje, akcja jest wykonywana na odtwarzaczu .
Jednak wątpię w to, że w przyszłości możesz chcieć dodać więcej obiektów, które zabiją gracza podczas kolizji, takich jak wróg, lawa, wiązka laserowa itp. Te obiekty prawdopodobnie będą miały inne znaczniki. Zatem skrypt w odtwarzaczu stałby się:
OnCollisionEnter(Collision coll) {
GameObject other = coll.gameObject;
if (other.compareTag("Spike") || other.compareTag("Lava") || other.compareTag("Enemy")) {
Destroy(gameObject);
}
}
Podczas gdy w przypadku, gdy skrypt znajdował się na Spike, wystarczy, że dodasz ten sam skrypt do wszystkich innych obiektów, które mogą zabić Gracza, i nadasz mu nazwę skryptu KillPlayerOnContact
.
Ponadto, jeśli masz kolizję między Graczem a wrogiem, prawdopodobnie chcesz wykonać akcję na obu . Więc w takim przypadku, który obiekt powinien poradzić sobie z kolizją? A może obie powinny poradzić sobie z kolizją i wykonywać różne czynności?
Nigdy wcześniej nie budowałem żadnej gry o rozsądnych rozmiarach i zastanawiam się, czy kod może stać się niechlujny i trudny w utrzymaniu, ponieważ rośnie, jeśli na początku coś takiego się nie powiedzie. A może wszystkie sposoby są prawidłowe i to naprawdę nie ma znaczenia?
Każdy wgląd jest mile widziany! Dziękuję za Twój czas :)
Tag.SPIKE
zamiast tego?