2013-10-22 45 views
0

我试图在运行时基于如果我正在投射的光线击中某个对象来更改我的对象材质颜色。当我退出程序时,我希望它改回原来的材质颜色。根据在Unity中查看的内容更改对象材质

我的菜单与我想要切换的材质之间有一个高亮功能,让用户知道他们即将选择的材料。在过去的几天我一直在试图得到这个工作,我有以下问题:

  • 我想要的材质颜色的实例连接到游戏对象,但不改变渲染材料

  • 高亮材质颜色放在我的游戏对象,而不是实际的材料我想

我已经跑出来的关于如何解决这个想法,我已经在得到隧道的设想在这里我需要一双新鲜的眼睛来看看我h到目前为止。

有没有人曾经这样做过?你能告诉我我做错了什么吗?

这是我一直在努力与代码的当前状态:

我的类存储原始材料,这样一旦程序结束就可以切换回它。

public GameObject targetMaterial; 
public Color orignalMaterial; 

//store GO original colour 
void Awake() 
{ 
    orignalMaterial = targetMaterial.renderer.material.color; 
} 

//highlight code 
public void ChangeObjectMaterialColour(Color materialColour) 
{ 
    targetMaterial.renderer.material.color = materialColour;   
} 

// 
void OnApplicationQuit() 
{ 
    targetMaterial.renderer.material.color = orignalMaterial; 
} 

如何,我试图改变材料的颜色,我有我想要切换三种不同的选择:

ChangeObjectColour new_colour1; 
ChangeObjectColour new_colour2; 
ChangeObjectColour new_colour3; 

void Start() 
{ 
    new_colour1 = GameObject.Find("Colour 1").GetComponent<ChangeObjectColour>(); 
    new_colour2 = GameObject.Find("Colour 2").GetComponent<ChangeObjectColour>(); 
    new_colour3 = GameObject.Find("Colour 3").GetComponent<ChangeObjectColour>(); 
} 


void CastRay() 
{ 
    if (Physics.Raycast(transform.position, fwd, out hit)) 
     { 
      foreach(string t in _tags) 
      { 
       if(hit.collider.gameObject.tag == t) 
       { 
        HighLight(hit.collider.gameObject); 
        hitTaggedObject = true; 
       }     
      } 

      if(hit.collider.gameObject.tag == "Colour1") 
      {  new_colour1.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color); 
      } 

      if(hit.collider.gameObject.tag == "Colour2") 
      {  new_colour2.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color); 
      }    
      if(hit.collider.gameObject.tag == "Colour3") 
       { 
    new_colour3.ChangeObjectMaterialColour(hit.collider.gameObject.renderer.material.color); 
       } 
     } 

任何人都可以看到什么我做错了吗?

回答

0

我认为问题的一部分就是您访问材料属性的方式。这里有两种扩展方法可以改变颜色和材质“不永久”。当应用程序退出时,您也不必改变颜色。它将在退出时自动恢复到原始状态。

/// <summary> 
/// Changes the material attached to the gameObject 
/// </summary> 
public static void ChangeMaterial(this GameObject go, Material mat) 
{ 
    go.renderer.material = mat; 
} 

/// <summary> 
/// Changes the color of the material 
/// </summary> 
public static void ChangeColor(this Material mat, Color color) 
{ 
    mat.SetColor("_Color", color);    
} 

我在单个运行时会话中使用了这些方法数百次。 将它们放在一个静态类中,并将其称为它的扩展类的成员。

例如:

gameObject.renderer.material.ChangeColor(Color.red); 
gameObject.ChangeMaterial(/* Your Material */); 

的“_Color”是着色器的内部所限定的颜色成分的名称。所有在着色器中构建的统一体都具有此属性。但是如果你有一个自定义的着色器,这可能不是这种情况,它可以被称为别的东西。不幸的是,没有办法以编程方式知道这一点,你只需要跟踪。