Algorytm obliczania kolizji nie działa prawidłowo

0

Witam, próbuję napisać skrypt na kolizję do gry w której każdy krok ma zawsze taką samą odległość i gracz porusza się po niewidzialnej siatce, jak w starych grach 2D.
Oto część skryptu odpowiadająca za tą kolizję

 
void OnCollisionEnter2D(Collision2D coll) //TODO: System blokowania klawiszy na podstawie obliczeń Odległości
	{
		
		if(coll.gameObject.tag == "NPC" || coll.gameObject.tag == "Object")
		{
			GameObject _NPC = coll.gameObject;

			

			if(Player.position.y - coll.transform.position.y == -10 && Player.position.x == coll.transform.position.x) //W
			{
				print ("W");
				collW = true;
			}
			else if(Player.position.y - coll.transform.position.y == 10 && Player.position.x == coll.transform.position.x)//S
			{
				print ("S");
				collS = true;
			}
			else if(Player.position.x - coll.transform.position.x == 6.4 && Player.position.y == coll.transform.position.y)//A
			{
				print ("A");
				collA = true;
			}
			else if(Player.position.x - coll.transform.position.x == -6.4 && Player.position.y == coll.transform.position.y)//D
			{
				print ("D");
				collD = true;
			}
		}
	}
	void OnCollisionExit2D(Collision2D coll)
	{
		if (coll.gameObject.tag == "NPC" || coll.gameObject.tag == "Object") 
		{
						collW = false;
						collS = false;
						collA = false;
						collD = false;
		}
	}

Gdy zajdzie jakakolwiek kolizja z obiektem który posiada Tag NPC bądź object dobiera się któryś z ifów.
Player jest obiektem klasy Transform, który jest po prostu obiektem sceny przeniesionym do Inspektora do skryptu PlayerEssentials (przedstawiony powyżej ).Gdy uruchamiam grę i wchodzę w kolizję z takim obiektem z tagiem NPC to żaden z 4 ifów się nie wykonuję zaś if na samym początku metody OnCollisionEnter2D się wykonuję.
Co powinienem poprawić aby to działało jak należy ?

3

Do liczb zmiennoprzecinkowych nigdy nie stosujemy sztywnych porównań "==". Musisz określić jakiś przedział, który wychwyci kolizję >=, >, <, <=...

0

Ale o to chodzi że właśnie,bo tu nie napisałem,dodałem parę zmian i zachodzi NullReference i czepia się NPCessentials.NPC.transform, więc kolizja zachodzi, ale jest ten NullReferenceException,dla sprostowania chciałbym dodać że chciałbym aby ta kolizja dotyczyła gracza i każdego obiektu ze skryptem NPCEssentials.
Oto poprawiony skrypt, gdzie do IF'a dochodzi, lecz zgłasza się wyjątek:

 
void OnCollisionEnter2D(Collision2D coll) //TODO: System blokowania klawiszy na podstawie obliczeń Odległości
	{
		if(coll.gameObject.tag == "NPC" || coll.gameObject.tag == "Object")
		{

			NPCEssentials NPCessentials = new NPCEssentials();

			if(Player.position.y - NPCessentials.NPC.transform.position.y == -10 && Player.position.x == NPCessentials.NPC.transform.position.x) //W
			{
				print ("W");
				collW = true;
			}
			else if(Player.position.y - NPCessentials.NPC.transform.position.y == 10 && Player.position.x == NPCessentials.NPC.transform.position.x)//S
			{
				print ("S");
				collS = true;
			}
			else if(Player.position.x - NPCessentials.NPC.transform.position.x == 6.4 && Player.position.y == NPCessentials.NPC.transform.position.y)//A
			{
				print ("A");
				collA = true;
			}
			else if(Player.position.x - NPCessentials.NPC.transform.position.x == -6.4 && Player.position.y == NPCessentials.NPC.transform.position.y)//D
			{
				print ("D");
				collD = true;
			}
		}
		else if(coll.gameObject.tag == "Portal")
		{

		}
	}

Prawdopodobnie coś nie tak zrobiłem z obiektem klasy NPCEssentials, tylko nie wiem co.

0

NullReference oznacza, że zmienna jest niezdefiniowana. Czyli prawdopodobnie NPCessentials nie posiada takiego parametru jak NPC, albo parametr NPC nie posiada transform.

A jeżeli chodzi o to, że ify się nie wykonują, widzę 2 możliwe problemy:

  1. Gdy robisz porównanie. Jest szansa, że position.x wynosi np. 6.0000000000001 i gdy odejmiesz to otrzymasz np. wynik: 6.3(9) co nie jest równe 6.4. Spróbuj sobie rzucić Debug.Log w którym wypiszesz parametry ifa i zobaczysz czy to się nie zgadza.
  2. position.x określone jest zależnie od obiektu. Najczęściej powinien być to środek obiektu, ale nie zawsze tak jest. Sprawdź sobie czy środki są tam, gdzie powinny.
0

@Xingu
Dzięki,teraz gdy kod już działa poprawnie to mam pewien inny problem.
Gdy podejdę do lewej części NPC z perspekjtywy kamery klawiszem D to kolizja zachodzi,lecz gdy podejdę z innych stron (z góry,z dołu) do lewej części NPC to kolizja nie zachodzi pomimo to że w Inspektorze pozycja gracza jest identyczna jak przy podchodzeniu z lewej. To samo się tyczy innych części NPC(prawa,dolna,górna(.
Dlaczego ? Kod to same sztywne obliczenia (Różnica pozycji X Gracza i pozycji X NPC)

0

Jesteś w stanie dołączyć screen tego o czym rozmawiamy? Bo w sumie nie do końca jestem to sobie w stanie wyobrazić.

0

Screeny są w załącznikach.
Na pierwszym obrazku widać, że w konsoli pojawia się wpis że zaszła kolizja z lewym bokiem NPC więc klawisz D jest zablokowany aż do momentu z niej wyjścia.Na drugim obrazku pomimo to że pozycja gracza jest dokładnie identyczna to wpis się nie pojawia, a gdy wcisnę klawisz D to gracz zaczyna się trząść.
Oto skrypt:

 
void OnCollisionEnter2D(Collision2D coll) 
	{
		
		if(coll.gameObject.tag == "NPC" || coll.gameObject.tag == "Object")
		{

			NPCEssentials NPCessentials = new NPCEssentials();

			

			if(Player.position.y - coll.gameObject.transform.position.y <= -10 && Player.position.x == coll.gameObject.transform.position.x && NextWalk)//W
			{
				print("CollW");
				collW = true;

			}

			else if(coll.gameObject.transform.position.y - Player.position.y <= -10 && Player.position.x == coll.gameObject.transform.position.x && NextWalk)//S
			{
				print("CollS");
				collS = true;
			}

			else if((Player.position.x - coll.gameObject.transform.position.x == -6.4 || Player.position.x - coll.gameObject.transform.position.x <= -6.4 ) && Player.position.y == coll.gameObject.transform.position.y && NextWalk)//D
			{

				print("CollD");
				collD = true;
			}
			else if((Player.position.x - coll.gameObject.transform.position.x == 6.4 || Player.position.x - coll.gameObject.transform.position.x >= 6.4 ) && Player.position.y == coll.gameObject.transform.position.y && NextWalk)//A
			{
				print("CollA");
				collA = true;

			}
			
		}
	
	}
      
void OnCollisionExit2D(Collision2D coll)
	{
		if (coll.gameObject.tag == "NPC" || coll.gameObject.tag == "Object") 
		{
						collW = false;
						collS = false;
						collA = false;
						collD = false;
		}
	}

1 użytkowników online, w tym zalogowanych: 0, gości: 1