【问题标题】:How to play a material's shader in an image through c# ? (Unity 5.2.0f3)如何通过 c# 在图像中播放材质的着色器? (统一 5.2.0f3)
【发布时间】:2019-03-08 19:02:12
【问题描述】:

我想在 Unity 5.2.0f3 中为 2D 项目获得与 Seasons After Fall 相同的效果:https://i.stack.imgur.com/WCIhs.gif

预告片在这里,https://www.youtube.com/watch?v=cmAWybFKNh8

我正在尝试以这种方式在 Sprite Renderer 中播放由着色器组成的材质:

spriteRenderer = background.GetComponentInChildren<SpriteRenderer>();
spriteRendererMaterial = Instantiate(spriteRenderer.sharedMaterial);
spriteRendererMaterial.SetFloat("Slider_Dissolve", 1.5f);
spriteRenderer.material = spriteRendererMaterial;

然后我想在图像中应用相同的材​​料,但在我启动游戏时它不起作用,即使我可以在“项目视图”中看到正在更新的材料。

他们的论坛也讨论了这个问题,但请注意,与https://forum.unity.com/threads/trying-to-animate-an-image-component-material-shader.265023/ 相比,我的任何组件中都绝对没有遮罩@ 此处还讨论了该效果:Season Change Reveal Effect

我的解决方案不足,我们将不胜感激。

这里有一个我们认为会有所帮助的主题:https://forum.unity.com/threads/material-isnt-updating-when-using-setfloat.530548/ 不幸的是,没有...

下面是我想在点击按钮后执行的协程:

IEnumerator WaitForInteractiveElementTransform(Animator animator)
{
    if (animator != null)
    {
        while (animator.GetCurrentAnimatorStateInfo(0).length >
        animator.GetCurrentAnimatorStateInfo(0).normalizedTime)
    {
        yield return null;
    }
}
if (animatorBackground != null)
{
    animatorBackground.SetBool("On", true);
}
else
{
    P4.gameObject.SetActive(false);
    P4Fantasy.gameObject.SetActive(true);
}
state = SceneState.Unreal;
StartCoroutine(SetMaterialFloatOverTime(spriteRendererMaterial, 1.5f, "Slider_Dissolve"));

private IEnumerator SetMaterialFloatOverTime(Material material, float 
duration, string propertyName)
{
    float timer = 0;
    while (timer < duration)
    {
        material.SetFloat(propertyName, timer);
        spriteRenderer.material = material;
        timer += Time.deltaTime;
        yield return null;
    }
 }

协程 SetMaterialFloatOverTime 更新 weel Slider_Dissolve 属性,但每次该属性值更改时,场景上的图像都不会刷新。

有什么想法吗?

【问题讨论】:

    标签: c# unity3d shader


    【解决方案1】:

    在我看来,它确实像一个 Unity 错误。如果您将 Image 作为 UI 图像元素进行讨论,则还有另一种方法可以为它们提供单独的值,而无需创建单独的材质实例。如果我需要 UI 上的淡出效果,在着色器中我使用顶点颜色。当您更改 UI 元素的颜色时,Unity 将该颜色作为顶点颜色发送。所以虽然它们使用相同的材​​质,但 RGBA 值基本上可以用作 4 个滑块来实现各种效果。

    【讨论】:

    • 嗨!感谢你的回复。是的,我说的是 UI Image 元素。那么,你认为只有升级 Unity 版本才能解决这个问题吗?我会尝试并告诉你。
    • @gjamot 如果这是一个错误,那么它应该。顺便说一句,看看 Shader.SetGlobal... 函数。当您有一些与您正在谈论的类似的全局效果时,您通常希望使用相同的滑块来操作许多着色器和许多材质,SetGlobal 将帮助您,它对我有用。
    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 2020-08-28
    • 2019-03-01
    • 2015-02-16
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多