Jump to content
Unity Insider Forum

Kokujou

Members
  • Content Count

    266
  • Joined

  • Last visited

  • Days Won

    1

Kokujou last won the day on September 27 2018

Kokujou had the most liked content!

Community Reputation

2 Neutral

About Kokujou

  • Rank
    Advanced Member
  • Birthday 11/13/1993

Contact Methods

  • Website URL
    http://obscuritas.pw

Profile Information

  • Gender
    Male
  • Location
    Dessau-Roßlau
  • Interests
    Spieleentwicklung, Animes

Recent Profile Visitors

1,186 profile views
  1. Ja welche denn? XD das Spiel hat 48 Karten, davon 8 auf der Hand des Spielers, 8 auf dem Feld. Was man tun muss ist also die Karten irgendwie in die verschiedenen sammlungen zu schieben. Klar könnte man in jeder Sammlung so wie ich es zuerst gemacht hab alle 48 karten ausgegraut anzeigen und bei klicken aktivieren. aber ehrlich gesagt ist das unhandlich und unpraktikabel. also arbeite ich jetzt mit Drag- und Drop. Aber das ganze ist interaktiv. Ich baue diese Szene um meine KI mit einem echtne Spiel zu verbinden, sodass man manuell gegen eine fremde Implementation des Spiels antreten kann. Das meine ich mit Consulting. es ist also völlig unklar welche Karte vom Deck gezogen wird. Das weiß nur der Spieler. Er muss also aus den verbleibenden Karten eine auswählen die vom Deck gezogen wird um dann zu sehen ob die KI daraufhin eine entscheidung treffen muss.
  2. naja faktisch ist es eine Message-Box die ich gebaut habe und die sollte halt auch aufgerufen werden können wenn kein anderer canvas da ist. und natürlich auch selbstbestimmte eigenschaften eines canvases haben, besonders im scaler. es direkt zum parent zu machen... ja das wäre vermutlich ein workaround der möglich wäre... um details zu liefern: Ich baue mir ein Kartenspielfeld um meine KI zu konsultieren. Zuerst baue ich mir also das SPielfeld zusammen. Die Hand des aktiven Spielers, das Spielfeld, die gesammelten Karten beider Spieler, also alles was öffentlich bekannt ist. Dann rufe ich meine KI an, die vorschlägt welche ich karte ziehe. im nächsten Schritt wird eine Karte vom Deck gezogen, die aber zu diesem Zeitpunkt natürlich nicht bekannt ist. Meist ist dafür nichtmal eine Aktion erforderlich. Aber manchmal eben doch. und dann muss die KI sagen,, welche Akion gewählt werden soll. Also muss ich genau dann die Karte die gezogen wurde im Dialogfeld einfügen. generell ist mein Layout für das Zusammenbauen des Spielfelds schon recht überladen, sodass ich da kaum noch ein Feld unterbringen kann ohne dass es schlecht aussieht.
  3. Nein beim Ziehen das ist schon richtig. also während des ziehens ist es unter Canvas B. Aber Canvas B MUSS über Canvas A sein, es ist ja eine Dialogbox. Das Problem ist also dass ich das Objekt noch WÄHREND des Ziehens in eine höhere Sortier-Reihnfolge schieben muss ohne den aktiven Canvas zu verändern. Ich hab ja schon versucht dem Objekt slebst einen Canvas zuzuordnen aber das ging richtig übel schief weil dann die 50 Graphic Raycaster die es zwangsweise geben musste versagt haben. Und während des Ziehens nen neuen Canvas hinzuzufügen das brauch ich vermutlich gar nicht erst zu versuchen. SiblingIndex ist die Hierarchie, da es Canvas-ÜÜberreifend ist bringt das leider nix abgesehen davon benutze ich viele Layouts, die Hierarchien haben also alle einen Sinn.
  4. sollten sie zumindest, aber nicht explizit. Der Sinn ist es ja irgendwie zu sagen es soll absolut alles in den Müll geschmissen werden außer das was explizit als nicht zu löschen gekennzeichnet wurde und das sind nur virtuelle daten, ekine GO. was ich will ist im prinzip das spiel solange aus und wieder anschalten bis es klappt nur halt muss ich auch in der richtigen szene mit richtigen umgebungsvariablen einsteigen können. Ich hatte gehofft es gibt die einfache variante über Unitys Szenen aber da hab ich mich wohl geshcnitten...
  5. Hallo... Mal wieder stellt Unity mich vor ein nicht zu lösendes Problem. Ich hab in der Scene zwei Canvases. Das muss sein weil ich zwei verschiedene Scaler anwende und die Canvas Scaler ja leider nur den root Canvas Scalen... oder so... Ich benutze Drag und Drop. Mein 2. Canvas ist ein Dialogfenster. Dort öchte ich mein Item von Canvas A in Canvas B ziehen. Funktioniert grundsätzlich auch. Das blöde ist nur... ich kriege es einfach nicht hin dass es ÜBER Canvas B angezeigt wird beim Ziehen. Ich hab schon allerlei Spielereien ausprobiert und am Ende sogar jedem Ziehbaren Objekt einen eigenen canvas und einen GraphicRaycaster hinzugefügt. Was darin reduzierte dass aus irgendeinem völlig unlogischen Grund alles beim Ziehen plötzlich um 1 Element versetzt war. Ich hab es mit Z-Position versucht, versucht irgendwie nur einen Root-Canvas zu benutzen damit ich über die Hierarchie gehen kann, nichts geht. Ich würde nur ungerne das Workaround mit der 2. Kamera benutzen müssen. hoffe hier weiß jemand Rat.
  6. naja man sollte erkennen dass ein spielfeld nicht so aussehen sollte normalerweise werden 3 Gebiete ausgeteilt, Feld, Hand1, Hand2 stattdessen wird die Hand-Auffächern-Animation jetzt auf dem Deck getriggert und dann fliegen noch überall anders irgendwelche kartenrum nachdem das hauptspielfeld längst aufgebaut wurde... Ja, ich habe eine komponente die nicht gelöscht werden darf. Aber darum rufe ich ja auch Stopallcoroutines auf und das sogar auf der Instanz dieses Objekts. also... ?????
  7. Hallihallo. Ich stehe mal wieder vor einem völlig unverständlichen Unity-Problem. Mein Code (warum gibts eigentlich kein C#? 😞 StopAllCoroutines(); Global.instance.StopAllCoroutines(); Global.MovingCards = 0; SceneManager.LoadScene(SceneManager.GetActiveScene().name); throw new Exception(); Sieht richtig aus oder? Nein. Sieht sogar viel zu umfangreich aus, da ich gelesen habe, dass Unity Coroutinen automatisch beenden sollte beim laden einer Szene. Nun erkläre man mir bitte diesen abaritgen Effekt: Zum Kontext: Ich lade eine Szene indem ich mir ein Deck generiere, von diesem Deck die Hände und das Spielfeld austeile und das alles passiert in Coroutinen. Und nur falls eventuell die Instanzen dabei eine rolle spielen hab ich auch einen globalen Singleton die Funktion aufrufen lassen. die MovingCards ist eine Zahl die mehr oder weniger die Anzahl der aktuellen Animationen angibt. Und nur um sicher zu gehen dass nicht eventuell doch noch irgendwo irgendwas ausgeführt wird nachdem die Szene geladen wird schmeiße ich danach eine Exception raus. Natürlich habe ich es zu allererst mit dem Einzeiler probiert, der Rest code soll nur zeigen was ich schon alles versucht habe. Ich hab auch mal explizit den Single Parameter in der Lade-Funktion angegeben - ohne Erfolg. Ich weiß nichtmal wo ich anfangen soll zu raten wo dieser Fehler überhaupt herkommt also hoffe ich von euch die Erleuchtung zu erhalten. Edit: Ich sollte eventuell erwähnen dass ich diese Funktion mehrfach als Test aufrufe. Die Szene wird etwa 10mal hintereinander neugeladen. Das läuft so ab: Szene lädt -> Deck generiert -> Karten ausgeteilt -> Szene neuladen -> ... Ein zufälliges event hält diese Schleife aktuell aus. Vielleicht macht das ja irgendwas kaputt... keine ahnung...
  8. Hallo erstmal. Ich bin mal wieder mit meinem Latein am Ende. Ich nutze NetworkServer und NetworkClient. Der, der das Spiel erstellt ist ein Host, der Mitspieler nur ein Client. Bei jedem Zug sendet jeder Client eine Nachricht an den Server, dieser wiederum broadcastet sie dann. Es ist zwar nur ein Zweier-Spiel, aber joa... Mein Problem sind plötzliche Verbindungsabbrüche wenn sich eine Weile nichts tut. Offenbar hat Unity die Wahnidee, nach einem Timeout die Verbindung zu trennen, wenn nichts gesendet wird. Und ich muss ihn jetzt irgendwie davon abhalten. IIch habs schon mit KeepAlive Nachrichten versucht, also einfach Nachrichten mit lediglich nem Bool-Wert jede sekunde rumgeschickt, ohne dass darauf ne reaktion erfolgt. Registriert auf ID 130, falls das wichtig ist. Ohne Erfolg. Gerade hab ich versucht die DisconnectTimeout Eigenschaft zu erhöhen, aber wenn ich das versuche einzubauen krieg ich gleich garkeine Verbindung mehr. Vielleicht weicht der DefaultConfiguration von der des Matchmakings ab oder was weiß ich. Eine andere Option wäre es bei jedem Disconnect wieder zu verbinden aber... Ich hab nicht die geringste Ahnung wie ich das überhaupt angehen soll. Am liebsten würd ich direkt auf ne Netzwerkarchitektur ausweichen, die sowas nicht macht, denn Unity macht was das angeht nur Probleme und ich arbeite sowieso ziemlich Low-Level mit Nachrichten. Aber es wäre schon schön wenn man dabei TCP hätte, also dass die Nachricht solange gesendet wird bis sie auch mit sicherheit ankommt. Das ganze händisch zu machen ist mir dann irgendwie zu verwirrend.
  9. Zu meinem Projekt: Ich benutze den matchmaker eigentlich nur zum Aufbau der Verbindung danach kommuniziere ich nur noch über Nachrichten, also recht lowlevel. Jetzt habe ich aber sowohl beim Aufbau der Verbindung als auch beim Senden der Nachrichten das Gefühl, dass das nicht immer so hinhaut, wie ich mir das denke. Besonders auf meinem Smartphone. Dort baut er keine Verbindung auf, obwohl der Server brav horcht oder Nachrichten kommen nicht an. Das blöde ist noch dazu dass ich keine Fehlermeldungen vom Handy kriege. Ich weiß das ging mal, dass man im Editor auch übers Netzwerk Logs empfangen konnte aber ich weiß echt nicht mehr wie. Ich gehe davon aus dass die Verbindung über WLAN nicht so gut ist und deswegen irgendwann Nachrichten nicht ankommen, viel zu häufig eigentlich. Lange Rede kurzer Sinn: Wie kann ich das verhindern? Muss ich jetzt solange dieselbe Nachricht senden, bis ich TCP-Mäßig ein Ping zurückkriege a la "Nachricht erhalten"? Die konkreten Funktionen mit denen ich Arbeite sind NetworkServer.SendToAll und NetworkClient.Send
  10. Hallo~ Folgendes: ich möchte eine Skript-Animation basteln. Und ich hab damit schon angefangen und vielleicht könnt ihr mir ja helfen eine bessere möglihckeit zu finden. Ich arbeite mit Sprites und der Unity UI, genauer gesagt mit Images, denn da kann ich am besten kontrollieren wo und was, bei den Weltkoordinaten ist mir das zu viel Mathe. Ich zerlege meine 128 x 128 großen Texturen im Sprite Konstruktur in Blöcke der gleichen größe und für jeden dieser Blöcke erstelle ich ein GameObject mit Imae-Koponente, erstelle ein Sprite dafür über die Create-Funktion und platziere es so, dass es das gesamtbild ergibt, um dann Transformationen darauf anzuwenden. Nun werdet ihr mir sicher Zustimmen, wenn ich sage, dass das verdammt ineffizient ist, wenn man sehr kleine Blöcke wählt oder noch görßere Textturen hat und damit noch mehr Blöcke. Für die Animation von der ich Rede will ich, dass das Bild sich quasi zu dem neuen Bild "transformiert". Mein Ansatz ist, dass ich aktuell die Farbe jedes einzelnen Blocks Lerpe (Color.Lerp), allerdings meine ich mit Farbe nur die Eigenschaft des Images, also damit es ein bischen mehr so aussucht. Der Rest läuft über die Transparenz, im Endeffekt ist es nur ein zeitlich verschobenes überblenden. Um den Durchschnittswert der Farbe zu kriegen Summiere ich die Quadrate aller einzelnen Farbwerte (R,G,B einzeln), teile sie durch die Gesamtzahl und ziehe dann die Wurzel, die Formel hab ich gefunden, angeblich soll der normale Durchschnitt falsch sein. So viel zu dem was ich bereits ausprobiert habe. Viele, viele, viele Laggs je größer ich die Sache angehe. Also vielleicht teilt ihr mir mal mit was euch zu dem Thema eifnällt. Vielleicht ist das Ergebnis ja selbst wenn es nicht laggen würde gar nicht das was ich mir erhofft habe. Ich versuche mich gerade an Übergangsanimationen für einen Ladebildschirm und bin quasi in der Brainstorming Phase, wo ich rumprobiere wie was aussieht.
  11. Ja und so ähnlich hab ich es jetzt! :3 Es macht Spaß Neues zu lernen. Ich werd mal den ersten Beitrag bearbeiten, damit das GitHub dass ich habe ganz oben steht und man sich das nicht irgendwo raussuchen muss. Obwohl die GitHub Links ja unkompliziert sind. Nix mit asdh78920912jeduin/xy/z/ä/ XD Aber vielleicht kann ja dann man jemand über meine Neusten Arbeiten gucken und mir sagen ob ich auf dem richtigen Weg bin oder ob ich hier jetzt kompletten Mist mache XD ___ Achja und ich habe eine kleine Frage. Ich habe ein ziemlich blödes Konstrukt. List<object> ich habe die KI-Klasse die von der Player-Klasse erbt und gebe als Spieler-Liste entweder die KI ein oder den Player. Würde ich jetzt List<Player> nutzen wären die zusätzlichen Informationen der KI Klasse dann verloren oder wäre es nach wie vor dasselbe Objekt und wenn ich dann (KI)players[0] Schreibe würde ich Zugriff darauf haben? ___ Okay und noch ein ziemlich fettes Problem dass mir gerade aufgefallen ist. Ich ordne die Karten ja mathematisch an. Das Problem bei der ganzen Sache ist die reale Größe des GameObject. Aktuell geh ich über GetComponent<MeshRenderer>().bounds.size Aber... wie zur Hölle skaliert das?! Auf dem Spielfeld haben alle Karten eine 1/1.5-fache localScale. Also ich teile durch 1.5f. Dadurch werden wohl die bounds neu berechnet. Jetzt kommt das Problem. Aus irgendeinem mir völlig unerklärbaren Grund variieren diese Werte sehr intensiv. Wenn ich jetzt eine Karte in der Hand bewegen will würde ich ja eigentlich als Referenzwert die bounds.size/1.5 nehmen. Aber die haut nicht hin, ist viel größer als die der Karten auf dem Feld. Ich würde ja einfach die erste Karte auf dem Feld ansprechen, aber wenn das Feld leer ist, geht das nicht. Und dieser Fall kann theoretisch eintreten, wenn auch sehr selten. Ich versteh nicht wie das überhaupt sein kann... Selbst wenn ich vor den Code localscale /= 1.5f schreibe sind die Bounds des Renderers völlig verschieden. _____ okay das letzte Problem hab ich irgendwie gelöst bekommen folgendermaßen: Offenbar ist die größe der bounds des MeshFilters einer Plane, die ich als Kartendarstellung Nutze, gleich 5. Die größe meiner Orthografischen Kamera ist 41. 41 * 2 = 82 so kriegst du die Bildschirmhöhe. 82/5 ergibt dann die Große der Karte, die ich dann nur noch mit der AspektRatio der Kamera multiplizieren muss. Ehrlich gesagt steig ich bei dem ganzen Zeug un der mathematischen Sinnhaftigkeit dieser Formel nicht dahinter aber es funktioniert XD
  12. Ja aber das würde nicht mehr so gut passen wenn es in der Card-Klasse wäre. Eine Spielkarte weiß ja nichts von ihren anderen Hovern. Also hab ich das Raycasting jetzt halt in der Player-Klasse ne Kommunikation mit der Spielfeld-Klasse zum Triggern von Ereignissen bezüglich der Kartenauswahl und ehrlich gesagt sieht alles jetzt viel schöner aus. 4 Skripte fliegen raus sobald alles wieder funktioniert und ich hoffe dass ich dann nicht mehr ganz so viel Kritik für meinen Codestil kriege. Ich hab sogar etwas an der Deutsch/Englisch Macke gearbeitet ^^ aber nur wenn ich mal drüber stolpere. Als ich das in der Card Klasse geändert hab hätt ich mir echt in die Fresse schlagen können weil folglich ja die ganzen verdammten ScriptableObjects die ich angelegt habe alle kaputt gegangen waren XD ich bin froh dass ich die änderung rückgängig machen konnte auch wenn Unity nicht geschnallt hat dass ichs gemacht hab und ich erstmal Copy -> In Ordner Temp neu importieren -> alte löschen -> wieder in den alten Ordner verschieben. Es war ja dieselbe datei. Nur die Meta löschen hat nicht geklappt, reimportieren oder aktualisieren hat nicht geklappt, man musste es auf die harte Tour machen. Das Blöde ist ja dass du nicht denselben Namen mehrfach verwenden darfst. logischerweise. Ich meine ich hab ne Klasse Spielfeld, ne Instanz vom Spielfeld, sogar Funktionsparameter also brauch ich drei verschiedene Namen XD Board board = _board; oder wie? XD "Playboard" klingt irgendwie falsch... "GameEnvironment" genauso... mir gehen echt die Worte aus ^^
  13. hey so ähnlich hab ichs tatsächlich gemacht Ich musste etwas Fummeln, weil so viel Hintergrundwissen aus anderen Klassen benötigt wird... Aber am Ende liefs auf Kommandos hinaus. In der Player-Klasse wird jetzt der Input gehandhabt. Da switche ich dann zwischen zwei Funktionen für die Update-Routine die ich durch Kommando einstellen kann. In der Player-Klasse die direkten Zugriff auf die Hände hat wird das Hovern der Karte geregelt und dann in der Funktion der Spielfeld-Klasse mitgeteilt, welche Karte gehovert wurde damit sie die passenden Feldkarten highlighted. Und wenn man dann auf dem Feld auch noch aufrufen muss ruft die Spielfeld-Klasse RequestInput() auf und die Player-Klasse schaltet quasi auf die zweite Update-Routine. Zu finden in meinem neusten GitHub Skript^^ Das alleinige Hovern liegt jetzt tatsächlich auf der Karten-Komponente die vorher völlig leer war aber die Koordinierung des Hovers (es muss ja auch das vorherige "geunhovert" werden XD) übernimmt wieder das Spielfeld etc... kannst ja mal bei allem drübergucken was ich heute committet habe... hab nen neuen Branch eingerichtet weil die Änderungen von den Grundfunktionen das ganze Spiel zurückwerfen XD
  14. Naja meine letzten Verbesserungen sind nur im Punkto Codequalität XD Der schritt war weniger aufs Raycasting gemünzt aber es wäre halt cool wenn eine Karte die auf sie bezogenen Aktionen durchführen könnte. Hovering, Klick-Aktionen und Skripte, Triggern anderer Events etc... Schön wäre es ja wenn ich einfach n OnClick-Event einbauen könnte... Aber ich schätze mal ein Button-Skript kann ich nicht drauf legen oder? XD Mir ging es halt größtenteils darum das alles aus der Hauptklasse rauszukriegen, denn wenn ich alles nur mehr oder weniger in eine Klasse schreibe dann ist das wohl irgendwie schlechter Stil und neher an imperativer Programmierung als an OOP, besonders wenn ich jetzt vorhabe zwei größere Klassen zusammenzufügen, weil ich gemerkt habe dass Klasse B zu 50% aus Verweisen an Klasse A besteht XD Erst dachte ich daran ne Klasse für das ganze Input-Handling zu bauen aber auch das klingt nicht so prickelnd vor allem weil man halt wieder viele Verweise braucht. aber wenn das scheiße ist dann überleg ich mir was besseres... mal gucken wie es wird.
  15. Ist es eigentlich performant wenn ich mehrere Karten-GameObjekte habe und die alle Raycasting in der update-Routine der Komponente ausführen lasse? Oder wäre da eine übergeordnete die über einem Layer arbeitet besser?
×
×
  • Create New...