【问题标题】:Scripting GUI buttons to trigger an event of changing materials脚本 GUI 按钮以触发更改材料的事件
【发布时间】:2015-08-15 05:53:33
【问题描述】:

抱歉,如果有类似的问题,但是,我可能已经看到它并且它没有解决我的问题。

我正在尝试编写一个统一的 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;
                }

            }

        }

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

我试图修复的代码 sn-p 以“function OnGUI()”开头,但我可能错了,可以使用一些新的见解。

这是生成的脚本的屏幕截图。左边的按钮应该是通过鼠标点击按钮将材质的颜色从seat_mat1更改为seat_mat2。

我已将之前的脚本统一附加到 3D 对象,并创建了一个文件夹名称“资源”,以便通过脚本可见和引用材料。

我的问题是,单击 GUI 按钮后,什么也没有发生,这可能是一些非常简单的事情,我只是想念它.. 很抱歉在 JS 方面缺乏经验或缺乏统一性。

提前致谢。

编辑:

所以在玩了更多代码之后。我在这一行之后添加了一个 Debug.Log()

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

似乎是每次按下按钮时我都会遇到的这个错误

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

那么简单理解一下,好像是渲染器不怎么附加?

【问题讨论】:

    标签: unity3d unityscript


    【解决方案1】:

    您的代码运行良好但我仍然认为一旦您加载了启动功能中的材料,您就不需要每次都加载它们。还有一件事是确保您已将脚本应用于要更改其材质的游戏对象。如果你只是想改变颜色不想改变完整的材质使用材质的颜色属性,你的 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;
    
                }
    
            }
    
        }
    

    但是,如果您不使用 color poperty,它会正常工作,只需确保您已将脚本应用于您想要更改材料的游戏对象,因为您的情况可能是您的座位1。

    【讨论】:

    • 感谢您的回答,我知道我不需要每次都加载它们,但我仍在尝试实现工作代码。我知道我的能力理论上应该可以工作,但是,有些事情我不能指望它没有操作它。我将脚本作为一个整体附加到了游戏对象,因为我希望使用相同的材​​质更改所有对象的材质,例如座位垫 1 到座位垫 2。现在我已经了解到渲染器本身并不能按照我上面的编辑开始工作,现在我专注于这一点,我希望尽快找到答案。
    • 是的,这正是问题所在,因为您将脚本附加到了错误的游戏对象,而不是您应该将此脚本附加到应用了材质的游戏对象。
    • 或者您可以将 seat_mat1 材质应用于具有此脚本的游戏对象,即使这样它也可以工作。因为异常显示游戏对象没有渲染,但您正在使用 GetComponent.().material 它将获取游戏对象的渲染器,如果它没有附加,它将通过异常
    • 是的,你是对的,脚本需要附加到游戏对象而不是整个游戏对象组。但是,即使我附加到所有需要的游戏对象,渲染也会更改最后一个对象以将脚本附加到......但是嘿,至少它以某种方式工作:)
    • 您可以通过稍微修改脚本将材料更改为整个组。我正在为你写它等待我的下一个回复
    【解决方案2】:

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

    代码:

    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 中保存脚本后,打开 Unity,在其中创建一个空游戏对象并添加所有具有特定材质的对象,例如seat_mat1 下它作为孩子。 然后单击空对象,如果愿意,可以重命名,并从“Add Component > Mesh > Mesh Renderer”添加一个“Mesh Renderer”组件。 之后将脚本拖到空对象上,在检查器中,您可以找到一个选项,您可以选择一个名为“rend”的渲染器。选择空对象作为Mesh Renderer。

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

    再次感谢 Nain 的帮助 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多