Jump to content
Unity Insider Forum

Prefab wird bei Instantiierung geändert


Clausewitz

Recommended Posts

Hallo!

 

Ich habe ein Problem bei der Instantiierung eines Prefabs.

 

Die Instantiierung an sich ist kein Problem und funktioniert im Runtime wie gewünscht.

Jedoch ist wird das Prefab entsprechend der letzten Instantiierungswerte gespeichert, d.h. dass das Prefab mit Werten voll ist, die es aber nicht haben soll.

 

Sobald ich das Game wieder teste, haben die Prefab zwar ihre eigenen Werte, jedoch ist der Name des Prefabs entsprechend der letzten Instantiierung.

 

Bsp:

 

1. Test des Game

- Prefabs 1, 2, 3 und 4 werden erzeugt

- das Prefab hat nun als Namen 4 und wird beim Beenden des Tests nicht zurückgesetzt

 

2. Test des Game

- Prefabs 4-1, 4-2, 4-3, 4-4 werden erzeugt

 

Ich hoffe das war verständlich.

 

Hat jemand eine Ahnung, woran das liegen könnte?

Ich dachte eigentlich, dass Prefabs nicht im Runtime geändert werden können?

 

Hier das verwendete Skript:

 

using UnityEngine;
using System.Collections;
using Mono.Data.Sqlite;
using System.Data;
using System;

public class CityLoader : MonoBehaviour {

public GameObject prefabCity;

// Use this for initialization
void Start()
{
	// Zugriff auf die Datenbank
	string dataBasePath = "URI=file:" + Application.dataPath + "/Database.db";

	IDbConnection dataBaseConnection;
	dataBaseConnection = (IDbConnection)new SqliteConnection(dataBasePath);
	dataBaseConnection.Open();

	IDbCommand dataBaseCommand = dataBaseConnection.CreateCommand();
	string sqlQuery = "SELECT Name, CUID, Country, EarlyCountry, ChangeDate, CoordX, CoordZ " + "FROM Cities";
	dataBaseCommand.CommandText = sqlQuery;
	IDataReader dataBaseReader = dataBaseCommand.ExecuteReader();

	// Auslesen der Datenbank
	while (dataBaseReader.Read())
	{
		string cityName = dataBaseReader.GetString(0);
		int cuid = dataBaseReader.GetInt32(1);
		string country = dataBaseReader.GetString(2);
		string earlycountry = dataBaseReader.GetString(3);
		string changedate = dataBaseReader.GetString(4);

		int coordX = dataBaseReader.GetInt16(5);
		int coordZ = dataBaseReader.GetInt16(6);
		float newCoordX = (float)coordX;
		float newCoordZ = (float)coordZ;

		// Instanzierung der Städte mit jeweiligen Werten
		Instantiate(prefabCity, new Vector3(newCoordX, 0.01f, newCoordZ), Quaternion.identity);
		prefabCity.GetComponentInChildren<CityClass>().cityName = cityName;
		prefabCity.GetComponentInChildren<CityClass>().cityCUID = cuid;
		prefabCity.GetComponentInChildren<CityClass>().cityCountry = country;
		prefabCity.GetComponentInChildren<CityClass>().cityEarlyCountry = earlycountry;
		prefabCity.GetComponentInChildren<CityClass>().cityChangeDate = changedate;

		Debug.Log("Name: " + cityName +
				  " CUID: " + cuid +
				  " Country: " + country +
				  " Earlycountry: " + earlycountry +
				  " ChangeDate: " + changedate +
				  " CoordX: " + coordX +
				  " CoordZ: " + coordZ);
	}

	// Schließen der Datenbank
	dataBaseReader.Close();
	dataBaseReader = null;
	dataBaseCommand.Dispose();
	dataBaseCommand = null;
	dataBaseConnection.Close();
	dataBaseConnection = null;
}
}

 

 

EDIT: Sorry, glaube das gehört in den Bereich "Scripting" :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Instantiate bekommt ein Objektz übergeben und hat als Rückgabewert das neue Objekt.

Sprich ganz simpel gehalten

Gameobject Instantiate(Gameobject)

 

Dementsprechend musst du die Werte von dem neuen Objekt ändern und nicht von dem Objekt das kopiert wird. Desweiteren würde ich dir empfehlen CityClass zu cachen, anstatt 4 mal dannach suchen zu lassen.

Sprich

CityClass city = newPrefab.GetComponentInChildren<CityClass>();
city.cityName = "";
city.cityCUID = ....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Fun Fact: Man kann bei serialisierten Feldern Komponenten angeben:

public CityClass cityPrefab;

Dann kann man jedes GameObject reinziehen, das diese Komponente hat.

 

Wenn man da Instantiate drüber laufen lässt, kommt dann sogar direkt eine (ungetypte) Referenz auf die Komponente des instanziierten Objekts zurück:

var city = (CityClass)Instantiate(cityPrefab);
city.cityName = "...";
...

 

Aber der wichtige Punkt ist der, dass du in deinem Code das Prefab änderst, und nicht das instanziierte Objekt; also das, was zurück gegeben wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...