RealNiclas Geschrieben 26. Mai 2018 Melden Share Geschrieben 26. Mai 2018 Guten Abend, mein Ziel ist es gerade eine Map per Script zu erstellen (z.B. mit einer Größe von 10x10). Jedes Feld soll Eigenschaften besitzen. (z.B. posX = 1, posY = 1, menge = 100, etc.) Am generieren hängt es nicht, jedoch habe ich das Problem, dass ich nicht weiß wie ich ein bereits generiertes Objekt wieder ansprechen und somit auf die Eigenschaften zugreifen kann. Also wenn ich zum Beispiel ein Script auf allen Objekten habe und auf ein Objekt per "OnMouseDown()" zugreife, das dann die Position im Array ausgegeben werden kann. Hätte da vielleicht irgendjemand einen Hinweis für mich? Vielen Dank. LG: Niclas. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 26. Mai 2018 Melden Share Geschrieben 26. Mai 2018 // Instantiates 10 copies of prefab each 2 units apart from each other using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { private GameObject[] entities; public GameObject prefab; void Start() { entities = new GameObject[10]; for (int i = 0; i < 10; i++) { entities[i]= Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity) as GameObject; } } } Obiges Array "entities" speichert die 10 erzeugten GameObjekts. Für ein Zugriff auf eine Klasse die am jeweiligen GameObjekt hängt kannst du noch folgendes zusätzlich machen: entities[i] = Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity) as GameObject; // auf die Klasse "Missile" zugreifen die am GameObjekt hängt (also zuvor am Prefab) Missile missile = entities[i].GetComponent<Missile>(); missile.speed = 5.0f; // Eigenschaft speed der Klasse Missile setzen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
RealNiclas Geschrieben 26. Mai 2018 Autor Melden Share Geschrieben 26. Mai 2018 vor 11 Minuten schrieb Zer0Cool: // Instantiates 10 copies of prefab each 2 units apart from each other using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { private GameObject[] entities; public Transform prefab; void Start() { entities = new GameObject[10]; for (int i = 0; i < 10; i++) { entities[i]= Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity) as GameObject; } } } Obiges Array "entities" speichert die 10 erzeugten GameObjekts. Für ein Zugriff auf eine Klasse die am jeweiligen GameObjekt hängt kannst du noch folgendes zusätzlich machen: entities[i] = Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity) as GameObject; // auf die Klasse "Missile" zugreifen die am GameObjekt hängt (also zuvor am Prefab) Missile missile = entities[i].GetComponent<Missile>(); missile.speed = 5.0f; // Eigenschaft speed der Klasse Missile setzen Ahh ok, jetzt habe ich es verstanden. Vielen Dank! LG: Niclas Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 26. Mai 2018 Melden Share Geschrieben 26. Mai 2018 Ich sehe gerade da war noch ein Fehler in der Unity-Doku (woraus ich Teile des Codes kopiert hatte), hier sollte man nicht Transform als Datentyp fürs Prefab nehmen, sondern GameObject (das führt später sonst zu allerlei Problemen): //public Transform prefab; public GameObject prefab; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
RealNiclas Geschrieben 27. Mai 2018 Autor Melden Share Geschrieben 27. Mai 2018 Ok, irgendwas mache ich noch falsch. //========| Script1 |=========== using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spawner : MonoBehaviour { void Start () { TileClass tileClass = new TileClass(); tileClass.init(); } } //========| Script2 |=========== using System.Collections; using System.Collections.Generic; using UnityEngine; public class TileClass : MonoBehaviour { private GameObject tileObject; public int value; public void init() { tileObject = Resources.Load("Tile") as GameObject; tileObject.transform.position = new Vector3(0, 0, 0); value = 10; tileObject.AddComponent<TileScript>(); Instantiate(tileObject, tileObject.transform.position, tileObject.transform.rotation); } } //========| Script3 |=========== using System.Collections; using System.Collections.Generic; using UnityEngine; public class TileScript : MonoBehaviour { TileClass tileClass; private void OnMouseDown() { tileClass = GetComponent<TileClass>(); Debug.Log(tileClass.value); } } Wenn ich nun auf das Objekt klicke wird mir 0 ausgegeben, anstatt der gewünschten 10. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Mai 2018 Melden Share Geschrieben 27. Mai 2018 Sieht ein wenig "konfus" aus. Dies hier ist völlig verkehrt: public class Spawner : MonoBehaviour { void Start () { TileClass tileClass = new TileClass(); tileClass.init(); } } Eine MonoBehaviour-Klasse wird nie mit "new" erzeugt! Was genau lädst du mit?: tileObject = Resources.Load("Tile") as GameObject; Resources.Load sollte man wenn es geht vermeiden, da dies eigentlich nur für bestimmte Spezialfälle gut ist und ich glaub du ganz etwas anderes machen willst:Du solltest folgendermaßen vorgehen: erstelle ein GameObject in deiner Szene und hänge die Klassen dran die du brauchst (z.b. die TileClass-Klasse) mache ein Prefab aus diesem GameObject in der Szene: das Szenenobjekt mit der Maus in deinen Projektfolder ziehen ( = Prefab) Szeneobjekt aus der Szene löschen dieses Prefab übergibst du deinem Spawnerskript (siehe unten) Der Code könnte dann folgendermaßen aussehen: using UnityEngine; public class Spawner : MonoBehaviour { private GameObject[] entities; public GameObject prefab; // Hier dein erzeugtes Prefab draufziehen mit deiner TileClass Klasse void Start() { // Ich erzeuge hier mal nur 1 Objekt GameObject tileGO = Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity) as GameObject; TileClass tile = tileGO.GetComponent<TileClass>(); tile.value = 10; } } using UnityEngine; public class TileClass : MonoBehaviour { public int value; private void OnMouseDown() { this.value; } } 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.