2017-02-19 19 views
0

У меня есть холст для пользовательского интерфейса, с изображением того же размера холста. Изображение имеет rgba из 0,0,0,0, что делает его невидимым (потому что a - 0). Я хочу, чтобы изображение затухало в черном от скрипта. Сценарий вызывается button в меню при нажатии. Вот код, я использую:CrossFadeAlpha не работает

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.UI; 

public class NavigationC : MonoBehaviour { 
    private bool Starting = false; 
    public Image screen; 
    float fadeTime = 3f; 

    void StartGame() 
    { 
     Starting = true; 
     StartCoroutine(wait()); 
     screen.CrossFadeAlpha(1f, fadeTime, true); 

    } 
} 

Изображение изображения в инспекторе: Picture of the image in inspector

Изменяя значения некоторых я могу заставить его работать, но это далеко от идеала, и это должно быть solveable вместо использования этого обходного пути. Вот видео: https://www.youtube.com/watch?v=3M-S0EHwwNk

По какой-то причине я могу заставить его работать, используя либо 255 или 255f. Я не хочу использовать такое обходное решение, но я оставил их в видео, чтобы показать мой желаемый результат (это исчезновение).

Изображение кнопки, которая вызывает функцию: enter image description here

+0

Когда люди спрашивают вас, чтобы обновить свой вопрос с кодом, вы должны _edit_ его, не задать новый вопрос. Кроме того, вопросы должны быть самодостаточными. Если видео содержит важную информацию, то это явно не так. Рекомендую прочитать [ask]. – dandan78

+0

Он попросил меня создать новый вопрос. Видео было также запросом. Информация все в самом вопросе, это просто визуализация. – RnRoger

+0

Я полностью понимаю после видео. Я попытаюсь воспроизвести это и дать вам знать. – Programmer

ответ

1

Я могу подтвердить, что это с CrossFadeAlpha. Обходным путем является получение текущего цвета, установите Color.a на 1, а затем установите его на 0 с CrossFadeAlpha(0f, 0f, true);. После этого вы можете вызвать функцию screen.CrossFadeAlpha(1, fadeTime, false); .

Вы не увидите эффект установки Color.a в 1, потому что вы настраиваете его обратно 0 с screen.CrossFadeAlpha(0f, 0f, true); в -же кадра.

Это правильный обходной путь и исправить эту проблему:

Color fixedColor = screen.color; 
fixedColor.a = 1; 
screen.color = fixedColor; 
screen.CrossFadeAlpha(0f, 0f, true); 

screen.CrossFadeAlpha(1, fadeTime, false); 

Вы также можете сделать это метод расширения, так что он может быть использован в любом месте в проекте и на любой компонент пользовательского интерфейса :

public static class ExtensionMethod 
{ 
    public static void CrossFadeAlphaFixed(this Graphic img, float alpha, float duration, bool ignoreTimeScale) 
    { 
     //Make the alpha 1 
     Color fixedColor = img.color; 
     fixedColor.a = 1; 
     img.color = fixedColor; 

     //Set the 0 to zero then duration to 0 
     img.CrossFadeAlpha(0f, 0f, true); 

     //Finally perform CrossFadeAlpha 
     img.CrossFadeAlpha(alpha, duration, ignoreTimeScale); 
    } 
} 

Использование:

private bool Starting = false; 
public Image screen; 
float fadeTime = 3f; 

public void StartGame() 
{ 
    Starting = true; 
    StartCoroutine(wait()); 
    screen.CrossFadeAlphaFixed(1, fadeTime, false); 
} 

Я заметил, что у вас есть StartCoroutine(wait()); в вашем коде. Похоже, вы просто хотите подождать до тех пор, пока не затухание не закончится, а затем сделайте что-нибудь (загрузите новую сцену). Я предлагаю вам запустить собственную функцию Fade, которая выполняет функцию обратного вызова с Action.

public void StartGame() 
{ 
    Starting = true; 

    CrossFadeAlphaWithCallBack(screen, 1f, fadeTime, delegate 
     { 
      Debug.Log("Done Fading"); 
      SceneManager.LoadScene(1); 
     }); 
} 

void CrossFadeAlphaWithCallBack(Image img, float alpha, float duration, System.Action action) 
{ 
    StartCoroutine(CrossFadeAlphaCOR(img, alpha, duration, action)); 
} 

IEnumerator CrossFadeAlphaCOR(Image img, float alpha, float duration, System.Action action) 
{ 
    Color currentColor = img.color; 

    Color visibleColor = img.color; 
    visibleColor.a = alpha; 


    float counter = 0; 

    while (counter < duration) 
    { 
     counter += Time.deltaTime; 
     img.color = Color.Lerp(currentColor, visibleColor, counter/duration); 
     yield return null; 
    } 

    //Done. Execute callback 
    action.Invoke(); 
} 

Опять же, вы можете сделать это метод расширения, так что он может быть использован в любом месте вашего проекта.

public static class ExtensionMethod 
{ 
    public static void CrossFadeAlphaWithCallBack(this Image img, float alpha, float duration, System.Action action) 
    { 
     MonoBehaviour mnbhvr = img.GetComponent<MonoBehaviour>(); 
     mnbhvr.StartCoroutine(CrossFadeAlphaCOR(img, alpha, duration, action)); 
    } 

    public static IEnumerator CrossFadeAlphaCOR(Image img, float alpha, float duration, System.Action action) 
    { 
     Color currentColor = img.color; 

     Color visibleColor = img.color; 
     visibleColor.a = alpha; 


     float counter = 0; 

     while (counter < duration) 
     { 
      counter += Time.deltaTime; 
      img.color = Color.Lerp(currentColor, visibleColor, counter/duration); 
      yield return null; 
     } 

     //Done. Execute callback 
     action.Invoke(); 
    } 
} 

Использование:

private bool Starting = false; 
public Image screen; 
float fadeTime = 3f; 

public void StartGame() 
{ 
    Starting = true; 

    screen.CrossFadeAlphaWithCallBack(1f, fadeTime, delegate 
    { 
     Debug.Log("Done Fading"); 
     SceneManager.LoadScene(1); 
    }); 
} 
+0

Хотя это все еще обходное решение, а не исправление неизвестной проблемы/ошибки, спасибо за вашу помощь. – RnRoger

+1

Да, это ошибка. Это лучше, чем использование 255 для его решения. Помните, что я сделал функции для этого без функции затухания Unity. Вы должны использовать их, особенно тот, с функцией обратного вызова, пока Unity не установит это. – Programmer

+0

Да, я сделаю. Спасибо за вашу помощь и терпение. – RnRoger