Jump to content
Unity Insider Forum

Respawn nach dem Objekt gedroped wurde


Niehl

Recommended Posts

Hi Leute,

ich bin neu hier und versuche mich gerade an meinem ersten Spiel. Ich könnte ein wenig Hilfe gebrauchen.

Ich möchte ein Drag&Drop Spiel machen und an einer Stelle im Spiel liegen Objekte. Wenn ich ein Objekt wegnehme, möchte ich, dass automatisch ein neues entsteht. Damit ich dann wieder ein Objekt nehmen kann. Ich habe es mit diesem Script versucht

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

// Respawn gameObject after picking one up

public class OnEndDrag : MonoBehaviour
{

    public void OnEndDrag(PointerEventData eventData)
    {
        itemBeingDragged = null;
        GetComponent<CanvasGroup>().blocksRaycasts = true;
        if (transform.parent == startParent)
        {
            transform.position = startPosition;
        }
        else
        {
            GameObject clone = Instantiate(gameObject);
            clone.transform.SetParent(startParent);
            clone.transform.position = startPosition;
            Destroy(this);
        }
    }

Das funktioniert aber nicht. Hat jemand eine Ahnung wieso?

...Ich lese jetzt schon echt lang in Foren - komme aber nicht zu dem Punkt, dass das respawnen funktioniert. Sorry

Kann mir vielleicht jemand Helfen? Mit dem Script, ein Tutorial...something..

Danke im Voraus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also so genau könnte ich den Fehler jetzt auch nicht finden, aber irgendwie gefällt es mir nicht, dass du in einem Frame eine Kopie des Objekts anlegst und gleichzeitig aktuelles Objekt löschst. Vielleicht könnte das die Ursache für dein Problem sein. Versuch mal stattdessen ein Prefab zu instanzieren, statt das Objekt auf der Szene.

GameObject objektName = Instantiate (deinPrefab, startPosition, Quaternion.identity) as GameObject; 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Minuten schrieb TheOnlyOne:

Vielleicht könnte das die Ursache für dein Problem sein.

Sollte nicht. Trotzdem finde ich es auch sauberer, wenn man keine Kopien von GameObjects macht, die sich eventuell auf diese oder jene Art geändert haben, seit sie gespawnt sind. Stattdessen noch einmal das Prefab zu kopieren - und das am liebsten von einem anderen Objekt aus als der identischen Instanz, finde ich auch wesentlich besser.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 18 Stunden schrieb TheOnlyOne:

Also so genau könnte ich den Fehler jetzt auch nicht finden, aber irgendwie gefällt es mir nicht, dass du in einem Frame eine Kopie des Objekts anlegst und gleichzeitig aktuelles Objekt löschst. Vielleicht könnte das die Ursache für dein Problem sein. Versuch mal stattdessen ein Prefab zu instanzieren, statt das Objekt auf der Szene.


GameObject objektName = Instantiate (deinPrefab, startPosition, Quaternion.identity) as GameObject; 

 

Hi und vielen Dank,

ich werde deinen Vorschlag mal ins Script einbauen...👌

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt wollte ich das Script ausprobieren, aber ich kann kein Script mehr nutzen...ich bekomme die Meldung Can't add Script behaviourExecutor. needs derive from MonoBehaviour. Das komische ist, dass es sich jetzt um alle Scripte handelt. Auch die die schon mal funktioniert haben. Das ist ja zum Haare ausreissen:-(

Weiss jemand rat? Ich habe alle tricks aus dem Netz versucht...🤮

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Sascha,

 

ja ich hab ich von gehört. Ist auch so. Die SCripte die vorher funktioniert haben, gehen ja auch nicht mehr. Hab die Scene neu gemacht und jetzt dieses Script angewendet. Das funktioniert besser - vielleicht weil es einfacher ist...I dont't know.

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

public class CreateObject : MonoBehaviour
{
    public Transform Spawnpoint;
    public Rigidbody Prefab;

    void OnTriggerEnter()
    {
        Rigidbody RigidPrefab;
        RigidPrefab = Instantiate(Prefab, Spawnpoint.position, Spawnpoint.rotation) as Rigidbody;
    }
}

Jetzt wird der spawn durch ein trigger Event ausgelöst. Das ist auch cool so. Jetzt versuche ich in dieses Script einzubauen, dass es zufällig 3 unterschiedliche Objekte spawned. Hast DU da eine Idee? 

 

Ich dachte irgendwie so hier:

using UnityEngine;
using System.Collections; //for random numbers

public class RandomCreateObjects: MonoBehaviour
{

    bool hasSpawned = false;
    public GameObject[] itemPrefabs;


    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            if (!hasSpawned)
            {
                hasSpawned = true;
                Spawn();

            }
        }
    }

    void Spawn() {
        Instantiate(itemPrefabs[Random.Range(0, itemPrefabs.Length)], transform.position, spawner.transform.position); }
}

Aber da kann ich im inspector keine Objekte auswählen...und ich habe keinen Player, sondern ein Prefab, dass den spawn auslösen soll. Wie bei dem oberen Script...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn dir noch etwas nachträglich zum Beitrag einfällt, nutze gerne den "Bearbeiten"-Button unter deinem letzten Beitrag ;)

vor einer Stunde schrieb Niehl:

Ich dachte irgendwie so hier:

Sieht doch (abgesehen von der Formatierung) erstmal okay aus.

vor einer Stunde schrieb Niehl:

Aber da kann ich im inspector keine Objekte auswählen...

Dann schau mal in die Fehlermeldungen in Unitys Konsole. Sollte nämlich gehen.

vor einer Stunde schrieb Niehl:

und ich habe keinen Player, sondern ein Prefab, dass den spawn auslösen soll. Wie bei dem oberen Script...

Prefabs sind GameObjects in den Assets, die lösen gar nichts aus. In deinem Oberen Script kann auch jeder beliebige Rigidbody in der Szene deinen Trigger auslösen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, stimmt...

ich hab das script etwas verändert und so gehts jetzt...

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

public class CreateObject : MonoBehaviour
{
    public Transform[] spawnLocations;
    public GameObject[] Caskets;
    public GameObject[] CloneCaskets;
 

    void OnTriggerEnter()
    {
        CloneCaskets[0] = Instantiate(Caskets[0], spawnLocations[0].transform.position, Quaternion.Euler(0, 0, 0)) as GameObject;
    }
}

Hast Du eine Idee wie ich das spawnen random kriege? Das Problem ist jetzt eigentlich nur noch, dass nur 1 mal ein anderes GameObject gespawned wird...es wird ja immer nur das erste gespawned - klar...

 CloneCaskets[0] = Instantiate(Caskets[0], spawnLocations[0].transform.position, Quaternion.Euler(0, 0, 0)) as GameObject;
 CloneCaskets[1] = Instantiate(Caskets[1], spawnLocations[1].transform.position, Quaternion.Euler(0, 0, 0)) as GameObject;
 CloneCaskets[2] = Instantiate(Caskets[2], spawnLocations[2].transform.position, Quaternion.Euler(0, 0, 0)) as GameObject;

Bin ich da auf dem richtigen Weg?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gibt's nen besitmmten Grund, dass du Referenzen auf die instanziierten Objekte speicherst? Sonst kannste den Teil mit "CloneCaskets" auch komplett weg lassen.

In jedem Fall wird's nicht Random, wenn du nicht irgendwo das Wort "Random" drin hast... so als Faustregel für's Erste :)

Weiter oben hast du ja schon den Code, um Random ein Element aus einem Array auszuwählen:

itemPrefabs[Random.Range(0, itemPrefabs.Length)]

Und irgendwie habe ich das Gefühl, du willst nicht immer Prefab #0 an Spawn-Position #0 spawnen, sondern ein zufälliges Prefab an einer zufälligen Position, richtig? In dem Fall brauchst du zweimal so eine Zufallsauswahl.

Das "as GameObject" ist übrigens seit langer Zeit überflüssig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Sascha:

Gibt's nen besitmmten Grund, dass du Referenzen auf die instanziierten Objekte speicherst? Sonst kannste den Teil mit "CloneCaskets" auch komplett weg lassen.

In jedem Fall wird's nicht Random, wenn du nicht irgendwo das Wort "Random" drin hast... so als Faustregel für's Erste :)

Weiter oben hast du ja schon den Code, um Random ein Element aus einem Array auszuwählen:


itemPrefabs[Random.Range(0, itemPrefabs.Length)]

Und irgendwie habe ich das Gefühl, du willst nicht immer Prefab #0 an Spawn-Position #0 spawnen, sondern ein zufälliges Prefab an einer zufälligen Position, richtig? In dem Fall brauchst du zweimal so eine Zufallsauswahl.

Das "as GameObject" ist übrigens seit langer Zeit überflüssig.

Ich bin da noch nicht so gut drin...wie sieht das hier aus?

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

public class CreateObject : MonoBehaviour
{
    public Transform[] spawnLocations;
    public GameObject[] Caskets;
  


    void OnTriggerEnter()
    {
        Instantiate(Caskets[Random.Range(0, Caskets.Length), transform.position, spawnLocations.transform.position]);


    }
}

Ich bekomme ein compile error wegen dem spawnLocations.transform.position...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Muster sieht so aus:

meinArray[Random.Range(0, meinArray.Length)]

transform.position kommt da also nirgendwo rein, bevor die eckige Klammer zum Schließen kommt.

Außerdem ist die Signatur von Instantiate:

Instantiate(prefab, position, rotation);

...aber du hast zweimal Positionen da hingepackt.

Du kannst die Zwischenergebnisse auch in lokale Variablen packen, dann wird's direkt übersichtlicher.

void OnTriggerEnter()
{
  var casketPrefab = Caskets[Random.Range(0, Caskets.Length)];
  var spawnPosition = SpawnLocations[Random.Range(0, SpawnLocations.Length)];
  
  Instantiate(casketPrefab, spawnPosition.position, Quaternion.identity);
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...