Я могу подтвердить, что это с 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);
});
}
Когда люди спрашивают вас, чтобы обновить свой вопрос с кодом, вы должны _edit_ его, не задать новый вопрос. Кроме того, вопросы должны быть самодостаточными. Если видео содержит важную информацию, то это явно не так. Рекомендую прочитать [ask]. – dandan78
Он попросил меня создать новый вопрос. Видео было также запросом. Информация все в самом вопросе, это просто визуализация. – RnRoger
Я полностью понимаю после видео. Я попытаюсь воспроизвести это и дать вам знать. – Programmer