Clausewitz Geschrieben 21. August 2016 Melden Share Geschrieben 21. August 2016 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 More sharing options...
Djeurissen Geschrieben 21. August 2016 Melden Share Geschrieben 21. August 2016 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 More sharing options...
Sascha Geschrieben 22. August 2016 Melden Share Geschrieben 22. August 2016 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 More sharing options...
Clausewitz Geschrieben 22. August 2016 Autor Melden Share Geschrieben 22. August 2016 Habe eure Ratschläge umgesetzt und es läuft super. War mir schon fast unsicher, ob ich nicht doch das Prefab irgendwie ändere ^^. Ein dickes Danke an Euch! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 22. August 2016 Melden Share Geschrieben 22. August 2016 War mir schon fast unsicher, ob ich nicht doch das Prefab irgendwie ändere ^^. Aber der wichtige Punkt ist der, dass du in deinem Code das Prefab änderst[...] Tust du doch O_o Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Clausewitz Geschrieben 22. August 2016 Autor Melden Share Geschrieben 22. August 2016 Ja, ich hatte mir das schon fast gedacht, war mir aber unsicher, weshalb. Der Satz war jetzt mehr eine Bestätigung, dessen, worauf Ihr mich, dankender weise, hingewiesen habt. 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.