UNITY - Материал с затухающими объектами работает на вкладке Scene, а не на вкладке игры - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь заставить трехмерный объект исчезать.Я нашел скрипт, который работает (один из моих тоже работал), но у меня странное поведение.Фактически эффект затухания работает правильно на вкладке сцены, но не на вкладке игры, и, следовательно, когда игра идет, я получаю неправильный эффект.

Почему у меня такое странное поведение?Почему работает на одной вкладке, а не на другой?Похоже, что материал не обновляется во вкладке игры

Пример видео Linkto

Это мой код

using UnityEngine;
using System.Collections;

public class FadeObjectInOut : MonoBehaviour
{
    // publically editable speed
    public float fadeDelay = 0.0f; 
    public float fadeTime = 0.5f; 
    public bool fadeInOnStart = false; 
    public bool fadeOutOnStart = false;

    private bool logInitialFadeSequence = false; 

    // store colours
    private Color[] colors; 

    // allow automatic fading on the start of the scene
    IEnumerator Start ()
    {
        //yield return null; 
        yield return new WaitForSeconds (fadeDelay); 

        if (fadeInOnStart)
        {
            logInitialFadeSequence = true; 
            FadeIn (); 
        }

        if (fadeOutOnStart)
        {
            FadeOut (fadeTime); 
        }
    }

    // check the alpha value of most opaque object
    float MaxAlpha()
    {
        float maxAlpha = 0.0f; 
        Renderer[] rendererObjects = GetComponentsInChildren<Renderer>(); 
        foreach (Renderer item in rendererObjects)
        {
            maxAlpha = Mathf.Max (maxAlpha, item.material.color.a); 
        }
        return maxAlpha; 
    }

    // fade sequence
    IEnumerator FadeSequence (float fadingOutTime)
    {
        // log fading direction, then precalculate fading speed as a multiplier
        bool fadingOut = (fadingOutTime < 0.0f);
        float fadingOutSpeed = 1.0f / fadingOutTime; 

        // grab all child objects
        Renderer[] rendererObjects = GetComponentsInChildren<Renderer>(); 
        if (colors == null)
        {
            //create a cache of colors if necessary
            colors = new Color[rendererObjects.Length]; 

            // store the original colours for all child objects
            for (int i = 0; i < rendererObjects.Length; i++)
            {
                colors[i] = rendererObjects[i].material.color; 
            }
        }

        // make all objects visible
        for (int i = 0; i < rendererObjects.Length; i++)
        {
            rendererObjects[i].enabled = true;
        }


        // get current max alpha
        float alphaValue = MaxAlpha();  


        // This is a special case for objects that are set to fade in on start. 
        // it will treat them as alpha 0, despite them not being so. 
        if (logInitialFadeSequence && !fadingOut)
        {
            alphaValue = 0.0f; 
            logInitialFadeSequence = false; 
        }

        // iterate to change alpha value 
        while ( (alphaValue >= 0.0f && fadingOut) || (alphaValue <= 1.0f && !fadingOut)) 
        {
            alphaValue += Time.deltaTime * fadingOutSpeed; 

            for (int i = 0; i < rendererObjects.Length; i++)
            {
                Color newColor = (colors != null ? colors[i] : rendererObjects[i].material.color);
                newColor.a = Mathf.Min ( newColor.a, alphaValue ); 
                newColor.a = Mathf.Clamp (newColor.a, 0.0f, 1.0f);              
                rendererObjects[i].material.SetColor("_Color", newColor) ; 
            }

            yield return null; 
        }

        // turn objects off after fading out
        if (fadingOut)
        {
            for (int i = 0; i < rendererObjects.Length; i++)
            {
                rendererObjects[i].enabled = false; 
            }
        }

        Debug.Log ("fade sequence end : " + fadingOut); 
    }

    void FadeIn ()
    {
        FadeIn (fadeTime); 
    }

    void FadeOut ()
    {
        FadeOut (fadeTime);         
    }

    void FadeIn (float newFadeTime)
    {
        StopAllCoroutines(); 
        StartCoroutine("FadeSequence", newFadeTime); 
    }

    void FadeOut (float newFadeTime)
    {
        StopAllCoroutines(); 
        StartCoroutine("FadeSequence", -newFadeTime); 
    }

    // These are for testing only. 
    void Update()
    {
        if (Input.GetKeyDown (KeyCode.Alpha0) )
        {
            FadeIn();
        }
        if (Input.GetKeyDown (KeyCode.Alpha9) )
        {
            FadeOut(); 
        }
    }
}
...