Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011
Reggie()

[Kartenspiel] Grundgedanken eines Newbies

Recommended Posts

Hi. Mein erstes Unity-Projekt soll ein Kartenspiel (Kartenlegespiel) werden. Erst einmal würde ich es in 2D versuchen. Im Zuge meiner theoretischen Überlegungen bin ich bei einer Idee gelandet, zu der ich gerne eine Meinung lesen würde.

Das Kartendeck (z.B. 60 Karten) erstelle ich zu Spielbeginn und lege sie in einem Array ab. Jeder "Ort", an dem sich Spielkarten befinden können (Vor den Spielern, in der Hand der Spieler, Ziehstapel, Ablagestapel) ist ein GameObjekt. Wechselt nun eine Karte den Ort, so würde sie vom "Child" des alten GameObjektes zum "Child" des neuen GameObjektes werden. Die Eigenschaften der jeweiligen GameObjekte steuert dann automatisch, wie die Karten angeordnet/angezeigt werden.

Die Benutzeroberfläche würde ich mit UnityGUI realisieren. Wer am Zug ist, steuert eine Anzeige. Ist der menschliche Spieler nicht am Zug, ignoriere ich jede Eingabe (Maus, tastatur (außer ESC)). 

Die Programmlogic befindet sich dann in den Scrips zu den Karten und wird ausgeführt, wenn diese in eine Aktion "verwickelt" werden (ziehen, verschieben, aktivieren...usw.)

Ist das so ungefähr machbar? Wie gesagt, ich befinde mich in der Lernphase und dies ist nur eine Umsetzungsidee (ich befinde mcih zur Zeit im Büro).

Reggie()

Share this post


Link to post
Share on other sites

Das sollte so machtbar sein  👌🏻

Grade in der Lernphase würde ich die Ideen einfach mal versuchen, wenn das später mal was nicht klappen sollte kannst du immernoch hier im Forum fragen. 

Aber die Grundidee der Umsetzung hört sich gut an. 

Share this post


Link to post
Share on other sites

für mich ist der prodezuale Ansatz immer noch so tief verankert, dass ich instinktiv nach der Möglichkeit durch eine zentrale Programmsteuerung suche. Durch UNITY ist mir zum ersten Mal der Objekt orientierte Ansatz klar geworden :)

Die Ablauf zu Programmstart geschieht dass durch ein leeres GameObject-Script? oder kann ich ein script direkt an eine scene hängen? oder gibt es direkt eine Möglichkeit Start-Code zu Beginn einer scene aufzurufen?

Reggie

Share this post


Link to post
Share on other sites

oder gibt es direkt eine Möglichkeit Start-Code zu Beginn einer scene aufzurufen?

Hallo,
Einfach einen Skript in ein aktives GameObject reinziehen und den Code sehr wichtig in die Start() Funktion des Skriptes reinziehen, dann wird der Programmcode direkt beim Start der Szene aufgerufen :) 

Share this post


Link to post
Share on other sites

Kannst du. Aber wenn es nichts mit deiner Kamera zu tun hat, dann ist das schlechter Stil durch den du früher oder später auf die Nase fallen wirst. Beschreibe doch einfach mal kurz, was du überhaupt zum Spielstart machen willst.

Share this post


Link to post
Share on other sites

Es ist ein Karten-Legespiel. D.h. zu Spielstart müssen die Spielkarten "erschaffen", der Kartenstapel gemischt und die Start-Karten an die Spieler verteilt werden. Dann muss der Zuganzeiger eingestellt und angezeigt werden. Dann erst kann die erste Aktion des Spielers verarbeitet werden.

Reggie()

Share this post


Link to post
Share on other sites

so stelle ich mir den Aufbau vor: 

screen.jpg

die Bereiche sollen, sobald Karten dorthin geschoben werden, diese gemäß einem Raster einordnen. Der Spieler macht das über Drag&Drop.

Share this post


Link to post
Share on other sites

Dann bau dir ein GameObject namens "Card Generator" oder irgendwas. Nur keine Scheu, einfach GameObjects für jede Rolle in deinem System zu erstellen.

Share this post


Link to post
Share on other sites

Ich stehe grad vor der Frage, wie ich das "Einordnen der Karten" bei den Bereichen der Spielfläche umsetze.  Spontan denke ich da an 2 Möglichkeiten:

1. Die Bereiche sind so gestaltet, dass die Karten einen festen Abstand zu den Rändern und anderen Karten haben müssen. Das würde dann der BereichsManager regeln, wenn ihm eine Karte zum Einordnen "übergeben" wird

2. Jeder Bereich hat ein Array mit points. Diese points sind die "Einrast-Punkte" für die Kartenobjekte (setzte Karte auf den ersten freien point)

Geht das so oder setzt man das ganz anders um? 

Reggie()

Share this post


Link to post
Share on other sites

Ginge beides. Bei meinem Kartenprojekt gibt man einmalig eine Zahl ein, die dann den Abstand zwischen den Karten darstellt. Mehr Werte eintragen zu müssen, um dasselbe zu erreichen, ist nicht so prickelnd. Wenn du aber unregelmäßige Kartenverteilung haben willst, ist die zweite Variante besser.

Share this post


Link to post
Share on other sites

die Kartenanordnung muss nur 2 Regeln folgen: Unterschiedliche nebeneinander, gleiche Karten überlappend übereinander. d.h ich brauche wohl neben der horizontalen Ebene auch eine vertikale...

Share this post


Link to post
Share on other sites

Wenn die Abstände aber immer gleich sind, dann reicht aber ein einzelner Wert pro Achse; da brauchst du kein Array mit Punkten.

Share this post


Link to post
Share on other sites

ist die Formel zur Berechnung des nächsten freien Platzes denn nicht aufwendiger, als einfach den nächsten freien Punkt aus dem Array auszulesen? Zumal ich die Karten je eh in den Array einordne, denn jede Karte ist ja ein einzigartiges GameObject, dass ja immer irgendwo sein muss, damit alles seine Ordnung hat. Dann kann ich das doch gleich mit nutzen, dass jede neue Karte im Array auch ihren Platz zugeordnet und gespeichert bekommt.

Share this post


Link to post
Share on other sites

Wir reden hier von Prozessoren mit gut und gerne 102.000.000.000 floating point operations pro Sekunde. Das sind bei 60 fps 1.700.000.000 Operationen pro Frame. Mach dir mal wegen ein paar kleinen Rechenaufgaben für deinen Computer keinen Kopf, ist nicht mehr 1992 ;)

Heutzutage ist es viel wichtiger, Fehleranfälligkeit, wie sie z.B. durch das manuelle Eingeben aller Positionen kommt, gering zu halten. Um Performance solltest du dir erst dann einen Kopf machen, wenn sie sich als Problem entpuppt. Als kleiner Spoiler: Das wird sie hier nicht.

Share this post


Link to post
Share on other sites

das ist witzig. ich dachte da nicht an die Rechenleistung meines Computers, sondern an MICH bei der Erstellung der Rechenformel ;)

Share this post


Link to post
Share on other sites

Öh, na dann...

positionDerKarte = ursprungDesPlatzes * Vector3.right * indexDerKarte;

oder anders:

public Vector3 GetCardPosition(int index)
{
  return transform.position * Vector3.right * index;
}

davon ausgehend, dass das Script auf dem Kartenfeld liegt. Mehr ist da nicht dran.

Edited by Sascha
Code korrigiert

Share this post


Link to post
Share on other sites

ich glaube ich verstehe deine Formel nicht. Was ist mit

freePoint = firstPoint + ((cardwidth + padding) * index)

bei deinem 2. code verwirrt mich das void. wird nicht durch return ein Rückgabewert zurückgegeben?

also so?

public Transform GetCardPosition(int index)
{
  return transform.position * Vector3.right * index;
}

 

Share this post


Link to post
Share on other sites

Ich glaube, dass da in Saschas Code ein kleiner Dreher drin ist.. 

 

Zum einen hast du Recht, dass das 'void' an der Stelle keinen Sinn ergibt. Aber der Rückgabewert ist nicht vom Typ 'Transform', sondern 'Vector3'. 

 

vor 22 Minuten schrieb Reggie():

firstPoint + ((cardwidth + padding) * index)

Die Formel sieht richtig aus. Sie gibt dir aber nur den Abstand vom Startpunkt.

Wenn du die Position ausrechnen willst, würde ich es so machen wie Sascha. Nur 'plus' die Startposition, nicht 'mal'. Und die Verschiebung nach Rechts mit dem Abstand zwischen zwei Karten multiplizieren.

Also:

public Vector3 GetCardPosition(int index)
{
 return firstPoint + Vector3.right * (cardwidth + padding) * index;
}

 

Share this post


Link to post
Share on other sites

Jo, hab das nur so runtergetippt, war ein Fehler drin. "cardwidth + padding" kann man natürlich machen, muss man aber auch nicht, wenn man einfach den Abstand zwischen immer demselben Punkt einer Karte meint (z.B. Mittelpunkt zu Mittelpunkt). Wenn's dir damit einfacher fällt, nur zu :)

Share this post


Link to post
Share on other sites

ich meinte auch nicht, dass meins besser wäre- ich hatte nur deinen code nicht verstanden, daher..  aber jetzt glaube ich sogar, dass deiner meinem Wunsch näher kommt. Nur verstehe ich noch nicht, woher kommt der index? wenn ich den ersten freien spot in einem Bereich suche, dann müsste ich dann nicht statt index eher array.length nehmen? dann würde sich auch gleich die Anordnung bei jeder Veränderung hinlegen oder wegnehmen von Karten aus dem Bereich anpassen. oder?

Share this post


Link to post
Share on other sites

Der kommt aus deinem Kontext. Wenn du deine Karte immer hinten anreihen willst, dann wird das zum Beispiel der Anzahl der bereits liegenden Karten entsprechen.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×