Tak nie działa obsługa kolizji. Jeżeli dwa korpusy są przecięcia silnik fizyczny wykonuje logiczny AND
operatora pomiędzy ciałem collisionBitMask
i nawzajem ciała Current categoryBitMask
:
gdy dwie jednostki Physics stykają się ze sobą, może dojść do kolizji. Maska kolizyjna tego ciała jest porównywana z maską innego obiektu o nazwie , wykonując operację logiczną AND. Jeśli wynik jest niezerową wartością, to kolizja ma wpływ na tę bryłę. Każdy organ niezależnie wybiera, czy chce być dotknięty przez inne ciało. W przypadku przykładu można tego użyć, aby uniknąć obliczeń kolizji, które spowodowałyby nieznaczne zmiany prędkości ciała.
The source.
Tak więc wynik zależy od tego, jak ustawić categoryBitMask
na tych dwóch ciałach. Domyślna wartość dla categoryBitMask
to 0xFFFFFFFF
, oznacza wszystkie ustawione bity. Więc jeśli wykonasz & pomiędzy 0xFFFFFFFF
i 0b10
lub 0b01
, wynik będzie niezerowy, a więc kolizja.
Tak na przykład, ustawienie ciała swoje tak:
spriteA.physicsBody?.categoryBitMask = 0b01
spriteA.physicsBody?.collisionBitMask = 0b01
i
spriteB.physicsBody?.categoryBitMask = 0b10
spriteB.physicsBody?.collisionBitMask = 0b10
daje wynik chcesz. Ponadto, prawdopodobnie nie jest to dokładna konfiguracja, której potrzebujesz, to tylko prosty przykład, i będziesz musiał zmienić wartości w zależności od potrzeb. W takim przypadku spriteA zderzy się tylko z obiektami, które mają categoryBitMask
ustawione na 0b01
. To samo dotyczy spriteB, zderzy się z ciałami, które mają categoryBitMask
ustawione na 0b10
.
Również w przypadku, gdy nie chcesz te skrzaty, aby móc zderzają się z niczego, po prostu ustawić swoje collisionBitMask
właściwości 0.
Dziękuję za tę szczegółową odpowiedź! Rozwiązałem mój problem! –