Jump to content
Unity Insider Forum

Objekteigenschaften ansprechen per Script


RealNiclas

Recommended Posts

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

// 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

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. :D
Vielen Dank!
LG: Niclas

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

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

Archiviert

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

×
×
  • Neu erstellen...