Jump to content
Unity Insider Forum
Maurice94

Kartenspiel - Interaktion zwischen UI Elementen und 3D Welt

Recommended Posts

Guten Abend gemeinsam!

Ich stehe aktuell vor einem Problem, beziehungsweise weiß ich, wie ich mein Vorhaben umsetzen kann, bin jedoch mit dem Weg und der Ausführung nicht zufrieden. Um kurz zu erklären, was ich aktuell versuche und an welchem Punkt ich mich befinde, hier eine kleine Skizze meiner Hierarchie:

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    - UI Canvas (mein Canvas, der meine Handkarten im Screen Space Overlay Modus über das 3D Spielfeld im Hintergrund rendert)
       - Player 1 Hand (leeres Gameobjekt, das eine horizontale Layoutgruppe   und einen Content Size Fitter als Komponenten trägt, um die Childs (die Handkarten) ordnungsgemäß anzuordnen)
       - Player 2 Hand (selbiges gilt hier, nur für die entgegengesetzte Seite)


    - 3D Environment (leeres Objekt, was lediglich als Gruppenparent für die Umgebung dient)
       - Player 1 Battlefield (einfach ein 3D Cube, den ich so geformt habe, dass er einem Spielfeld entspricht - liegt auf dem Layer "Player1Side, um später mit Raycasting genau diesen Layer                                                                   ansprechen zu können")
       - Player 2 Battlefield (genau das Gleiche wie für die Spielseite von Player 1 - Layer: "Player2Side")
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 


Ich arbeite mit integrierten Interfaces, um meine UI Elemente per Drag and Drop steuern zu können. IBeginDragHandler, IDragHandler, IEndDragHandler!
Mein Problem ist jedoch, dass diese Interfaces lediglich mit dem UI funktionieren und sich nicht auf normale 3D Gameobjekte wie z.B einen Cube übertragen lassen.
Ich kann also nicht einfach ein UI Element auf einen Cube ziehen und vom Cube aus die OnDrop() Funktion aufrufen.

Um es präziser zu formulieren: ich möchte eine Karte aus meiner Hand draggen (was ja auch funktioniert) und sobald ich die Karte auf dem Feld in der Scene fallen lasse, beziehungsweise droppe, möchte ich eine 3D Variante von dieser Karte instantiaten. Das ist nicht das Problem - ich bin in der Lage Prefabs an bestimmten Stellen zu instantiaten. Ich weiß jedoch nicht, wie ich mein UI Setup mit der Gamewelt, beziehungsweise meinem 3D Spielfeld verbinden kann. Ich habe bereits versucht, die Layermaske des Spielfeldes über simples Raycasting anzusprechen, indem ich in der OnBeginDrag() Function die Property blockRaycasting von der CanvasGroup-Komponente deaktiviere, um quasi mit meiner Maus auch durch die Karte, die ich gerade dragge, raycasten zu können. Ich kann auch Objekte unterhalb meiner Karte erkennen. Aber wie kriege ich es hin, dass etwas passiert, sobald ich die Maus dann loslasse. Es geht wirklich nur um diesen speziellen Moment, den Rest kann ich lösen.

Als ich mein Projekt komplett in 2D aufgesetzt habe, hat alles einwandfrei funktioniert. Das hat aber auch daran gelegen, dass ich RectTransforms als DropZones für meine Karten benutzen konnte. RectTransforms sind nämlich im Gegensatz zu 3D Objekten in der Lage, die OnDrop Funktion aufzurufen. Aber das ist mir zu statisch und ich hatte vor, das ganze Projekt in 3D UND 2D aufzusetzen um es etwas dynamischer zu gestalten.

Ich füge nochmal ein Bild bei, was meine Szene abbildet.
Vielen vielen Dank an die Leute, die sich die Zeit nehmen, darüber nachzudenken und mir gegebenenfalls eine Antwort auf meine Frage geben können!

Liebe Grüße,
Maurice


 

Example.jpg

Share this post


Link to post
Share on other sites

Ist die Frage noch aktuell?

Also ich hab mal so was ähnliches gemacht. Bei mir hatte ich es so gelöst, das unten UI Elemente sind. Klickt man das Objekt an, verschwindet das UI und man bekommt das 3D Modell "angehangen" an den Mauscursor und wird dann da hin gesetzt wo man mit der Maus klickt. Dafür hatte ich RayCasting genutzt.

Share this post


Link to post
Share on other sites

@Kojote Guten Morgen und danke für deine Rückmeldung. Die Meldung ist noch ziemlich aktuell, ja. Ich konnte jedoch einen Weg finden, meine Idee umzusetzen. Was ich nun gemacht habe ist folgendes: ich habe zunächst einmal den Rendermode vom Canvas von Screen Space Overlay auf World Space gesetzt und direkt über meinem Spielfeld positioniert, so dass die Kamera das exakte Erscheinungsbild wie oben rendert. Da meine UI Elemente nun in der Gamewelt existieren, können sie also auch auf Collider Events und Trigger reagieren. Ich habe meinem UI Handkarten Prefab also einen Box Collider und einen Rigidbody hinzugefügt. Wenn ich nun die OnDrag-Funktion benutze und meine Karten auf dem World Canvas bewege, kann ich die Box Collider vom Spielfeld ansprechen und von dort aus OnTriggerEnter, etc. ausführen. Ich habe es nun so eingefädelt, dass... sobald ich mein UI Element dragge, ein Bool auf true gesetzt wird, um erstmal zu signalisieren: "Okay, wir draggen gerade!" - sofern dies gegeben ist und ich mich im Trigger vom Spielfeld befinde und meine linke Maustaste loslasse (die ja noch gedrückt ist, da ich am draggen bin), instantiate ich meine 3D Variante der Karte an einer von mir bestimmten Position.. gibt 3 Felder, einfach 3 Transforms die quasi Spawnpunkte sind. Deine Lösung hört sich jedoch auch interessant an! Vielleicht spiele ich damit auch mal rum. Danke erstmal, dass du überhaupt was geschrieben hast 🙂

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...