Jump to content
Unity Insider Forum

Unterschiedliches Verhalten im Android-Emulator und auf echtem Gerät


Recommended Posts

Hallo.

In meinem 2D-Projekt habe ich ein Player-, ein Feind- und ein Lootobjekt, Sprites nebst 2D-Boxcollidern.

Alle drei befinden sich auf dem gleichen Layer.

Player und Feind besitzen "Order in Layer" 2,  Loot 1.

Im Code nun geschieht folgendes nachdem das Playerobjekt bewegt wurde:

m_boxCollider.enabled = false; // Player's Collider
RaycastHit2D hit = Physics2D.Raycast(m_player.transform.position,Vector2.zero, 0f);
if (hit.collider != null) { // ... Handle Collision ...  }

Der Spieler betritt das Feld mit dem Loot, hit.collider ist <> null, er nimmt den Gegenstand.

In UNITY ausgeführt, in der Windows-Exe und im Bluestacks-Android-Emulator funktioniert es wie gewünscht.

Auf dem realen Gerät hingegen nicht.

Der Player betritt das Feld mit dem Loot und nimmt den Gegenstand nicht auf, er verweilt auf dem Spielfeld.

Wie ist solch ein Verhalten möglich? Wieso funktioniert es nur auf dem realen Gerät nicht?

Ich bin ratlos, hoffentlich kann mir jemand von Ihnen helfen.

Danke.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das kann ich zwar nicht genau sagen, aber vielleicht liegt es daran, dass du einen Raycast ohne Richtung und Länge verschießt. Vielleicht ist im Build aufgrund von Ungenauigkeiten der Player und der Loot nie genau auf der selben Position und kann deswegen kein Hit kommen.
Warum machst du das überhaupt mit nem Raycast? Reicht denn ein einfacher Trigger nicht aus?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

>>... nie genau auf der selben Position ...<<
Sehr guter Vorschlag, obwohl naheliegend, wäre ich darauf nicht gekommen.

Ich habe den Raycast ohne Längenangabe durchführen lassen.
Ich habe den Boxcollider des Loot-Objekts extrem vergrößert.
Ich habe nochmals die Positionierung der Objekte überprüft.
Als Kontrollinstrument habe ich mir vom laufenden Programm die Positionen der Objekte ausgeben lassen, sie befinden sich alle auf den ihnen zugedachten.

Und es funktioniert auf dem Tablet immer noch nicht, sonst überall.
Die Kollision mit den Enemy-Objekt findet statt, nur bei den Loot-Elementen nicht.

Hast du noch eine Idee, woran es scheitern könnte?

 

Ich habe Probleme mit dem Rigidbody, deshalb teste ich es jetzt mal ohne.
Beim Rigidbody verschiebt sich mein Objekt immer bei Kontakt mit anderen.
Ich weiss nicht, wie ich das in den Griff bekommen kann, ich finde dazu auch nichts im Netz.
Vielleicht hast du ja eine Anregung dazu, einzelne Stichworte würden eventuell schon helfen.

 

Danke.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schon seltsam, dass es auf dem Pad nicht geht... Bekommst du vielleicht eine Meldung in der Console, wnn du das Spiel im Editor testest? Wenn ja, dann könnte das der Unterschied sein, denn im Editor funktioniert vieles noch, obwohl es Fehler gibt. Im Build geht's dann meist nicht und kann sogar zum Abbruch führen.
Wenn du keine Meldung siehst, sollte ja alles in Ordnung sein und dann weiß ich echt nicht weiter. Könnte ja auch ein Bug in Unity sein.

Dass ein RB natürlich einen anderen RB verschiebt oder eben an einem Collider hängen bleibt, ist klar denn das soll er ja auch tun.
Wenn du jetzt auf mehreren Objekten RB's drauf hast, die sich nicht beeinflussen sollen, dann empfehle ich dir die Kollision über Layer zu steuern.
Du kannst dann in der Layer Colission Matrix einstellen, welche Layer kollidieren dürfen und welche nicht. So könnte in deinem Spiel der Player (der hat ja bestimmt einen RB) dem Layer "Player" zugewiesen sein. Aufnehmbare Dinge, wie z.B. Münzen, die von Oben runter fallen, hätten dann den Layer "Loot". Jetzt stellst du in der Matrix ein, dass diese beiden Layer (Loot und Player) eben nicht kollidieren dürfen. Dafür nimmst du am entsprechenden Schnittpunkt einfach den Haken raus. Das Loot würde jetzt mit allen Dingen ausser dem Player kollidieren.
https://docs.unity3d.com/Manual/LayerBasedCollision.html

Im Script kannst du aber immer noch gegen diesen Loot Layer testen, denn eigentlich haben alle Physics Funktionen auch einen Parameter, mit dem du auf Layer testen kannst. Bei 3D heisst das evtl. anders als bei 3D, aber es ist alles sehr ähnlich.
Fürs Auswerten bietet sich OverlapCircle an, weil dann hast du einen gewissen Radius und nicht nur einen Punkt im Raum.
https://docs.unity3d.com/ScriptReference/Physics2D.OverlapCircle.html

Den nötige Parameter ist :
https://docs.unity3d.com/ScriptReference/ContactFilter2D.html

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo.

Zunächst vielen Dank für deine Hilfe.

 

Dass es nur auf dem Tablet nicht funktioniert verwundert mich ja am meisten.

Im Editor erhielt ich keine Fehlermeldungen.

Ich habe zusätzlich zu dem Bluestacks-Emulator noch den von Google benutzt, auch dort funktioniert es.

Außerdem installierte ich eine LTS-Version von Unity.

 

Bevor ich deine Antwort las bin ich auch darauf gekommen, Raycast durch Physics2D.OverlapBoxAll zu ersetzen.

Jetzt funktioniert  es auch auf dem echten Gerät. Endlich.

 

Es wird wohl so sein, dass ich den Rigidbody falsch einsetze oder ich mir etwas anderes davon versprach.

 

Du hast mir hier einige Anregungen gegeben, ich werde mir das alles in Ruhe anschauen.

 

Danke sehr.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...