Jump to content
Unity Insider Forum

Ein Gameobject per Script erstellen und platzieren


Mino1337

Recommended Posts

Hallo,

ich bin ein Unity-Noob und möchte zuallererst einmal per Script ein Gameobject mit 2D Sprite in meiner Spielwelt erscheinen lassen. Folgendes habe ich bisher aus dem Netz erarbeitet:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Berechnungen : MonoBehaviour {


    Sprite BildEins = Resources.Load<Sprite>("Eins");
    public GameObject G;

	void Start () {

        G = new GameObject("G");
        G.AddComponent<Transform>();
        G.AddComponent<SpriteRenderer>();
        G.GetComponent<SpriteRenderer>().sprite = BildEins;
        G.transform.position = new Vector3(0,0,0);
        G.transform.localScale = new Vector3(1, 1, 1);


        Instantiate(G, transform.position, Quaternion.identity);
    }

    
    
	
	// Update is called once per frame
	void Update () {
		
	}
}

"G" Wurde in der Initialisierung zusammengebaut und erstellt. Theoretisch müsste ich also "G" mit dem Sprite "Eins" in der Mitte meines Spielbildschirms sehen. Da ist kein Bild was es verdecken könnte und das Script hab ich auf ein bereits im Spielfeld rumschwebendes unsichtbares Gameobjekt angewendet das einfach immer da ist (ein Standart Scriptcontainer eben). Der Ordner "Resources" existiert tatsächlich und das Bild "Eins" ist auch da drin. Was hab ich also falsch gemacht ?

Vielen Dank für nützliche Ratschläge.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moinsen und willkommen hier!

Bis du dich ein bisschen eingearbeitet hast, würde ich empfehlen, die Finger von Resources.Load zu lassen. Das Ding hat einige Implikationen, die in noch unüberschaubare Gebiete gehen.

Der übliche Weg, ein Objekt zur Laufzeit zu erzeugen, ist Instantiate mit einem Prefab. Statt dir über AddComponent-Code ein Objekt zusammen zu bauen, baust du es im Editor. Dann siehst du auch, was du tust. Das fertige GameObject ziehst du dann aus der Hierarchie (das Teilfenster, wo alle Objekte der Szene in einer Liste sind) in die Project View (wo deine Assets sind).

Was du dann hast, ist eine (meist) exakte Kopie des GameObjects - nur halt nicht in der Szene, sondern in den Assets. Diese Kopie nennt sich dann "Prefab", ist aber vom Typ her nach wie vor ein GameObject.

Jetzt gibt es die Funktion namens Instantiate, die eine Kopie eines GameObjects erstellt. Wenn man diese Funktion mit einem Prefab füttert, dann wird eine Kopie des Prefabs in der Szene erstellt, und schon hast du dein Objekt erstellt.

In deinem Code erstellst du mit "new GameObject" ein GameObject, und dann kopierst du es mit Instantiate gleich noch einmal. Du hast also zwei Objekte auf einmal erstellt.

Der Code für Prefab-Instantiate sieht jedenfalls etwa so aus:

public GameObject prefab; // Hier im Editor dein Prefab reinziehen

private void Start()
{
  Instantiate(prefab, transform.position, Quaternion.identity);
}

und das war's auch schon.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann man auch aus 2 Prefabs ein Gameobjekt erstellen? Also das 3D Model als Prefab Teil A und ein Bewegungsscript als Teil B um damit ein neues Gameobjekt zu erstellen? Ich spawne wie oben geschrieben mit "Instatiante" an verschiedenen Stellen des Game Reihen von Gegner. Derzeit bei mir:

Gegner 1: Modell A + Script A (Flug geradeaus)
Gegner 2: Modell B + Script A
Gegner 3: Modell A + Script B (Bogen nach links)
Gegner 4: Modell B + Script B
Gegner 5: Modell A + Script C (Boden nach rechts)
Gegner 6: Modell B + Script C

Aber eigentlich brauche ich nur 2 Modelle und 3 Scripts (Scripte?). Das würde auch das Ändern von Gegnern verbessern, da ich bei der Änderung des Modell A nicht 3 Prefabs anpassen muss. Noch schöner: ich kann dem Spawner eine Variable geben, welche er in das Script beim Spawnen einfügt. Somit kann ich den Bogen nach links und den Bogen nach rechts einmal als positiven Wert und einmal als negativen Wert angeben und spare noch ein Script.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klar, geht alles. Also... zwei Objekte zu einem vereinen wäre ziemlich unpraktisch, aber du kannst die beliebig einander unterordnen.

Der Rückgabewert von Instantiate ist eine Referenz auf das erzeugte Objekt, damit kannst du weiterarbeiten. Mit diesem Code baust du z.B. ein Objekt "object0", dem ein anderes "object1" untergeordnet ist.

var object0 = Instantiate(prefab0);
var object1 = Instantiate(prefab1, prefab0.transform);

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 9 months later...

Den Rat habe ich intuitiv befolgt und die Ziffern 0 bi 9 als

public GameObject Ziffer0 bis 9

meinem Script zur Verfügung gestellt.

Evtl. mache ich das nun auch noch mit 26 Buchstaben und ein paar Sonderzeichen, aber spätestens dann wird es unlustig.
Ein for 0 bis x
erfinde Gameobject mit Sprite lala.x wäre mir dann lieber.

 

Oder sollte ich z.B. eine Grafik komplett mit 0123456789 nehmen und immer nur den kleinen Ausschnitt anzeigen, den ich brauche?
Dann über Visible Inside Mask?

Man würde dann fünf Platten von 00000 bis 99999 jeweils hin- und herschieben anstatt Prefabs zu initiieren und wieder zerstören?

Wäre das die bessere oder die beste Lösung beim Einsatz von Grafiken als Ziffern (und Buchstaben)?


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...