MustafGames Geschrieben 8. Februar 2017 Melden Share Geschrieben 8. Februar 2017 Hallo, mir ist gerade etwas aufgefallen was eigentlich nicht sein sollte, wenn ich folgende Methode nutze dann werden alle Objecte der Klasse in meinen Script gleichgesetzt damit meine ich sie haben alle die gleichen Werte. public static BlockList GetBlockList(RaycastHit hit, BlockList blocklist, bool adjacent = false) { Chunk chunk = hit.collider.GetComponent<Chunk>(); if (chunk == null) return null; WorldPos pos = GetBlockPos(hit, adjacent); BlockList blocklistout = new BlockList(blocklist.blocks, blocklist.worldpos); for (int i = 0; i < blocklistout.blocks.Count; i++) { blocklistout.blocks[i] = chunk.world.GetBlock(pos.x + blocklistout.worldpos[i].x, pos.y + blocklistout.worldpos[i].y, pos.z + blocklistout.worldpos[i].z); } return blocklistout; } Und das wäre das Object: [serializable] public class BlockList { public List<Block> blocks = new List<Block>(); public List<WorldPos> worldpos = new List<WorldPos>(); public BlockList (List<Block> bl, List<WorldPos> pos) { blocks = bl; worldpos = pos; } } In diesen Script wird die Methode ausgeführt und da sind auch die zwei Objekte die beim ausführen immer gleiche Werte haben. public BlockList lastblocks; public BlockList current; bool first; void Update() { if (first) { EditTerrain.SetObject(oldpos, lastblocks); //EditTerrain.SetBlock(oldpos, lastblock); } if (set) { RaycastHit hit; if (Physics.Raycast(transform.position, transform.forward, out hit, 100)) { lastblocks = EditTerrain.GetBlockList(hit, current); } } if (Input.GetKeyDown(KeyCode.X)) { set = !set; } Ich vermute das etwa die Methode einen Fehler hat oder die Objekt-Klasse, ich hab schon paar Dinge ausprobiert aber ich finde den Fehler nicht. Vielleicht sieht einer von euch was ich nicht sehe. Mfg Mustaf Lösung: Anstatt das hier zu machen: List a = new List(); List b = a; Kannst du auch eine Liste erzeugen die alle Referenzen beinhaltet: List a = new List(); List b = new List(a); //b enthält alle Objekte von a, trotzallem sind es unterschiedliche Listen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Helishcoffe Geschrieben 8. Februar 2017 Melden Share Geschrieben 8. Februar 2017 Ist es gewollt, dass du in der Methode bei new BlockList ein Objekt vom Typ "WorldPos" übergibst obwohl dort nach List<WorldPos> gefragt wird? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 8. Februar 2017 Autor Melden Share Geschrieben 8. Februar 2017 Ist es gewollt, dass du in der Methode bei new BlockList ein Objekt vom Typ "WorldPos" übergibst obwohl dort nach List<WorldPos> gefragt wird? Die WorldPos hat was mit den Chunks relativ zur Welt usw. zu tun ist aber nebensächlich. und ich übergebe da doch eine Liste. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Helishcoffe Geschrieben 8. Februar 2017 Melden Share Geschrieben 8. Februar 2017 Die WorldPos hat was mit den Chunks relativ zur Welt usw. zu tun ist aber nebensächlich. und ich übergebe da doch eine Liste. Stimmt, hatte einen Knick in der Optik Sorry Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 8. Februar 2017 Autor Melden Share Geschrieben 8. Februar 2017 Trotzdem frage ich mich warum es alle beiden BlockLists gleich setzt? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 9. Februar 2017 Melden Share Geschrieben 9. Februar 2017 public BlockList (List<Block> bl, List<WorldPos> pos) { blocks = bl; worldpos = pos; } List<> ist eine Klasse. Klassen sind immer Referenztypen. Das bedeutet wenn du sowas hier machst: Klasse a = new Klasse(); Klasse b = a; Dann liegt im Speicher ein Objekt vom Typ Klasse. Die Variable a zeigt nun auf dieses Objekt und mit b = a machen wir nichts anderes als b zu sagen das er auch auf das gleiche Objekt zeigen sol => a und b zeigen auf das gleiche Objekt im Speicher. Wenn du nun a veränderst wird b auch verändert. Dasselbe nun bei Listen, wenn du einfach nur hingest und blocks = bl setzt, dann wird blocks auf die selbe Liste zeigen wie ihm übergeben wurde. Dementsprechend wenn du nun dieser Liste Objekte hinzufügst oder vorhandene Objekte überschreibst werden beide Blocklists verändert, weil beide die exakt gleiche Liste nutzen. Der einzige Unterschied ist das die Blocklists unterschiedliche Zeiger auf die Liste haben. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 18. Februar 2017 Autor Melden Share Geschrieben 18. Februar 2017 Interessant, ich kann leider erst jetzt antworten weil ich im Urlaub war. Was sollte man dann nutzen wenn man nicht will das es auf das selbe Objekt im Speicher zeigt? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 20. Februar 2017 Melden Share Geschrieben 20. Februar 2017 Anstatt das hier zu machen: List a = new List(); List b = a; Kannst du auch eine Liste erzeugen die alle Referenzen beinhaltet: List a = new List(); List b = new List(a); //b enthält alle Objekte von a, trotzallem sind es unterschiedliche Listen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 20. Februar 2017 Autor Melden Share Geschrieben 20. Februar 2017 Anstatt das hier zu machen: List a = new List(); List b = a; Kannst du auch eine Liste erzeugen die alle Referenzen beinhaltet: List a = new List(); List b = new List(a); //b enthält alle Objekte von a, trotzallem sind es unterschiedliche Listen Cool danke, dachte immer das es das gleiche wäre aber anscheinend machen es die Details. 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.