Как воспроизвести шейдер материала на изображении через c #?(Unity 5.2.0f3) - PullRequest
0 голосов
/ 03 октября 2018

Я бы хотел получить тот же эффект, что и в Seasons After Fall в Unity 5.2.0f3 для 2D-проекта: https://i.stack.imgur.com/WCIhs.gif

Вот трейлер, https://www.youtube.com/watch?v=cmAWybFKNh8

I 'я пытаюсь воспроизвести материал, состоящий из шейдера, в 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/ Эффект также обсуждался здесь: Эффект раскрытия сезонных изменений

У меня заканчиваются решения, любая помощь будет оценена.

Вот тема, которая, хотя и помогла бы: 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 обновляет свойство Slider_Dissolve weel, но изображение на сцене iне обновляется каждый раз при изменении значения этого свойства.

Есть идеи?

1 Ответ

0 голосов
/ 14 октября 2018

Для меня это похоже на ошибку Unity.Если вы говорите об изображении как об элементе изображения пользовательского интерфейса, есть еще один способ, которым вы могли бы предоставить им отдельные значения без создания отдельных экземпляров материала.Если мне нужен эффект затухания интерфейса, в шейдере я использую цвет вершин.Когда вы меняете цвет элемента пользовательского интерфейса, Unity отправляет этот цвет как цвет вершины.Таким образом, хотя они используют один и тот же материал, значения RGBA можно использовать в качестве 4 ползунков для различных эффектов.

...