• 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
Script condiviso tra + gameobject
#1
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
 
Rispondi
#2
è 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
 
Rispondi
#3
Grazie, ma non dovrebbe esserci un modo per renderle legate all'oggetto al quale lo script è associato ?
 
Rispondi
#4
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 ?
 
Rispondi
#5
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?
 
Rispondi
#6
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.
 
Rispondi
#7
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;
}

}
}
}
}
 
Rispondi
#8
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.
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  GameObject.Find 93sunderland 9 953 14-04-2016, 01:59 PM
Ultimo messaggio: Blackg96

Vai al forum:


Browsing: 4 Ospite(i)