Niemand112 Geschrieben 5. August 2021 Melden Share Geschrieben 5. August 2021 Liebe forumsmitglieder. Ich bin gerade dabei ein Spiel zu programmieren und habe mich da etwas mit den Gedanken anscheinend festgefahren. Ich programmiere jetzt seit mehreren Jahren nicht mehr und hab sozusagen nun mit C# und unity neu angefangen, also bitte etwas Nachsicht 😅 Mein problem: ich erzeuge mit einem klick auf einen Button eine "Blaupause" welche ich dann mit Klick auf eine stelle am terrain jeweils ein Gebäude dort erzeuge (Klon von einem prefab). Nun möchte ich, dass es mir links oben anzeigt, wieviele Gebäude ich so gebaut habe. Meine Idee: Jedesmal, wenn ich mit der Blaupause auf das terrain klicke und ein Gebäude erzeuge soll in meinem Manager-Skript eine Variable vom Typ Integer den Wert um 1 erhöhen. Dies wollte ich bezwecken, indem ich direkt auf die Variable zugreife mit einem Verweis auf das Skript "GameLogic" (also "GameLogic.gebäudeanzahl += 1;) Nur leider erzielt das nicht meinen angestrebten Erfolg und die variable ändert sich einfach nicht im Spiel. Die integer variable ist auf public gesetzt, also müsste ich ja zugreifen können auf diese?! Eine variable im GameLogic Skript erzeugen, welche den Wert vom Blaupause - Skript übernimmt und damit im GameLogic-skript arbeiten klappt ebenfalls nicht. Wäre über jede noch so kleine Hilfe sehr dankbar! Lg Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 5. August 2021 Melden Share Geschrieben 5. August 2021 Moin moin! vor 19 Minuten schrieb Niemand112: Manager-Skript Bäh! Ich bin allergisch gegen das Wort! Versuch's mal mit sowas auf deinem Gebäude-Prefab: public static int numberOfInstances = 0; private void Awake() { numberOfInstances++; } private void OnDestroy() { numberOfInstances--; } Jetzt kann deine Anzeige einfach "NameDesGebäudeScripts.numberOfInstances" auslesen und anzeigen. Braucht keinen extra Manager! Ist nur etwas unschön, da in jedem Frame reinzuschauen. Ein Event, das ausgelöst wird, wenn sich die Zahl ändert, wäre da hübscher. Wenn du das ausprobieren willst, sag Bescheid, sonst lasse ich es erstmal weg; der Einfachheit halber. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Niemand112 Geschrieben 5. August 2021 Autor Melden Share Geschrieben 5. August 2021 Danke erstmal für die Antwort! Ich hab jetzt keine Zeit dies auszuprobieren, aber werde es gleich probieren. Und auslesen müsste ich es eigentlich nur wenn ein neues Gebäude gebaut wird, also nicht durchgehend. Die Gebäude sollen pro 10 Sekunden o. ä. Geld produzieren sozusagen und je mehr Gebäude es sind, desto größer ist im Endeffekt der Faktor mit dem der Grundwerte multipliziert werden müsste. Aber ich werd das am Abend mal anschauen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 5. August 2021 Melden Share Geschrieben 5. August 2021 vor 1 Stunde schrieb Niemand112: Und auslesen müsste ich es eigentlich nur wenn ein neues Gebäude gebaut wird, also nicht durchgehend. Genau! Und dass ein neues Gebäude gebaut wurde, kannst du mit einem Event bekanntmachen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Niemand112 Geschrieben 5. August 2021 Autor Melden Share Geschrieben 5. August 2021 Da fällt mir ein, kann ich nicht eigentlich auch einfach ein Event erstellen, welches generell prüft ob ein Gebäude erstellt wurde und wenn ja, eine variable um 1 erhöhen? Müsste mich halt bzgl events noch reinlesen, aber wäre doch eine praktischere Lösung für mein Problem oder? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 5. August 2021 Melden Share Geschrieben 5. August 2021 Also, ein Event prüft generell erstmal gar nichts. Es wird an der Richtigen Stelle im Code (wo das Gebäude erstellt wird) ausgelöst. Und ja, das geht auch. Aber Events sind eine extra Schicht zwischen dem Auslöser und den Objekten, die darauf reagieren. Wenn du den Zähler auf die Reaktions-Seite des Events packst, reißt du ihn damit weg von der Seite, die die Gebäude erstellt. Das ist etwas unschön und kann auf Dauer den Code problematisch machen. Was du aber auch machen kannst ist, die aktualisierte Zahl der Gebäude als Parameter über das Event mitzuschicken. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Niemand112 Geschrieben 5. August 2021 Autor Melden Share Geschrieben 5. August 2021 vor 10 Minuten schrieb Sascha: Also, ein Event prüft generell erstmal gar nichts. Es wird an der Richtigen Stelle im Code (wo das Gebäude erstellt wird) ausgelöst. Und ja, das geht auch. Aber Events sind eine extra Schicht zwischen dem Auslöser und den Objekten, die darauf reagieren. Wenn du den Zähler auf die Reaktions-Seite des Events packst, reißt du ihn damit weg von der Seite, die die Gebäude erstellt. Das ist etwas unschön und kann auf Dauer den Code problematisch machen. Was du aber auch machen kannst ist, die aktualisierte Zahl der Gebäude als Parameter über das Event mitzuschicken. Das klingt auch gut mit dem mitschicken. Danke! Werds gleich testen ^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Peanut Geschrieben 5. August 2021 Melden Share Geschrieben 5. August 2021 Es gäb noch die Möglichkeit das in ein Scriptableobjekt zu schreiben. Wäre aber ziemlich unnötig weil du mit dem Vorschlag von @Sascha das beste Ergebnis bekommst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 5. August 2021 Melden Share Geschrieben 5. August 2021 Och, das injectable zu haben hat auch seine Vorteile. Spätestens, wenn es möglicherweise mehrere Arten von Gebäuden gibt, die einzeln gezählt werden Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Niemand112 Geschrieben 5. August 2021 Autor Melden Share Geschrieben 5. August 2021 Danke für die Hilfe, mit static hat es endlich geklappt, jetzt happerts mit Time.deltatime aus irgendeinem Grund, aber das schaff ich schon 😁 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.