为什么更改对象的比例会破坏其子着色器?

问题描述

我有一个玩家游戏对象。每当我改变方向时,我都会翻转玩家的x比例尺,因此当他面对右侧时为1,当面对左侧时为-1。

代码负责翻转播放器比例并水平移动播放器:

void FlipScale()
{
    facingRight = !facingRight;
    transform.localScale = new Vector2(transform.localScale.x * -1,transform.localScale.y);
}

void MoveHorizontally()
{
    if (wantsToMoveLeft && wantsToMoveRight) { return; }

    if (wantsToMoveRight)
    {
        rb.veLocity = new Vector2(runVeLocity,rb.veLocity.y);
        if (!facingRight) { FlipScale(); }
    }
    else if (wantsToMoveLeft)
    {
        rb.veLocity = new Vector2(-runVeLocity,rb.veLocity.y);
        if (facingRight) { FlipScale(); }
    }
}

播放器对象有一个子对象,该子对象具有使用此着色器材质的主sprite渲染器:

Dissolve Material

连续将Fade从1更改为0会产生玩家溶解的效果,最终在0时完全消失。这是中途的样子:

Player Dissolving

但是,当我使用上面的脚本翻转播放器时,着色器断开,播放器消失。此外,当我将“渐变”值从1更改为恰好小于0.1时,播放器突然看起来像是在发光:

Player Glowing

再次翻转精灵无法解决该问题。此外,仅当我通过代码进行操作时,通过检查器翻转精灵不会破坏着色器。我使用了本教程来创建此着色器:https://www.youtube.com/watch?v=WiDVoj5VQ4c。这是我当前的着色器图:

Dissolve Shader Graph

我刚刚开始使用着色器,因此如果问题非常明显,我深表歉意。我在堆栈溢出和其他网站上尝试了很多修复程序,但是到目前为止,仍然没有任何效果。如果我没有提供足够的信息,请询问。

编辑1:发现着色器断开时,只要“ Fade”值低于“ Edge”值,播放器就会开始发光。如果相同或更高,则播放器看起来正常,但溶解效果仍然不起作用。

编辑2:更改为未着色的着色器不能解决问题。

解决方法

所以我最近回到了该项目,经过大约一个小时的测试,当我发现问题时,我真的很难过。

我正在使用Vector2翻转秤!!! Vector2将z值默认设置为0。这就是为什么在检查器中将其翻转不会破坏任何内容的原因。

解决方案是像这样简单地使用Vector3:

transform.localScale = new Vector3(-transform.localScale.x,transform.localScale.y,tranform.localScale.z);

或:

transform.localScale = new Vector3(-transform.localScale.x,1f);