C# 在两种材质之间切换

C# 在两种材质之间切换,c#,unity3d,C#,Unity3d,当我在项目中按下空格键时,我想切换两个纹理。但当我这么做的时候,什么都没有发生 有人能看出我的逻辑有什么问题吗?我在两个着色器之间切换,但不是材质,它不工作。我对此感到非常困惑 void Switch() { Debug.Log(gameObject.renderer.material.name); if(Input.GetButtonDown("Jump")) { diffuse = false; //if(game

当我在项目中按下空格键时,我想切换两个纹理。但当我这么做的时候,什么都没有发生

有人能看出我的逻辑有什么问题吗?我在两个着色器之间切换,但不是材质,它不工作。我对此感到非常困惑

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);
    }
我的代码会更改材质一次,但当我再次按空格键时,不会再次更改

更新

我已经从update方法中取出了代码,并将其放在自己的方法中。后来我把它改成了一个简单的布尔检查。现在,当我玩游戏时,我的物体以我第一次想要的材料开始,但当我击中空间时,它只在几分之一秒内改变了材料

我怎样才能做到,只要按下一个按钮,我的布尔值就会在真与假之间切换。我以为我有,但我想我没有。我的调试日志现在如下所示:

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;
        }
    }
}
深度任务实例

一,

深度任务实例

二,

漫反射实例

扩散实例

深度任务实例

深度任务实例

一,


我认为问题在于:

当用户按下跳转键时,布尔值被设置为true,材质发生变化,一切正常。但是更新方法再次被调用,然后我假设你的Switch方法也被调用。 Input.GetButtonDownJump现在将计算为false,导致布尔值diffuse再次变为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);
       }
    }
}

编辑:包括整个切换方法。

您可以尝试进行比较

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;
        }
    }
}

这只是一个猜测,因为我不知道Unity,所以我不打算将其作为答案发布,但尝试添加diffuse=false;在if语句中,该变量仅设置漫反射纹理匹配的颜色变量。还有,哪个if语句?现在,我的打印值1也没有打印出来,我在想你说的打印1;是的,因为它看起来像被设置为真,但再也不会设置为假。但如果它从未打印出1,那么它将是另一个东西。正如我所说,这只是一个猜测:谢谢,伙计,我修改了代码来尝试SimpleInput。GetButtonDownJump每次点击只触发一次。它将在一帧内切换对象材质,因此您无法用眼睛看到更改漫反射“将始终为真。renderer.sharedMaterial和renderer.material的比较与本文无关!