Coroutine работает неправильно: исчезает только один объект - PullRequest
0 голосов
/ 22 февраля 2019

Я только что обновил код.Кажется, есть проблема с wholeRenderer.materials [i] .color = Color.Lerp (wholeFadeInColors, wholeFadeOutColors, lerpFactor); .Ошибки, и я изо всех сил пытаюсь решить эту проблему.Что бы это могло быть?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class InteractionGO: MonoBehaviour
{
    Renderer cutawayRenderer;
    Renderer wholeRenderer;
    Color fadedInColor;
    Color fadedOutColor;
    private const float MIN_FADE = 0.0f;
    private const float MAX_FADE = 1.0f;

    private void Awake()
    {
        fadedInColor = new Color(1f, 1f, 1f, 100f);
        fadedOutColor = new Color(1f, 1f, 1f, 0f);
        wholeRenderer = wholeRenderer.GetComponent<Renderer>();
        cutawayRenderer = cutawayRenderer.GetComponent<Renderer>();
    }

    public void fade()
    {
      StartCoroutine(colorlerpin());
    }

    public IEnumerator colorlerpin()
    {
        // I recommend to setup everything before the loop once to improve perfromance
        // -> collect all full faded-in and faded-out color information

        List<Color> wholeFadeInColors = new List<Color>();
        List<Color> wholeFadeOutColors = new List<Color>();

        foreach (var mat in wholeRenderer.materials)
        {
            // add fadedin color
            wholeFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));

            // add faded out color
            wholeFadeOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
        }

        List<Color> cutawayFadeInColors = new List<Color>();
        List<Color> cutawayFadeOutColors = new List<Color>();

        foreach (var mat in wholeRenderer.materials)
        {
            // add fadedin color
            cutawayFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));

            // add faded out color
            cutawayFadeOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
        }

        float ElapsedTime2 = 0.0f;
        float TotalTime2 = 1f;

        while (ElapsedTime2 < TotalTime2)
        {
            var lerpFactor = ElapsedTime2 / TotalTime2;

            // Now apply before stored materials like
            for (int i = 0; i < wholeRenderer.materials.Length; i++)
            {
                wholeRenderer.materials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeOutColors, lerpFactor);
            }

            for (int i = 0; i < wholeRenderer.materials.Length; i++)
            {
                cutawayRenderer.materials[i].color = Color.Lerp(cutawayFadeOutColors, cutawayFadeInColors, lerpFactor);
            }

            ElapsedTime2 += Time.deltaTime;
            yield return null;
        }
    }
}

1 Ответ

0 голосов
/ 22 февраля 2019

Я рекомендую делать все дорогие вещи только один раз

Renderer cutawayRenderer;
Renderer wholeRenderer;
Color fadedInColor;
Color fadedOutColor;

private void Awake()
{
    fadedInColor = new Color(1f, 1f, 1f, 100f);
    fadedOutColor = new Color(1f, 1f, 1f, 0f);
    wholeRenderer = whole.GetComponent<Renderer>();
    cutawayRenderer = cutaway.GetComponent<Renderer>();
}

И использовать это снова.Кроме того, почему вы увеличиваете ElpasedTime2 в два раза?Ваша подпрограмма дает два результата, так что в одном кадре исчезает только первый объект, а один кадр - после другого ... скорее всего, вы скорее всего хотите, чтобы оба объекта одновременно исчезали

public IEnumerator colorlerpin()
{
    float ElapsedTime2 = 0.0f;
    float TotalTime2 = 1f;

    while (ElapsedTime2 < TotalTime2)
    {
        // you can store the current colors in order to apply them to multiple
        // materials or renderers as well
        // fading out color
        var fadeOutColor = Color.Lerp(fadedInColor, fadedOutColor, (ElapsedTime2 / TotalTime2));

        // fading in color
        var fadeInColor = Color.Lerp(fadedOutColor, fadedInColor, (ElapsedTime2 / TotalTime2));

        // Now apply those two colors wherever you want

        //  fades out main object
        wholeRenderer.material.color = fadeOutColor;

        //  fades in new oblect
        cutawayRenderer.material.color = fadeInColor;

        ElapsedTime2 += Time.deltaTime;
        yield return null;
    }
}

Однако я неНе понимаю, почему один из ваших объектов должен быть "проигнорирован", поскольку, как только вы сделаете material.color = xy, должен быть создан экземпляр материала.Так что, если не существует какого-либо другого сценария или, возможно, Animator, также изменяющего этот материал, все будет в порядке.


Обновление

Поскольку вы сказали, что хотитеПримените его к нескольким материалам. Я бы предпочел предварительно настроить все Color данные, а затем только делать необходимые рывки внутри цикла вместо использования new Color все время

private const float MIN_FADE = 0.0f;
private const float MAX_FADE = 1.0f;

public IEnumerator colorlerpin()
{
    // I recommend to setup everything before the loop once to improve perfromance
    // -> collect all full faded-in and faded-out color information
    List<Color> wholeFadeInColors = new List<Color>();
    List<Color> wholeFadeIOutColors = new List<Color>();
    foreach(var mat in wholeRenderer.materials)
    {
        // add fadedin color
        wholeFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));

        // add faded out color
        wholeFadeOUTColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
    }

    List<Color> cutawayFadeInColors = new List<Color>();
    List<Color> cutawayFadeIOutColors = new List<Color>();
    foreach(var mat in wholeRenderer.materials)
    {
        // add fadedin color
        cutawayFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));

        // add faded out color
        cutawayFadeIOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
    }

    float ElapsedTime2 = 0.0f;
    float TotalTime2 = 1f;

    while (ElapsedTime2 < TotalTime2)
    {
        var lerpFactor = ElapsedTime2 / TotalTime2;

        // Now apply before stored materials like
        var wholeMaterials = wholeRenderer.materials;

        for(int i = 0; i < wholeMaterials.Length; i++)
        {
            wholeMaterials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeIOutColors, lerpFactor);
        }
        wholeRenderer.materials = wholeMaterials;


        var cutawayMaterials = cutawayRenderer.materials;
        for(int i = 0; i < cutawayMaterials .Length; i++)
        {
            cutawayMaterials[i].color = Color.Lerp(cutawayFadeIOutColors, cutawayFadeInColors, lerpFactor );
        } 
        cutawayRenderer.materials = cutawayMaterials;

        ElapsedTime2 += Time.deltaTime;
        yield return null;
    }
}

Если вы всегда хотите толькоиспользуйте 1,1,1,1 и 1,1,1,0, а не конечно, вы можете полностью забыть о сборе цветов и просто прыгать между этими двумя цветами.

...