2017-02-13 7 views
0

Ich habe zwei Prefabs in meinem Assert; In meiner Szene habe ich Instanzen der beiden Prefabs. Ich versuche, die Farbe aller Instanzen eines Prefab mit einem Knopfklick zu ändern, aber was ich bekomme ist, dass sich die Farbe aller Instanzen der beiden Prefabs ändert. Wie kann ich angeben, dass das Prefab innerhalb einer bestimmten Funktion geändert werden soll? Ich nehme an, dass gameObject sich auf alle SpieleObjekte in meiner Szene bezieht und das ist wahrscheinlich der Grund, warum alle Instanzen ihre Farbe ändern.Ändern Sie die Farbe der vorgefertigten Instanzen

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

public class eventSensors : MonoBehaviour { 


    // Use this for initialization 
    void Start() { 

    } 

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

    } 

    public void tempSensor() { 

     print("estas en la funcuion de tempSensor"); 
     // this.gameObject.GetComponent<Renderer>().material.color = Color.red; 
     //gameObject.GetComponent<Renderer>().sharedMaterial.color = Color.red; 
    var prefab=  Instantiate(gameObject, transform.position, transform.rotation); 

     prefab.GetComponent<Renderer>().material.SetColor("_Color", Color.red); 
    } 
    public void lightSensor() 
    { 
     print("estas en la funcuion de lightSensor"); 
     gameObject.GetComponent<Renderer>().sharedMaterial.color = Color.green; 

    } 
    //Sent to all game objects before the application is quit 
    //this is called when the user stops playmode. 
    private void OnApplicationQuit() 
    { 
     //reset all prefab color to default 
     gameObject.GetComponent<Renderer>().sharedMaterial.color = Color.white; 
    } 
} 
+0

Ja, ich habe nur ein einziges Material Ordner im proyect –

+0

Keine Notwendigkeit, mehrere Materialien zu erstellen: siehe meine Antwort. – Kardux

+0

Vorschlag: Stellen Sie Ihre Frage darüber, wie Sie ti gearbeitet haben, als Antwort auf Ihre Frage. – starbeamrainbowlabs

Antwort

1

einfach für GetComponent<Renderer>().material.color rufen statt: Renderer.material die Instanz des Materials anstelle des gemeinsam genutzten einer zurückgibt.

Auf die gleiche Weise können Sie GetComponent<Renderer>().materials[i] anstelle von GetComponent<Renderer>().sharedMaterials[i] aufrufen, wenn Ihr Renderer mehrere Materialien enthält.

Als eine Randnotiz kann die gameObject.GetComponent<>() zu GetComponent<>() vereinfacht werden, da Ihr Skript von MonoBehaviour erben.

hoffe, das hilft,

+0

Ich habe es herausgefunden, indem ich ein Array erstellt habe, das alle Instanzen des Prefab enthält, und dann eine Foreach-Funktion, um diese Instanzen zu iterieren und ihre Farbe mithilfe von MeshRenderer zu ändern. 'public GameObject [] getCount; getCount = GameObject.FindGameObjectsWithTag ("tempPrefabTag"); int Zählung; count = getCount.Length; foreach (Gameobject o in getCount) { // Um ​​die Materialkomponente Verwendung acces. MeshRenderer // die Farbe jedes Gameobject in der Prefab o.GetComponent ändern () material.SetColor ("_ Farbe" , Farbe Rot); } } ' –

+0

Froh, dass es geholfen hat! Ich habe Ihre Frage bearbeitet, um Ihre Antwort hinzuzufügen, damit sie leichter zu lesen ist als in einem Kommentar. Wenn Sie der Meinung sind, dass diese Antwort richtig ist, wählen Sie sie bitte als Antwort aus. – Kardux

Verwandte Themen