Creare Videogiochi - Game Developer
Script condiviso tra + gameobject - 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: Script condiviso tra + gameobject (/thread-Script-condiviso-tra-gameobject)



Script condiviso tra + gameobject - Almiotti79 - 21-09-2016

Ciao..  ho un problema, creando + oggetti e associandovi lo stesso script, in game se cambia ad esempio una variabile da vera a falsa per un oggetto.. si riflette su ogni altro oggetto a cui lo script è associato..  ho provato a metterla privata.. ma non capisco..   e purtroppo non parlando bene inglese non resco a reperire informazioni adeguate a superare il problema.
Qualcuno può aiutarmi? Grazie


RE: Script condiviso tra + gameobject - alessiobb3b - 21-09-2016

è ovvio lo script è uno ed è condiviso per tutti basta che da una parte si attivi e si attiva su tutti ti conviene fare più booleane una per oggetto


RE: Script condiviso tra + gameobject - Almiotti79 - 21-09-2016

Grazie, ma non dovrebbe esserci un modo per renderle legate all'oggetto al quale lo script è associato ?


RE: Script condiviso tra + gameobject - Zettamax - 21-09-2016

Ciao, il problema che hai è molto strano perchè, cambiando lo stato di una variabile dello script di un gameobject cambia solo lo stato della variabile per quel gameobject e non per tutti quanti, a meno che non si vada a modificare lo script.
Per cambiare lo stato della variabile stai usando un altro script o l'inspector ?


RE: Script condiviso tra + gameobject - Chip - 21-09-2016

Tutto dipende dal capire cosa intendi quando dici "creando + oggetti e associandovi lo stesso script".
Cosa c'è in questo script? Che genere di oggetti sono? Ne hai fatto dei prefabs? Ogni oggetto dovrebbe avere un suo script. Questa variabile è public? Si vede nell'inspector?


RE: Script condiviso tra + gameobject - Almiotti79 - 22-09-2016

Ciao, semplifico la cosa, allora ho 2 plane creati trascinando un prefab, ho un cubo creato solo sull'area di gioco (nessun prefab)
A questi tre gameObject attacco lo stesso script :

[attivatore.cs]
using UnityEngine;
using System.Collections;
public class attivatore : MonoBehaviour {
void Update () {
if (Input.GetMouseButtonDown (0)) {
Debug.Log (transform.position + "/n/r");
}
}
}
[fine file]

Qualsiasi oggetto clicco, lui mi stampa a console la posizione di tutti e tre gli oggetti :

(0.7, 1.0, 5.7)/n/r
UnityEngine.Debug:Log(Object)
(0.0, 0.0, 0.0)/n/r
UnityEngine.Debug:Log(Object)
(0.0, 0.0, 3.67)/n/r
UnityEngine.Debug:Log(Object)

Insomma.. qualsiasi cosa faccio nello script viene applicato a ogni oggetto a ci lo script è attaccato. Scusate l'ignoranza.. ma non riesco a trovare materiale didattico in italiano.. e a volte quindi mi perdo su quelle che sono fesserie magari.

Grazie molto.


RE: Script condiviso tra + gameobject - Almiotti79 - 22-09-2016

Ok .. aggiornamento.. devo usare il raycast per selezionare l'oggetto..
ma il problema nn si risolve.. la variabile è condivisa.. cioè io ho una variabile bool "attiva"
se clicco sul primo.. essa passa a false, se clicco sul secondo.. essa risulta già false
...
Allego il codice

using UnityEngine;
using System.Collections;

public class rilevaCollisione : MonoBehaviour {
public Material[] Materiali;
private bool attivo = true;
void Update(){
if (Input.GetMouseButtonUp (0)) {
RaycastHit hit;
Ray raggio = Camera.main.ScreenPointToRay (Input.mousePosition);
Debug.DrawRay (raggio.origin, raggio.direction * 10, Color.yellow);

if (Physics.Raycast (raggio,out hit)) {
Debug.Log (hit.collider.name + " > " + attivo);
if (attivo) {
hit.collider.GetComponent<Renderer>().sharedMaterial = Materiali [0];
attivo = false;
} else {
hit.collider.GetComponent<Renderer>().sharedMaterial = Materiali [1];
attivo = true;
}

}
}
}
}


[SOLVED]: Script condiviso tra + gameobject - Almiotti79 - 22-09-2016

Risolto, sbagliavo tutto io.. 
In pratica devo avere 2 script separati. Un script che intercetta le azioni e che si appoggia a una oggetto esterno (anche la cam) e poi lo script con la variabile e l'azione da compiere innescata da chi intercetta.
Allego i due codici :

SCRIPT SULLA CAM :

Codice:
using UnityEngine;
using System.Collections;

public class rilevaCollisione : MonoBehaviour {
    void Update(){
        if (Input.GetMouseButtonUp (0)) {
            RaycastHit hit;
            Ray raggio = Camera.main.ScreenPointToRay (Input.mousePosition);
            Debug.DrawRay (raggio.origin, raggio.direction * 10, Color.yellow);

            if (Physics.Raycast (raggio,out hit)) {  
                Debug.Log (hit.collider.name);
                hit.collider.GetComponent<attivatore>().attiva();
            }
        }
    }
}

SCRIPT SUL PREFAB (E QUINDI LE SUE ISTANZE) :

Codice:
using UnityEngine;
using System.Collections;

public class attivatore : MonoBehaviour {
    public Material[] Materiali;
    private bool attivo = true;
    public void attiva(){
        if (attivo) {
            this.gameObject.GetComponent<Renderer>().sharedMaterial = Materiali [0];
            attivo = false;
        } else {
            this.gameObject.GetComponent<Renderer>().sharedMaterial = Materiali [1];
            attivo = true;
        }
    }
}

Grazie a tutti. Alla prox.