Как сделать невидимый игровой объект прозрачным/рассеянным с альфой от 0 до видимой альфы 255 с течением времени

Добрый день всем.

Я делаю игру в жанре Tower Defense в Unity3D и пытаюсь создать анимацию построения башни.

Итак, в основном, для целей тестирования у меня есть примитивный куб с материалом с прозрачным/рассеянным устаревшим шейдером, и я установил альфу его цвета на 0, так как башня должна быть полностью невидимой при создании. К нему прикреплен сценарий Tower для анимации. У меня есть другой скрипт, который занимается размещением куба башни.

Как сделать башню полностью видимой с альфа-каналом 255 цвета ее материала, когда она создается в течение определенного периода времени?

Таким образом, если время постройки башни составляет 5 секунд, альфа должна стать от 0 до 255 за 5 секунд.

Я пробовал следующее (Tower.cs):

public float buildTime = 10;

private MeshRenderer mr;;
private Color currentColor;
private bool built = false;

void Start() {
    mr = GetComponent<MeshRenderer>()
    currentColor = mr.material.color;
    StartCorroutine(BuildAnimation());
}

IEnumerator BuildAnimation() {
    float a = 0;
    Color newColor = new Color(currentColor.r, currentColor.g, currentColor.b, a);
    while (!built) {
        mr.material.color = newColor;
        if (a >= 255) {
            built = true;
        }
        a+= 255 / buildTime;
        yield return new WaitForSeconds(255 / buildTime);
    }
}

Помощь будет действительно оценена, спасибо заранее!


person Tayab    schedule 25.03.2016    source источник


Ответы (2)


[Tooltip("Time to fade in seconds")]
public float FadeTime;
private float _alpha = 0.0f;
private const float _startAlpha = 0f;
private const float _endAlpha = 1.0f;

IEnumerator Fade(MeshRenderer myMesh)
{
    for (float t = 0f; t < FadeTime; t += Time.deltaTime)
    {
        float normalizedTime = t / FadeTime;

        _alpha = Mathf.Lerp(_startAlpha, _endAlpha, normalizedTime);

        yield return null;
    }
    _alpha = _endAlpha; 
    myMesh.material.color = new Color(myMesh.material.color.r,myMesh.material.color.g,myMesh.material.color.b,_alpha)
}

Затем пропустите вашу сетку через Fade().

person Martin Dawson    schedule 25.03.2016
comment
Работал, но не правильно. Цвет начинается с 0 альфы, затем после FaceTime он внезапно становится 255. Можете ли вы проверить свой код и посмотреть, что с ним не так? Я хочу, чтобы башня медленно становилась видимой, а не так внезапно. Спасибо, в любом случае! - person Tayab; 26.03.2016
comment
@Tayab Вы установили FadeTime в инспекторе? Либо установите его в инспекторе на 5 секунд, либо вы можете сделать это в Start(), чтобы сравняться со временем постройки вашей башни. Если вы не установите его, то он пропускает цикл for и устанавливает альфу в endalpha. - person Martin Dawson; 26.03.2016
comment
Да, я пытался установить FadeTime на 5 секунд и в другое время, но результат тот же, альфа-канал внезапно становится от 0 до 255 после FadeTime. - person Tayab; 26.03.2016

Спасибо @Martin Mazza Dawson за ответ. Хотя сначала он не работал должным образом, я заработал с помощью простого исправления.

IEnumerator Fade(MeshRenderer myMesh)
{
    for (float t = 0f; t < FadeTime; t += Time.deltaTime)
    {
        float normalizedTime = t / FadeTime;

        _alpha = Mathf.Lerp(_startAlpha, _endAlpha, normalizedTime);
        // The fix
        myMesh.material.color = new Color (myMesh.material.color.r, myMesh.material.color.g, myMesh.material.color.b, _alpha);
        yield return null;
    }
    //_alpha = _endAlpha; 
    //myMesh.material.color = new Color (myMesh.material.color.r, myMesh.material.color.g, myMesh.material.color.b, _alpha);
}

Люблю вас :)

person Tayab    schedule 25.03.2016
comment
Да, мой плохой, это, очевидно, только установка альфы, пока время не истекло. - person Martin Dawson; 26.03.2016
comment
@MartinMazzaDawson Вот как выглядит игра с вашим кодом: giphy.com/gifs/test -unity3d-tower-defence-3osxYaCazTAorHa5sA - еще раз спасибо ‹3 - person Tayab; 26.03.2016