Unity Raycast / Gebäude anklicken?
Ich versuche aktuell ein Panel zu öffnen, wenn man auf ein platziertes Gebäude klickt (2D in Grid System)Das hier ist der kritische Code Ausschnitt:
void Update() {
if (!Input.GetMouseButtonDown(0)) return;
//if (EventSystem.current != null && EventSystem.current.IsPointerOverGameObject()) return;
Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 point2D = new Vector2(worldPos.x, worldPos.y);
RaycastHit2D hit = Physics2D.Raycast(point2D, Vector2.zero, 0f);
Debug.Log($"Klick bei {point2D}, Treffer: {(hit.collider != null ? hit.collider.name : "kein Treffer")}");
Debug.DrawLine(worldPos + Vector3.left * 0.2f, worldPos + Vector3.right * 0.2f, Color.green, 1f);
Debug.DrawLine(worldPos + Vector3.up * 0.2f, worldPos + Vector3.down * 0.2f, Color.green, 1f);
if (hit.collider != null) {
var b = hit.collider.GetComponent<Building>();
if (b != null) {
Debug.Log($"Gebäude getroffen: {b.name}");
StartCoroutine(OpenMenuDelayed(b));
return;
}
}
UIManager.Instance.ShowBuildingMenu(null);
}
Die Kommentierte Zeile (die dritte) ist das Problem, sobald sie reingenommen wird kann ich das Gebäude nicht mehr anklicken (andere Tiles schon). Ich debugge jetzt schon etwas länger, weiß aber nicht wie ich das lösen soll (bin noch etwas neu bei Unity). Das Problem ist, dass ohne die diese Zeile es möglich ist durch UI Fragmente zu klicken, wie Buttons oder Menüs.
1 Antwort
In der auskommentierten Zeile steht explizit, dass der weitere Verlauf der Update-Methode abgebrochen werden soll, wenn sich der Mauszeiger über dem aktuellen GameObjekt befindet (IsPointerOverGameObject). Insofern halte ich das Verhalten nicht für verwunderlich.
Du kannst mit Layers arbeiten und so spezifisch zwischen den Zielen bei Klicks/Raycasts unterscheiden. Der folgende Raycast wäre beispielsweise nur dann erfolgreich, wenn dein Panel auch auf dem Layer "SomePanel" liegt:
int buildingLayerMask = LayerMask.GetMask("SomePanel");
RaycastHit2D hit = Physics2D.Raycast(point2D, Vector2.zero, 0f, buildingLayerMask);