在两种材料之间切换

时间:2014-02-07 13:04:29

标签: c# unity3d

当我按下项目中的空格键时,我想要切换两个纹理。但是当我这样做时,什么也没发生。

任何人都可以看到我的逻辑错误吗?我有这个工作在2个着色器之间切换,但不是它是材料,它不起作用。我很困惑。

void Switch()
{
    Debug.Log(gameObject.renderer.material.name);

    if(Input.GetButtonDown("Jump"))
    {
        diffuse = false;
        //if(gameObject.renderer.material == diffuse_Material)
    }
    else 
    {

        diffuse = true;
    }


    if(diffuse == true)
    { 

        gameObject.renderer.material = mask_Material;   
        print("1");
        Debug.Log(gameObject.renderer.material.name);
    }
    else
    {

        gameObject.renderer.material = diffuse_Material;
        print("2");
        Debug.Log(gameObject.renderer.material.name);
    }

我的代码会更改一次材料,但是当我再次按空格键时不再更改。

更新

我从更新方法中取出了代码并将其放在自己的代码中。我已经将它修改为“简单”的布尔检查。现在,当我玩游戏时,我的对象从我首先想要的材料开始,但是当我击中空间时,它只将材质改变了几分之一秒。

我怎么能这样做,按下一个按钮,我的布尔可以在真假之间切换。我以为我拥有它,但我想我没有。我的调试日志现在看起来像这样:

  

DepthMask(实例)

     

1

     

DepthMask(实例)

     

2

     

漫反射(实例)

     

差异(实例)

     

DepthMask(实例)

     

DepthMask(实例)

     

1

2 个答案:

答案 0 :(得分:0)

我认为问题如下:

当用户按下跳转键时,布尔值设置为true,材料会发生变化并且一切都很好。然后再次调用update方法,然后我也假设你的Switch方法。 Input.GetButtonDown("Jump")现在评估为false,导致您的布尔值扩散再次成为true,并且材料会更改。

每次用户按下“跳转”按钮时,材料是否应该切换?如果是这样,请将代码更改为(else语句可以完全删除):

void Switch()
{
    Debug.Log(gameObject.renderer.material.name);
    if(Input.GetButtonDown("Jump"))
    {
        diffuse = !diffuse;
        // material only needs to change if diffuse changed
        if(diffuse)
        { 
            gameObject.renderer.material = mask_Material;   
            print("1");
            Debug.Log(gameObject.renderer.material.name);
        }
        else
        {
            gameObject.renderer.material = diffuse_Material;
            print("2");
            Debug.Log(gameObject.renderer.material.name);
       }
    }
}

编辑:包括整个Switch方法。

答案 1 :(得分:0)

您可以尝试比较

renderer.sharedMaterial

而不是

renderer.material

获取材质的非实例版本。像这样:

public Material a;
public Material b;

void Update () 
{
    if (Input.GetButtonDown("Jump"))
    {
        if (renderer.sharedMaterial == a)
        {
            gameObject.renderer.material = b;
        }
        else
        {
            gameObject.renderer.material = a;
        }
    }
}