2017-02-13 17 views
0

У меня есть два сборника в моем Assert; в моей сцене у меня есть экземпляры двух сборных. Я пытаюсь изменить цвет всех экземпляров одного prefab нажатием кнопки, но я получаю, что цвет всех экземпляров двух надстроек изменяется. Как я могу указать сборку для изменения внутри определенной функции? Я предполагаю, что gameObject ссылается на все объекты gameObjects в моей сцене и, вероятно, именно поэтому все экземпляры меняют цвет.Изменить цвет экземпляров prefab

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

Да, у меня только одну папку материала в proyect –

+0

Нет необходимости создавать несколько материалов: см мой ответ. – Kardux

+0

Предложение: Отправьте свой вопрос о том, как вы сделали работу в качестве ответа на свой вопрос. – starbeamrainbowlabs

ответ

1

Просто позвоните на GetComponent<Renderer>().material.color вместо: Renderer.material возвращает экземпляр материала вместо общей один.

Точно так же вы можете позвонить за GetComponent<Renderer>().materials[i] вместо GetComponent<Renderer>().sharedMaterials[i], когда ваш Renderer содержит несколько материалов.

В качестве побочного примечания gameObject.GetComponent<>() можно упростить до GetComponent<>(), так как ваш скрипт наследуется от MonoBehaviour.

Надеюсь, что это помогает,

+0

Я понял это, создав массив для хранения всех экземпляров prefab, затем функцию foreach для итерации этих экземпляров и изменения цвета с помощью MeshRenderer. 'public GameObject [] getCount; getCount = GameObject.FindGameObjectsWithTag ("tempPrefabTag"); int count; count = getCount.Length; Еогеасп (GameObject о в GetCount) { // Для Acces материала использование компонента:. MeshRenderer // изменить цвет каждого геймобжекты в Prefab o.GetComponent () material.SetColor ("_ Color" , Красный цвет); } } ' –

+0

Рад, что это помогло! Я отредактировал ваш вопрос, чтобы добавить ваш ответ, чтобы его было легче читать, чем в комментарии. Если вы считаете, что этот ответ правильный, выберите его в качестве ответа. – Kardux