• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Destroy
#1
Salve. Ho qualche problema con il metodo destroy. Ho creato uno script che alla collisione del player con la testa di un nemico il nemico viene distrutto. Fino a qua tutto ok...ma il problema sorge quando spawna il nemico e quando vado a collidere con la testa lo script sembra non funzionare. Girovagando in rete mi sembra di capire che questo problema sia dovuto al fatto che quando distruggo il nemico si distrugga anche il transform (scusate se potrei aver detto una cavolata ma sono "nuovo") . Potete darmi una mano?
 
Rispondi
#2
Mi compare l'errore : the object of type transform has been destroyed but you are still trying to access it
 
Rispondi
#3
Potresti postare lo script che hai creato in modo da controllare se sono presenti eventuali errori? Smile
 
Rispondi
#4
certo, appena torno a casa.
 
Rispondi
#5
Intanto se vuoi vedere l'errore é molto simile a quello descritto nel video di RikuThe Fuffs chiamato Destroy parte 2 di 2 dal minuto 7:44
 
Rispondi
#6
Ecco a voi lo script (scusate per i nomi strani) : using UnityEngine;
using System.Collections;

public class vitapermoneta : MonoBehaviour {
GameObject moneta;
GameObject nemico;

// Use this for initialization
void Start () {
moneta = GameObject.FindWithTag ("moneta");
nemico = GameObject.FindWithTag ("nemico");
}

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


}
void OnCollisionEnter2D(Collision2D collisione)
{

if(collisione.gameObject.tag == "Player")

Destroy(nemico);
}


}
 
Rispondi
#7
Questo script a che oggetto è attaccato? Al nemico? Comunque per solo una collisione non ti consiglio di usare il FindWithTag, ma un semplice script attaccato al player. Io ti consiglio qualcosa così:
Codice:
using UnityEngine;
using System.Collections;

public class vitapermoneta : MonoBehaviour {

void OnCollisionEnter2D(Collision2D collisione)
{
if(collisione.gameObject.tag == "Enemy")
{
Destroy(collisione.gameObject);
  }
}
}

Basta che attacchi questo script al player, aggiungi la tag Enemy al nemico e tutto funzionerà Smile
Ovviamente sia il player che il nemico devono avere un collider Wink
 
Rispondi
#8
Grazie mille! Appena posso provo
 
Rispondi
#9
Cè qualcosa che non va ma è colpa mia che non ho spiegato cosa volevo fare . Allora io ho creato il gameobject nemico e ho creato un altro child del nemico chiamato moneta che rappresenterebbe la testa. Quindi quello che volevo fare io è che alla collisione del personaggio con la moneta(testa) viene di strutto il nemico.
 
Rispondi
#10
Ah, perfetto! Pensavo che moneta fosse un'altro oggetto da raccogliere Tongue
Codice:
using UnityEngine;
using System.Collections;

public class vitapermoneta : MonoBehaviour
{

    public GameObject nemico;

    void Start()
    {
        nemico = GameObject.FindWithTag("Enemy");
    }

    void OnCollisionEnter2D(Collision2D collisione)
    {
        if (collisione.gameObject.tag == "Moneta")
        {
            Destroy(nemico);
        }
    }
}

Dunque, la moneta-testa deve avere la tag Moneta, mentre il nemico la tag Enemy. Ora dovrebbe andare Smile
 
Rispondi
#11
Ok scusa se ti faccio perdere tempo. Chiudo con la solita frase : appena torno a casa provo
 
Rispondi
#12
Ok la mia sfiga non ha limiti. Ho formattato il pc e prima di fare ciò ho salvato la cartella del gioco in chiavetta. Metto la chiavetta e mi accorgo che non funziona. Quindi ho perso buon parte dei file di gioco . Appena rimetto a posto ti faccio sapere.
 
Rispondi
#13
ti consiglio di fare come me: ogni volta che fai grossi cambiamenti dal progetto, questo lo carichi su qualche drive, così mal che vada puoi recuperare il progetto quando vuoi
 
Rispondi
#14
Il problema non si è risolto, mi scuso se vi faccio perdere tempo. Pubblico un video su youtube per farvi capire il problema.
 
Rispondi
#15
Fermo lì, ho capito il problema. Lo script se noti assegna alla variabile nemico l'oggetto che ha la tag "Enemy"... Ebbene il punto sta che quella funzione è in void Start(), quindi appena il gioco parte la esegue. Ma se il nemico non è ancora stato spawnato lo script non lo trova, e lascia la variabile nemico vuota. Il tutto si risolve semplicemente così:
Sostituisci il pezzo di codice contenente questo:
Codice:
void Start()
{
nemico = GameObject.FindWithTag("Enemy");
}

Con questo:
Codice:
void Update()
{
nemico = GameObject.FindWithTag("Enemy");
}

Se non ho sbagliato qualcosa a scrivere(sono da mobile Tongue) dovrebbe andareSmile
 
Rispondi
#16
Grazie mille funziona! Solo che si è creato un altro problema , ovvero che distrugge i Gameobject spawnati random. Per esempio se colpisco la testa (moneta) di uno si distrugge l'altro . Penso sia dovuto dal fatto che abbiano li stessi tag.
 
Rispondi
#17
Uhm, prova con questo:
Codice:
using UnityEngine;
using System.Collections;

public class vitapermoneta : MonoBehaviour {

void OnCollisionEnter2D(Collision2D collisione)
{
if(collisione.gameObject.tag == "Moneta")
{
    Destroy(collisione.transform.parent.gameObject);
  }
}
}

Non l'ho provato, quindi non so se è la soluzione
 
Rispondi
#18
Ok provo ma il mio problema é uguale a quello del video di RikuTheFuffs (destroy parte 2) dal minuto 7 . Se hai tempo guardalo.
 
Rispondi
#19
Sembra funzionare ... Domani provo con lo spawner dato che per ora ho improvvisato duplicando i gameobjects nella scena ;D
 
Rispondi
#20
Ok, fammi sapere Smile Non sono ancora riuscito a guardare il video, appena riesco ci dò un'occhiata
 
Rispondi
  


Vai al forum:


Browsing: 1 Ospite(i)