Jump to content
Unity Insider Forum

Informationen von einem Gameobjekt zum anderen senden.


Helishcoffe

Recommended Posts

Hallo,

ich bin schon nun die ganze Zeit am tüfteln, wie ich dieses doch eigentlich simple problem lösen soll.

Und zwar:

In meinem Spiel ist das Setzen von Blöcken (wie in Minecraft) der Hauptteil.

Ich habe bis jetzt 3 Blöcke. Einen Block der "Strom" erzeugen soll, einen Block der diesen an andere Blöcke weiterleitet (wie kein Kabel) und einen der diesen Auswertet (Sprich: ist strom auf diesen Block, ändert er seine Textur, ansonsten nicht).

 

Jeder Block der in die Welt platziert wird, wird in ein 3 demensionalen Array abgespeichert (Die Dimensionen stehen jeweils für die Einzelnen Koordinaten x, y und z).

So kann ich einfach einen Block an einer Bestimmten Position abfragen.

 

Das ganze soll ähnlich wie in Minecraft funktionieren (Redstone). Mein Problem ist einfach die Weiterleitung von Block zu block. Wenn ich es so mache, dass die Blöcke ihre Information an alle Benachtbarten blöcke Weiterleiten (Sprich, ist ein Block neben einem Block, der unter Strom ist, so soll dieser auch unter Strom gesetzt werden, und die Benachtbarten blöcke ebenfalls und so weiter)

So habe ich das Problem, dass jedesmal wenn ich ein Kabelblock an ein gepowerten Block setze es immer zu kleinen laggs kommt, was natürlich im Spiel überhaupt nicht entstehen soll (Die entstehen ebenfalls wenn ich den Block wieder entferne).

 

Ich habe hier nochmal ein Kleines Video gemacht, damit man mein Problem besser versteht.

 

http://www.youtube.com/watch?v=0H2a_3DbCXM&feature=youtu.be

 

Das Problem ist wie gesagt, dass ich nach einer guten möglichkeit suche, den Strom perfekt durch die Blöcke zu leiten, egal wie lang das Kabel ist, oder wie groß die Schaltung ist, die man baut.

Minecraft schafft dies ja auch :)

 

 

Ich bedanke mich schonmal für alle hilfreichen Antworten

Mfg Timtrucker

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das erste was mir hier einfällt ist: unüberlegtes Fluten. Das ist ja auch bei Rechnernetzen so, wenn sie ihre Einträge bekannt machen. Dein Problem hatte ich mal damals bei einem anderen Projekt.

 

Meine geile Vermutung: hier ein Bild

post-2515-0-39095200-1378144291_thumb.png

Wie du in dem Bild erkennen kannst, werden viele Nachrichten unnötigerweise übermittelt. Im Internet gibt es Methoden, die das verhindern oder stark reduzieren. Such am besten nach effizientem Routing.

 

Oder denk dir einfach was anderes aus ... z.B. eine Variable, die angibt, ob der Nachbar bereits aktualisiert worden ist. Wenn ja, dann skip ... sonst lock und aktualisiere. Nach dem Release alle wartenden natürlich kicken, damit die nicht auf eine weitere Änderung bestehen.

 

EDIT:

Im Bild sind zwei Fehler drin ... in dem Satz ganz rechts muss statt 4 eine 7 rein. Und natürlich folgt auf Schritt 3 der Schritt 4 und nicht 5 ... hm ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke, dass Unity hängt, weil du keine Coroutinen benutzt. Ich hatte das Problem auch bei normalen Methoden, die Schleifen enthielten. Unity läuft nur auf einen "Thread", also brauchst du Coroutinen für Berechnungen, ansonsten stoppst du die gesamte Engine.

 

Oder direkt Multithreading.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Denke auch das du mit Coroutinen ans Ziel kommst, führt eigentlich kein Weg dran vorbei die Arrays abzulaufen.

 

Nur so als Gedankenanregung :)

KA ob du dran gedacht hast aber so wie es sich anhört wird bei deiner Logik jeder Stein der einmal unter Strom gesettzt wird gleichzeitig zur Quelle, solltest du das nicht wollen, denk dran das du dem "Client"Stromwürfel einen anderen Status zuweißt, ansonsten wirst du Strombahnen nie mehr unterbrechen können.

 

 

snapback.pngMarrrk sagte am 02. September 2013 - 21:58 Uhr:

 

Oder direkt Multithreading.

 

Das Fass würde ich an seiner Stelle lieber zu lassen. ;-)

 

Dachte bisher das Coroutinen nichts großartig anderes ist als Multithreading. ?? Hab ich da was falsch verstanden ??

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber Coroutinen können doch parallel neben einander laufen oder (Halt Frame abhängig)?

Der yield wird doch nur zum anhalten oder verzögern verwendet oder ?

 

void Update()

{

StartCoroutine(Eins());

StartCoroutine(Zwei());

StartCoroutine(Drei());

}

 

Hoffe ich hab die Coroutinen nicht falsch verstanden, ansonsten muss ich in meinen Code einiges anpassen ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bezog mich auf die Ausführung einer einzelnen Coroutine für sich selbst, wenn du mehrere hast wird jede ein Stück abgearbeitet, ja.

 

Clicker01: Threading ist nicht sonderlich schwer wenn man sich an ein paar einfache Regeln hält, gibts ja auch Assets die es etwas leichter machen (abgesehen vom Synchronisieren) wie den UTH.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also mehrere Threads kann man zwar machen, finde ich aber an dieser Stelle ein wenig überflüssig. Caroutine funktioniert soweit ganz gut.

 

@Just4Info Das die Steine selbst zum Stromwürfel werden, habe ich mittlerweile auch schon gemerkt ^_^. Ist jetzt nur ein wenig kniffelig wie ich es hinbekomme, dass diese dann auch wieder unterbrechen werden können. Aber da wird mir schon was passendes einfallen :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde das so lösen, das ich jeder Würfelseite 2 Statis gebe. Einmal den Status Eingang wenn er Strom bekommt und Ausgang wenn er Strom abgibt.

Wenn er nun von mehreren Seiten Strom bekommt und auch abgeben kann sind beide Statuswerte aktiv.

Sollte eine Stromspeiung wegfallen, fällt auch der Eingang weg, und ein Würfel ohne Eingang hat kein Strom, es sei denn er ist vom Typ Stromquelle.

 

 

Edit : Hab nen kleines Bild hinzugefügt als Verdeutlichung

 

 

Eingänge können nur Strom annehmen (von Ausgängen) und Ausgänge nur abgeben (also von Eingängen bekommen) ... Ausnahme ist die Quelle die kann auch ohne Eingang ausgeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe heute in einer Pause an der Arbeit mal ein wenig selbst probiert, wie sowas gut gehen könnte. Binnatürlich noch nicht fertig geworden. ;)

Aber quasi so ähnlich wie Just4Info habe ich es auch gemacht.

Ich unterscheide ob es eine Stromquelle oder eine Leitung ist. Die Stromquelle hat immer Strom und wenn ich neben der Quelle bin, habe ich somit auch Strom. Ist eine Leitung neben mir die Strom führt, dann habe ich auch wieder Strom.

Ich teste das immer in alle 4 Richtungen.

Nun kommt es aber zu dem Fall, dass eine Leitung entfernt wurde aber die Kette komplett Strom hatte!

Jetzt müsste ja alles hinter der Quelle den Strom verlieren. Jede Leitung guckt aber in alle Richtungen ob der Nachbar Strom hat, deswegen würde das so nicht funktionieren.

Zur Lösung gebe ich jeder Leitung eine Variable mit einem Wert, der quasi die Richtung des Flusses angibt.

Die Quelle hat den Wert 0 alle seine Nachbarn den Wert 1 und deren nachbarn den Wert 2 usw.

Ist die Leitung an einem Punkt unterbrochen, so müssen die Nachbarleitungen schauen, ob der (noch) stromführende Teil vom Wert her kleiner ist als ihr eigener Wert. Wenn dem nicht so ist, wurde die Stromrichtung unterbrochen und die Leitung schaltet sich stromlos. Stromlose Leitungen haben immer einen hohen Wert, damit die Überprüfung funktioniert, wenn eine Leitung wieder dazu kommt oder der Strom mich von einer anderen Seite erreicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbie das Problem wäre nur wenn ich auf einmal 2 Stromquellen an einem Kabel habe. Sprich:

problem2gch6ko1r98.png

 

Ansonsten bis jetzt die beste Idee ;)

Danke

 

PS: Eine Idee wäre auch noch, dass die Kabelblöcke alle Instanzen der Stromquellen untereinander austauschen und prüfen ob minds. eine Stromquelle Eingeschaltet ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, wenn es nur um die Leitung geht, dann verstehe ich gerade das Problem nicht ganz ... ich dachte da an soetwas:

post-2515-0-20428500-1378230993_thumb.png

Ist schon das gemeint? Wenn ja oder nein, kann ich nur empfehlen dir das mal zu skizzieren, damit du genau weißt, was am Ende eigentlich gebraucht wird und dann siehst du auch gleich, wo du was einsparen kannst. Bei den Blöcken würde ich einfach einen Enum nehmen, der anzeigt, ob Erzeuger, Verbraucher oder Leitung ... und dann eine Methode, die in Abhängigkeit des Enum bestimmte Methoden ausführt. Oder eine Abstrakte Klasse mit Parametern wie PowerOut und PowerIn und dann abgeleitete Klassen (Leitung, Erzeuger und Verbraucher), wo dann die Methoden überschrieben werden oder halt mit virtual für die späte Bindung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Mr.Clown Also um Vebrauche und Erzeuger geht es in meinem Spiel nicht. Da in meinem Spiel Logische Schaltungen im Vordergrund stehen, werde ich keine Verbraucher und erzeuger mit bestimmert Spannung etc.. einbauen. Es geht lediglich um das simple Verbinden mit Kabeln verschiedener Bauteile. Es geht also nicht Direkt um das verbrauchen und Erzeugen von Strom.

 

Das problem ist einfach, dass das (für mich) gar nicht so einfach ist. Also wenn ein Kabel strom bekommt, das dieses dann "gepowert" ist und wenn die Leitung unterbrochen wird, sollen die restlichen kabel nicht mehr gepowert werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meine Idee sollte auch mit mehreren Stromquellen funktionieren. Die Leitungsteile müssten sich selbstständig nummerieren und alles sollte passen. Ich muss aber gestehen, dass ich davon aus gegangen bin, das nur eine Quelle da ist.

Ich werde morgen weiter daran rum basteln und mal schauen ob alles so richtig ist. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbie Vielen Dank :) und ja, es sind mehrere Stromquellen. Da das Spiel ein Sandkasten.Game wird, dürfen keine Fehler oder Bugs auftreten, egal wie die Kabel gesetzt werden, oder wie viele Stromquellen es gibt.

 

Ich werde noch ein wenig im Internet schauen, ob jemand das gleiche Problem hatte und es hinbekommen habe, denn momentan ist meine Konzentration am Ende^^

 

Danke an alle die geholfen haben :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Idee mit der Nummerierung ist schonmal nen cooler Ansatz, Probleme bei mehreren Stromquellen sehe ich nicht, jedoch sehe ich ein Problem sobald es zu Quaderformationen oder Kreisläufe kommt.

 

Wenn ich einen Kreislauf habe wie wird dann Nummeriert ? Zufall ? zu beiden Richtungen beginnend mit 1 ?? oder einer Richtung Nummeriert sich hoch und kommt mit einer hohen Zahl wieder bei der Quelle an ?

 

Die Nummerierung kann nur funktionieren sofern die Blöcke gleichmäßig hoch gezählt werden abgehend von der Stromquelle und das denke ich könnte eine zusätzliche Fehlerquelle werden.

 

Hattest du mein Bild zur Idee gesehen ?

Dadurch kann man die Logik besser verstehen denke ich.

Wenn du jeder Seite einen Ausgang und Eingang gibst ist die Zusammensetzung der Blöcke absolut egal du musst dich um keine Konstellationen mehr kümmern das machen die Objekte selbstständig.

 

Als Beispiel :

 

1) Quader 1 hat auf der linken Seite einen Eingang auf 1 .... folglich werden alle Ausgänge auf 1 gesetzt

2) Nun bekommt Quader 1 noch einen Eingang von Rechts dazu .. alle Ausgänge bleiben bei 1.

3) Nun setzt du oben am Quader 1 noch ein Quader (Quader 2) durch Quader 1 Ausgang oben bekommt Quader 2 Eingang unten Strom und setzt so auch alle Ausgänge auf 1.

4) Nun entfernst du Stromquelle rechts. Quader 1 verliert einen Eingang .. aber alle Ausgänge bleiben auf 1 weil Stromquelle links noch aktiv ist.

5) Wenn du jetzt Stromquelle links entfernst hat Quader 1 keine Eingänge mehr uns somit sind alle Ausgänge auf 0

6) Da Quader 1 nun keine Ausgänge mehr hat ist Quader 2 auch tot weil sein einziger Eingang (Von Quader1) ebenfalls weg ist.

 

Ist doch ganz simple oder ? Einfaches Konstrukt und keine Arbeit mit komischen Konstellationen.

 

Hoffe ich konnte weiterhelfen.

 

Gruss just4Info

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...