2015-08-15 155 views
2

但是,如果有类似的问题,我很抱歉,我可能已经看到它,但它并没有解决我的问题。脚本GUI按钮触发更改材质的事件

我想写一个JS脚本为了实现一个点击触发的事件。

我在网上搜索了UnityAnswers网站和其他人,我可以得到最接近的是基于这些问题 http://answers.unity3d.com/questions/368303/changing-shaders-of-a-gameobject-via-script-1.html

而这一次 http://answers.unity3d.com/questions/319875/change-objects-material-using-gui-buttons-via-scri.html

,也看了这一个 http://docs.unity3d.com/ScriptReference/Material-shader.html

所以,我的代码是这个到目前为止

var button2_tex : Texture; 
var button3_tex : Texture; 
var button4_tex : Texture; 
var seat_mat1 : Material; 
var seat_mat2 : Material; 
var veneer1 : Texture; 
var veneer2 : Texture; 
var rend : Renderer; 
var _mouseDown = false; 



function Start() { 

    seat_mat1 = Resources.Load("seat_mat1"); 
    seat_mat2 = Resources.Load("seat_mat2"); 

} 

function Update(){ 

     if(Input.GetMouseButtonDown(0)){ 

      _mouseDown = true; 

     } 

} 

function OnGUI() { 

GUI.Box (Rect (10,10,100,200), "Menu"); 

     if (_mouseDown){ 

      if (GUI.Button (Rect (20,40,40,20), button1_tex)){ 

      if(seat_mat1){ 


       rend.material = seat_mat2; 
       Debug.Log("This button was clicked!"); 
       } 

      else{ 

       rend.material = seat_mat1; 
       } 

      } 

     } 

请注意我尚未使用的一些变量,因为我仍在测试一堆其他代码,以使其工作..

我试图修复的代码片段以“function OnGUI()”开头,但是我也许是错的,可以使用一些新的见解。

这是生成的脚本的屏幕截图。假设左侧的按钮通过鼠标点击按钮将材料的颜色从seat_mat1更改为seat_mat2。

enter image description here

我重视前面的脚本,以团结3D对象,并做了一个文件夹名称“资源”的物质是可见的,并通过脚本引用。

我的问题是,单击GUI按钮时,什么也没有发生,它可能是一个非常简单的东西,我只是想念它..道歉没有经验的JS很多或团结。

在此先感谢。

编辑:

所以打多一点的代码之后。我此行

GetComponent.<Renderer>().material = seat_mat2; 
Debug.Log("This button was clicked!"); 

后加入的debug.log(),似乎是这个错误,我越来越每次按下按钮

时间“MissingComponentException:没有‘渲染’连着到“scene_export3”游戏对象,但脚本正在尝试访问它 您可能需要将渲染器添加到游戏对象“scene_export3”中,或者您的脚本需要在使用之前检查组件是否已连接 materialChanger .OnGUI()(在Assets/materialChanger.js:44)“

因此,通过简单的了解,似乎渲染器不是以某种方式连接的?

回答

0

你的代码工作正常但我仍然认为一旦你已经加载了启动函数中的材料,你不需要每次加载它们。还有一件事是确保你已经将脚本应用到了你想改变材质的游戏对象。如果你只是想改变颜色不想改变材料的颜色属性,你的OnGUI函数应该看起来像这样。

function OnGUI() { 

GUI.Box (Rect (10,10,100,200), "Menu"); 

    if (_mouseDown){ 

     if (GUI.Button (Rect (20,40,40,20), button1_tex)){ 

      if(GetComponent.<Renderer>().material == seat_mat1) 


       GetComponent.<Renderer>().material.color = seat_mat2.color; 


      else 

       GetComponent.<Renderer>().material.color = seat_mat1.color; 

      } 

     } 

    } 

但是,如果你不使用色彩poperty它将很好地工作只是确保你已经应用脚本游戏boject要更改材料我你的情况可能是您的seat1。

+0

谢谢您的回答,我明白,我不需要每次都加载它们,但我仍然尝试,实现了工作代码。我知道我的理论上可以工作,但是,有些事我无法控制,那就是没有操作它。我将脚本作为一个整体附加到gameObject中,因为我正在寻找使用相同材质更改所有对象的材质,例如seat_mat1到seat_mat2。现在我明白了渲染器本身并没有按照上面的编辑开始,现在我正在关注这一点,我希望很快能够找到答案。 –

+0

是的,这正是问题所在,因为您已将脚本附加到错误的游戏对象上,而应将此脚本附加到应用了材质的游戏对象。 – Nain

+0

,或者您可以将seat_mat1材质应用于具有此脚本的gameobject,即使这样它也可以工作。因为异常显示游戏对象没有渲染,但你使用的是GetComponent。 ().material会得到gameobject的渲染器,如果没有附加,它会通过例外 – Nain

0

感谢纳恩的指导,在您的帮助下,我能够想出一个部分解决方案,我知道我可以从那里解决。 解决方案如下。

代码:在您创建一个空的游戏对象,并使用特定的材料,例如添加的所有对象

function OnGUI() { 

GUI.Box (Rect (10,10,100,200), "Menu"); 

     if (_mouseDown){ 

      if (GUI.Button (Rect (20,40,40,20), button1_tex)){ 


       var rendArray : Renderer[]; 

       rendArray = GetComponentsInChildren.<Renderer>(true); 

       for(var rend : Renderer in rendArray){ 

       if(rend.sharedMaterial == seat_mat1){ 

        rend.sharedMaterial = seat_mat2; 
        Debug.Log("This button was clicked!"); 
        } 

       else{ 

        rend.sharedMaterial = seat_mat1; 
        } 

        } 

       } 

      } 

     } 

节省MonoDevelop中,开放统一的脚本后seat_mat1作为儿童。 然后单击空对象,如果您喜欢,请将其重命名,然后从“添加组件>网格>网格渲染器”中添加“网格渲染器”组件。 之后,拖动脚本到空对象,并在督察中,你可以找到一个选项,你可以选择一个叫做“rend”的渲染器。选择空对象作为网格渲染器。

在测试结果后,我设法将一些对象的材质一起更改为seat_mat2,但无关材料已将其自身更改为seat_mat1,并且一旦再次单击该按钮,它们会在seat_mat1和seat_mat2之间交替,即使它不是完美的完成,我正在回答这个问题,因为任何事情都是可以解决的(我希望)。

再次感谢您奈恩的帮助:)