Jump to content
Unity Insider Forum

Objekte werden immer alle gleich gesetzt


MustafGames

Recommended Posts

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

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

  • 2 weeks later...

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

Archiviert

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

×
×
  • Neu erstellen...