Jump to content
Unity Insider Forum

[Kartenspiel] Grundgedanken eines Newbies


Reggie()

Recommended Posts

Danke, ich habs zwar nicht 100% durchschaut, aber ich werde es zuhause mal testen. Nur mal so gefragt: Kann man ein reines script-Objekt (mit constructor erstellt) zum Unity-GameObject machen und ihm Komponenten verpassen? Also würde Option c) gehen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, aber damit verzichtest du auf viele positive Dinge, die Unity dir gibt.

GameObjects kannst du mit new erstellen:

var go = new GameObject("GameObject Name");

Das GameObject hat dann schon eine Transform-Komponente, weil jedes GameObject immer eine hat.

Neue Komponenten kann man mit new nicht erstellen (ich glaube, darauf bist du schon gestoßen), sondern nur mit AddComponent:

var spriteRenderer = go.AddComponent<SpriteRenderer>();
spriteRenderer.sprite = image;

Wie du siehst, gibt AddComponent gleich eine Referenz auf die neue Komponente zurück (damit du nicht hinterher nochmal GetComponent benutzen musst). Damit kannst du dann gleich weiterarbeiten.

Aber wie gesagt, damit verbaust du dir den Weg, das richtig gut zu machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 6 months later...

Nach längerer Pause will ich nun an meinem - nach wie vor aktuellem - Projekt weiterarbeiten. 

Meine Kartenobjekte reihen sich nun schön automatisch im definierten Bereich auf :)  Aber natürlich stoße ich auf weitere konzeptionelle Probleme, die ich hier kurz beschreiben möchte, damit ich Schritt für Schritt weiter komme:

1. Interaktivität beschränken: Grundsätzlich sollte jedes Element/Objekt im Spiel anklcikbar/anwählbar sein, aber nicht jederzeit! Meine erste Idee war, dass ich einfach die Elemente "überdecke" (mit Panel?), die zu bestimmten Zeiten im Spiel nicht angewählt werden dürfen. Mein "Gefühl" sagt mir aber, dass es wahrscheinlich der richtige Weg ist, dass jeder Interaktionsversuch individuell prüft, ob der zu dem Zeitpunkt legal ist. Beispiel: Der Computer ist am Zug, also sein die Interaktionsmöglichkeiten des menschlichen Spielers sehr begrenzt. Mittels Verdecken die Interaktion zu verhindern scheint mir der einfacherere Weg.

2. Funktionen/Fähigkeiten der Karten: Erster Gedanke: jedes Kartenobjekt hat individuelle Funktionen (verschiedene Prüfungen von Bedingungen und Auswirkungen). Zweiter Gedanke: Alle Funktionen aller Karten sind in einer Klasse definiert und werden über den Funktionsnamen/ID aufgerufen und abgearbeitet. Vorteil: Die Kartenobjekte sind schlanker und ich wüsste auch nicht, wie Funktionen/Methoden innerhalb der Objekte (wohl scriptableObjects) gespeichert werden könnten.

@Sascha gibt es dein Kartenspiel schon als fertiges oder ausführbarer Programm? Vielleicht hast du schon Dinge genau so umgesetzt, wie ich es auch gerne hätte, dann könnte ich direkt davon lernen. Mein Vorbild in Sachen Funktionalität ist Heartstone. Nicht das Spiel selber, aber Spielablaufsteuerung und Deckbau und Deck-Management. Und soweit ich weiss ist Heartstone auch in Unity erstellt worden.

 

Reggie()

Link zu diesem Kommentar
Auf anderen Seiten teilen

oh schön. ich hatte schon befürchtet, dass dieses Forum tot ist. Ist aber deutlich weniger los hier... 

Hast du eventuell auch etwas helfendes zu meinen Fragen zu sagen. Ich tue mich wirklich schwer schon ein Grundgerüst für ein Kartenspiel zu erstellen, weil ich zu diesem Thema auch nichts gefunden habe. Für 2D/3D-Shooter und Jump&Runs gibt es zig Bücher, Tutorials und Videos. Aber zu Kartenspielen nicht :( 

Reggie()

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gibt eben nicht für alles Tutorials. Man muss halt programmieren lernen und damit etwas neues bauen. Informatik bedeutet eben nicht, lauter Dinge zu tun, die vor einem jemand schon gemacht hat, sondern neue Dinge zu bauen. Und dafür muss man die Fähigkeit erwerben, mit denen gegebenen Werkzeugen neues konzipieren zu können.

Aber zu den Fragen:

vor 4 Stunden schrieb Reggie():

Meine erste Idee war, dass ich einfach die Elemente "überdecke"

Lieber nicht. Deaktiviere stattdessen einfach die Komponente, die auf Klicks reagiert.

vor 4 Stunden schrieb Reggie():

(mit Panel?)

Das heißt, du arbeitest im Canvas. Auch wenn das das Layouting leichter machen kann, würde ich das lassen und SpriteRenderer benutzen. Canvas...se haben eine Menge zusätzlichen Ballast, der es etwas doof macht, sie für etwas anderes als UI zu benutzen.

vor 4 Stunden schrieb Reggie():

Der Computer ist am Zug, also sein die Interaktionsmöglichkeiten des menschlichen Spielers sehr begrenzt.

Wenn du alles ausschalten willst, was der Player machen kann, dann deaktiviere direkt die Komponente, die Spieler-Interaktion macht.

vor 4 Stunden schrieb Reggie():

Alle Funktionen aller Karten sind in einer Klasse definiert und werden über den Funktionsnamen/ID aufgerufen und abgearbeitet.

Dann hast du ne fiese Monsterklasse. Da gibts schon echt schöne(re) Wege, aber das ist dann echt was für Fortgeschrittene. Ich würde vermutlich im ScriptableObject eine ReorderableList für Objekte einer serialisierbaren Basisklasse anlegen, die virtuelle Methoden für verschiedene Spielsituationen enthält. Wenn das nicht drin ist, würde ich eher für jeden Kartentyp ein Prefab erstellen. Gerade mit 2018.3 und dessen neuen Prefab-Möglichkeiten geht da eine Menge. Alternativ kann man auch einfach eine von ScriptableObject erbende Basisklasse erstellen und dann von Kartentyp zu Kartentyp unterschiedliche davon erbende Klassen verwenden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...