Creare Videogiochi - Game Developer
Parametri globali sugli oggetti. - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Unity3D Italia (https://www.making-videogames.net/giochi/Forum-Unity3D-Italia)
+--- Forum: Richieste di Aiuto per Unity 3D (https://www.making-videogames.net/giochi/Forum-Richieste-di-Aiuto-per-Unity-3D)
+--- Discussione: Parametri globali sugli oggetti. (/thread-Parametri-globali-sugli-oggetti)



Parametri globali sugli oggetti. - 93sunderland - 24-05-2016

Raga, vi chiedo urgentemente aiuto perchè è una mattinata che ci sto ragionando ma non riesco a trovare una soluzione...

Vorrei creare uno script che "colleziona" tutti i dati sugli oggetti da poter raccogliere e mettere nell'inventario. Sto iniziando con la cosa più semplice, ovvero far in modo che quando un oggetto venga raccolto ci sia un parametro globale che stabilisce lo stato dell'oggetto, ovvero che è stato raccolto. Quindi questo parametro globale fa in modo che cambiando scena, l'oggetto in questione venga segnalato come raccolto e quindi non si trova più nella posizione di partenza (è stato distrutto). 
I PlayerPrefs so come si utilizzano, ma il mio problema non è su questo, bensì su come posso creare uno script dove posso raccogliere tutte le informazioni degli oggetti raccolti in quella scena, e quindi solo successivamente poterli salvare con il PlayerPrefs.

Attento risposte Big Grin


RE: Parametri globali sugli oggetti. - Zettamax - 25-05-2016

Ciao, scusa ma non mi è chiaro qual'è il problema.
Questo qui sotto è il risultato che vuoi ottenere ?
Citazione:far in modo che quando un oggetto venga raccolto ci sia un parametro globale che stabilisce lo stato dell'oggetto, ovvero che è stato raccolto. Quindi questo parametro globale fa in modo che cambiando scena, l'oggetto in questione venga segnalato come raccolto e quindi non si trova più nella posizione di partenza (è stato distrutto).



RE: Parametri globali sugli oggetti. - 93sunderland - 26-05-2016

si esatto, è quello che non riesco a fare


RE: Parametri globali sugli oggetti. - Zettamax - 26-05-2016

Fai così:
Crea un oggetto vuoto(empty) e crea uno script con nome "Manager" e  incolla questo:
Codice:
using UnityEngine;
using System.Collections;

public class Manager : MonoBehaviour {

public bool obj1_took = false;

void Start () {
DontDestroyOnLoad (transform.gameObject);
}

void Update () {
}

}

la variabile "public bool obj1_took = false;" in questo caso consentirà di controllare se l'oggetto è stato preso o meno, ovviamente puoi usare questo sistema ma utilizzando variabili di tipo int o float per controllare eventuali altri stati dell'oggetto/degli oggetti.
La funzione "DontDestroyOnLoad (transform.gameObject);" fa sì che l'oggetto che contiene lo script non venga distrutto al cambio della scena.

Ora nell'oggetto da raccogliere crea uno script con nome "ObjGrab" e incolla questo:

Codice:
using UnityEngine;
using System.Collections;

public class ObjGrab : MonoBehaviour {

void Start () {
if (GameObject.Find("Manager").GetComponent<Manager>().obj1_took == true)
{
Destroy(this.gameObject);
}
}


void Update () {

}

void OnCollisionEnter(Collision collision) {
GameObject.Find ("Manager").GetComponent<Manager> ().obj1_took = true;
Destroy (this.gameObject);
}

}

La parte contenuta nella funzione "void Start()" non fa altro che controllare la variabile del manager di prima, e nel caso in cui la variabile segni l'oggetto come già preso lo distrugge.
La parte della funzione "void OnCollisionEnter(Collision collision)" si attiva quando l'oggetto entra in collisione, provocando il cambiando lo stato della variabile "obj1_took" e la distruzione di se stesso.

Come puoi notare in questi script non ho creato una parte dove lo stato della variabile "obj1_took"  viene salvato, infatti se riavvii la simulazione del gioco la variabile tornerà al suo stato originario, ma non credo che tu abbia difficoltà ad implementarla.
Spero di esserti stato d'aiuto, in caso di difficoltà non esitare a chiedere Smile


RE: Parametri globali sugli oggetti. - 93sunderland - 27-05-2016

fino a qui ci sono, però mi sorge un dubbio: quindi all'interno del gameObject "Manager" dovrei inserire tante variabili booleane quanti sono gli oggetti presenti nel gioco?


RE: Parametri globali sugli oggetti. - itreturns - 27-05-2016

Per questo hanno inventato gli array.


RE: Parametri globali sugli oggetti. - Zettamax - 27-05-2016

Si, per come sono impostati gli script ora dovresti creare manualmente ogni singola variabile.
Come ha detto giustamente itreturns, il problema è facilmente risolvibile utilizzando gli array.
Per implementare gli array negli script di prima basta fare qualche semplice modifica, infatti lo script Manager diventa:
Codice:
using UnityEngine;
using System.Collections;

public class Manager : MonoBehaviour {
    
    public bool[] obj_took;
    void Start () {
        obj_took = new bool[10];
        obj_took [1] = true;
        DontDestroyOnLoad (transform.gameObject);
    }
    
    void Update () {
        
    }
}
La riga "public bool[] obj_took;" definisce obj_took come array booleano.
La riga "obj_took = new bool[10];" definisce la lunghezza dell'array (ovvero quante variabili).
La riga "obj_took [1] = true;" definisce lo stato della seconda variabile (l'array parte da 0).

Mentre lo script objGrab diventa:

Codice:
using UnityEngine;
using System.Collections;

public class ObjGrab : MonoBehaviour {

    void Start () {
        if (GameObject.Find("Manager").GetComponent<Manager>().obj_took[1] == true)
        {
            Destroy(this.gameObject);
        }
    }
    
    void Update () {
    
    }

    void OnCollisionEnter(Collision collision) {
        GameObject.Find ("Manager").GetComponent<Manager> ().obj_took[1] = true;
        Destroy (this.gameObject);
    }
}
La riga "if (GameObject.Find("Manager").GetComponent<Manager>().obj_took[1] == true)" controlla lo stato della seconda variabile.
La riga "GameObject.Find ("Manager").GetComponent<Manager> ().obj_took[1] = true;" imposta il valore della seconda variabile.

Questo è tutto, se provi ad avviare la simulazione del gioco l'oggetto con lo script ObjGrab non comparirà perchè la variabile è impostata su "true" nello script Manager.


RE: Parametri globali sugli oggetti. - 93sunderland - 27-05-2016

ok grazie mille, siete stati davvero utili

ovviamente ho costruito lo script in modo un po' diverso ma grazie a voi adesso so cosa e come fare