【问题标题】:Why does changing the scale of my object break its child's shader?为什么更改对象的比例会破坏其子着色器?
【发布时间】:2020-12-18 09:52:05
【问题描述】:

我有一个玩家游戏对象。每当我改变方向时,我都会翻转玩家的 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(); }
    }
}

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

不断将 Fade 从 1 更改为 0 会产生玩家消散的效果,最终在 0 处完全消失。这是中途的样子:

但是,当我使用上面的脚本翻转播放器时,着色器中断,播放器消失。此外,当我将 Fade 值从 1 更改为小于 0.1 时,播放器突然看起来发光了:

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

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

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

编辑 2:更改为无光照着色器并不能解决问题。

【问题讨论】:

    标签: c# unity3d shader


    【解决方案1】:

    所以我最近回到项目中,经过大约一个小时的测试,当我发现问题时,我真的很努力地面对自己。

    我用 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, transform.localScale.y, 1f);
    

    【讨论】:

    • 我遇到了同样的问题。非常感谢!请问为什么Vector2会破坏它而Vector3不会?
    • 如果将对象的localScale 设置为Vector2,它将默认localScale 的Z 值为0。这可能会导致各种问题,包括着色器错误。我不知道它的确切原因。使用 Vector3,您可以将 Z 值设置为您想要的任何值。我给出的第一个示例保留了原始 Z 值。第二个示例只是将其设置为 1。
    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 2019-11-30
    • 1970-01-01
    • 2014-09-10
    • 2012-03-27
    • 1970-01-01
    • 2019-10-27
    • 2015-04-15
    相关资源
    最近更新 更多