Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Cambiar material con injerto script

Iniciado por Alazur, Junio 18, 2017, 04:44:39 AM

Tema anterior - Siguiente tema
Hola, muy buenas.
 
A penas sé nada de programar y me atiborro a tutoriales para ir avanzando, pero me he topado con un problema que me lleva de cabeza algún tiempo:

Resulta que he conseguido hacer que cuando haga click izquierdo con el ratón aparezca el texto sobre puesto con un canvas, y, al clicar nuevamente que desaparezca.


Además quiero que en la misma acción apareca o desaparezca el material, al mismo tiempo que lo hace el texto.


Mi problema es que no consigo hacer el cambio de material ("MaterialA" (cuando no aparece texto ) a "MaterialB" (cuando aparece el texto)), los tutoriales que he encontrado eran de anteriores versiones de Unity, y al parecer ya no funciona de la misma manera.


Adjunto código hasta ahora funcional, gracias de antemano!
 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class DisplayUITapa : MonoBehaviour
{
public string myString;
public Text myText;
public float fadeTime;
public bool displayInfo;
public GameObject[] ItemGlow;
// Use this for initialization
public void Start ()
{
   myText = GameObject.Find ("TextTapa").GetComponent<Text> ();
   myText.color = Color.clear;
   //Screen.showCursor = false;
   //Screen.lockCursor = true;
}
// Update is called once per frame
public void Update ()
{
   FadeText ();
   /*if (Input.GetKeyDown (KeyCode.Escape))
        {
                Screen.lockCursor = false;
                 
        }*/
}
   
//Ratón sobre...
/*
void OnMouseOver()
{
   displayInfo = true;
}
void OnMouseExit()
{
   displayInfo = false;
}*/
 
//Clic sobre el objeto
void OnMouseDown()
{
   if (displayInfo == false)
   {
      displayInfo = true;
      GetComponent<Renderer>().materials[].color = Color.black;      
   }
   else
   {
      displayInfo = false;
   }
}
   
//Desvanecimiento
void FadeText ()
{
   if(displayInfo)
   {
      myText.text = myString;
      myText.color = Color.Lerp (myText.color, Color.white, fadeTime * Time.deltaTime);
   }
   else
   {
      myText.color = Color.Lerp (myText.color, Color.clear, fadeTime * Time.deltaTime);
   }
}
}

 
 
 

Hola, cuando tenes que hacer este tipo de cosas pensalo como lo haces desde el inspector, vos te vas hasta el meshRenderer, y de ahi seleccionas el slop del material y se lo cambias...en codigo es identico, tenes que obtener el componente meshRenderer, luego encontrar el primer material (porque podrias tener mas de 1) y de ahi asignarle uno de preferencia mediante un recurso (Resources) o mediante el tipico "public Material". Te modifico un toque el codigo, fijate que cuando tenes un si es true es false, y si es false es true, lo podes haces como flag = !flag
 

Material mat_primario; //el que tenga puesto en el arranque
public Material mat_secundario;   //el elegible
MeshRenderer meshRenderer;
void OnEnable()
{

     meshRenderer = GetComponent<MeshRenderer>();
    mat_primario = meshRenderer.materials[];
}
void OnMouseDown()
{
  displayInfo = !displayInfo;
  if(displayInfo)
     meshRenderer.materials[] = mat_primario;   
  else
     meshRenderer.materials[] = mat_secundario;   
}

 
Ojo lo hice aca nomas seguro hay errores, fijate si anda

Al final, después de tantas pruebas para solucionar el problema, he añadido el siguiente código:
 

public Material MaterialA;
public Material MaterialB;
public void Update ()
{
   FadeText ();
   if (displayInfo == false)
   {
      GetComponent<Renderer> ().material = MaterialA;
   }
   else
   {
      GetComponent<Renderer> ().material = MaterialB;
   }
}

 
Por lo que el texto limpio y ordenado quedaría así:
 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class DisplayUITapa : MonoBehaviour
{
public string myString;
public Text myText;
public float fadeTime;
public bool displayInfo;
public Material MaterialA;
public Material MaterialB;
public void Start ()
{
   myText = GameObject.Find ("TextTapa").GetComponent<Text> ();
   myText.color = Color.clear;
}
public void Update ()
{
   FadeText ();
   if (displayInfo == false)
   {
      GetComponent<Renderer> ().material = MaterialA;
   }
   else
   {
      GetComponent<Renderer> ().material = MaterialB;
   }
}
   
void OnMouseDown()
{
   if (displayInfo == false)
   {
      displayInfo = true;
   }
   else
   {
      displayInfo = false;
   }
}
   
void FadeText ()
{
   if(displayInfo)
   {
      myText.text = myString;
      myText.color = Color.Lerp (myText.color, Color.white, fadeTime * Time.deltaTime);
   }
   else
   {
      myText.color = Color.Lerp (myText.color, Color.clear, fadeTime * Time.deltaTime);
   }
}
}

 
Y el material deseado se selecciona donde indico en la imagen:
 

Cita de: Alazur date=1497821965Al final, después de tantas pruebas para solucionar el problema, he añadido el siguiente código:
   
   

public Material MaterialA;
public Material MaterialB;
public void Update ()
{
   FadeText ();
   if (displayInfo == false)
   {
      GetComponent<Renderer> ().material = MaterialA;
   }
   else
   {
      GetComponent<Renderer> ().material = MaterialB;
   }
}

   
      Por lo que el texto limpio y ordenado quedaría así:
   
   

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class DisplayUITapa : MonoBehaviour
{
public string myString;
public Text myText;
public float fadeTime;
public bool displayInfo;
public Material MaterialA;
public Material MaterialB;
public void Start ()
{
   myText = GameObject.Find ("TextTapa").GetComponent<Text> ();
   myText.color = Color.clear;
}
public void Update ()
{
   FadeText ();
   if (displayInfo == false)
   {
      GetComponent<Renderer> ().material = MaterialA;
   }
   else
   {
      GetComponent<Renderer> ().material = MaterialB;
   }
}
   
void OnMouseDown()
{
   if (displayInfo == false)
   {
      displayInfo = true;
   }
   else
   {
      displayInfo = false;
   }
}
   
void FadeText ()
{
   if(displayInfo)
   {
      myText.text = myString;
      myText.color = Color.Lerp (myText.color, Color.white, fadeTime * Time.deltaTime);
   }
   else
   {
      myText.color = Color.Lerp (myText.color, Color.clear, fadeTime * Time.deltaTime);
   }
}
}

   
      Y el material deseado se selecciona donde indico en la imagen:
   
   
      
   


 
 
Ese código no está muy bien optimizado. Para empezar nunca deberías utilizar un GetComponent en Update, a parte, estás asignando el material a cada frame, aunque el material que se esté utilizando ya sea el mismo que vas a asignar. Una manera de arreglarlo un poco sería:
 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class DisplayUITapa : MonoBehaviour
{
public string myString;
public Text myText;
public float fadeTime;
public bool displayInfo;
public Material MaterialA;
public Material MaterialB;
private Renderer ren;
public void Start ()
{
   myText = GameObject.Find ("TextTapa").GetComponent<Text> ();
   myText.color = Color.clear;
           ren = GetComponent<Renderer>();
}
public void Update ()
{
   FadeText ();
}
   
void OnMouseDown()
{
   if (displayInfo == false)
   {
      displayInfo = true;
                ren.material = MaterialB;
   }
   else
   {
      displayInfo = false;
                ren.material = MaterialA;
   }
}
   
void FadeText ()
{
   if(displayInfo)
   {
      myText.text = myString;
      myText.color = Color.Lerp (myText.color, Color.white, fadeTime * Time.deltaTime);
   }
   else
   {
      myText.color = Color.Lerp (myText.color, Color.clear, fadeTime * Time.deltaTime);
   }
}
}

 
 
 
 
 
Si lo quisieras optimizar más podrías incluso hacer que el FadeText fuera un IEnumerator y activarlo desde el mouse down, así directamente te ahorrarías el Update, pero quizás esto ya es para un nivel más avanzado.
 
 
 
Saludos.

Cita de: TheBullet date=1497872837 
   
   
      Ese código no está muy bien optimizado. Para empezar nunca deberías utilizar un GetComponent en Update, a parte, estás asignando el material a cada frame, aunque el material que se esté utilizando ya sea el mismo que vas a asignar. Una manera de arreglarlo un poco sería:
   
   

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class DisplayUITapa : MonoBehaviour
{
public string myString;
public Text myText;
public float fadeTime;
public bool displayInfo;
public Material MaterialA;
public Material MaterialB;
private Renderer ren;
public void Start ()
{
   myText = GameObject.Find ("TextTapa").GetComponent<Text> ();
   myText.color = Color.clear;
           ren = GetComponent<Renderer>();
}
public void Update ()
{
   FadeText ();
}
   
void OnMouseDown()
{
   if (displayInfo == false)
   {
      displayInfo = true;
                ren.material = MaterialB;
   }
   else
   {
      displayInfo = false;
                ren.material = MaterialA;
   }
}
   
void FadeText ()
{
   if(displayInfo)
   {
      myText.text = myString;
      myText.color = Color.Lerp (myText.color, Color.white, fadeTime * Time.deltaTime);
   }
   else
   {
      myText.color = Color.Lerp (myText.color, Color.clear, fadeTime * Time.deltaTime);
   }
}
}

   
       
   
   
       
   
   
      Si lo quisieras optimizar más podrías incluso hacer que el FadeText fuera un IEnumerator y activarlo desde el mouse down, así directamente te ahorrarías el Update, pero quizás esto ya es para un nivel más avanzado.
   
   
       
   
   
      Saludos.
   


Le pegaré un ojo, muchas gracias! ;D

Etiquetas: