Kod z braku czasu przeglądnąłem pobieżnie i tak – to mi umknęło. Jednak w dalszym ciągu jest kilka problemów.
Collider nie powinien zajmować się logiką dotyczącą inputu. Ma on od biedy wziąć dwa obiekty i je ze sobą stuknąć – aktualizując ich pozycję, kąt, prędkość itd. Te dane powinny być dostarczone colliderowi, zamiast wysysać je z palca. Łamiesz zasadę pojedynczej odpowiedzialności, niepotrzebnie komplikując kod i wprowadzając do niego niepotrzebne zależności (obiekt->klawiatura->kolizja).
Po drugie, implementujesz logikę inputu we wszystkich obiektach, nawet tych z inputem niepowiązanych. Co zrobisz, jeśli w danym teście zapragniesz stworzyć małe środowisko z wieloma martwymi obiektami (np. budynkami) i obiektem sterowanym przez gracza? Graczowi przypiszesz konkretne klawisze, a budynkom jakieś zerowe klawisze? Kolizja obiektu gracza z budynkiem wymaga sprawdzenia pozycji, kształtów, kątów i prędkości, a nie stanu klawiatury. To samo tyczy się obiektów sterowanych przez AI – im też trzeba będzie przypisać jakieś klawisze, zerowe/nullowe, jak zwał tak zwał.
Masz oczywisty błąd projektowy i zrozum to w końcu. Aby Twój kod miał sens, musisz rozdzielić logikę kolizji od sprawdzania inputu – koniec kropka.
Każdy obiekt mogący wchodzić w interakcję (tu: zderzać się) z innymi obiektami powinien posiadać dane dotyczące swojej pozycji i kształtu. Każdy obiekt mogący być poruszanym po ekranie, powinien dodatkowo posiadać dane dotyczące kierunku ruchu i prędkości. I to wszystko nie ma nic wspólnego z inputem.
Natomiast sam collider powinien być w stanie przeprowadzić zderzenie na podstawie instancji dowolnych obiektów opisanych w poprzednim paragrafie. Dla przykładu dwóch – przekazujesz dwie instancje do collidera, ten przeprowadza kolizję na podstawie danych zawartych w tych obiektach oraz odpowiednio je modyfikuje.
Logika inputu powinna się znajdować w innej klasie.