Cara membuat objek permainan tidak terlihat dengan transparan/menyebar dengan alpha 0 hingga alpha 255 terlihat seiring waktu

Selamat siang semuanya.

Saya membuat game menara pertahanan di Unity3D dan saya mencoba membuat animasi pembuatan menara.

Jadi pada dasarnya, untuk tujuan pengujian, saya memiliki kubus primitif dengan bahan dengan shader warisan transparan/difusi dan saya telah mengatur alfa warnanya ke 0 karena menara harus benar-benar tidak terlihat saat dibuat. Ini memiliki skrip Menara yang melekat padanya untuk animasi. Saya memiliki skrip lain yang berhubungan dengan penempatan menara kubus.

Bagaimana cara membuat menara terlihat sepenuhnya dengan alfa 255 warna materialnya ketika dibuat dalam jangka waktu tertentu?

Jadi jika waktu pembangunan menara adalah 5 detik, alfa akan menjadi 0 hingga 255 dalam 5 detik.

Saya sudah mencoba yang berikut (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);
    }
}

Bantuan akan sangat dihargai, terima kasih sebelumnya!


person Tayab    schedule 25.03.2016    source sumber


Jawaban (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)
}

Kemudian lewati Mesh Anda melalui Fade().

person Martin Dawson    schedule 25.03.2016
comment
Berfungsi tetapi tidak dengan benar. Warnanya dimulai dengan 0 alpha lalu setelah FaceTime tiba-tiba menjadi 255. Bisakah Anda memeriksa kode Anda dan melihat ada apa dengan kode itu? Saya ingin menara itu perlahan terlihat, tidak tiba-tiba. Terima kasih! - person Tayab; 26.03.2016
comment
@Tayab Sudahkah Anda menyetel FadeTime di inspektur? Setel di inspektur menjadi 5 detik, atau Anda dapat melakukannya dalam Start() agar sama dengan waktu pembangunan menara Anda. Jika Anda tidak menyetelnya, ia akan melewatkan perulangan for dan menyetel alpha ke endalpha. - person Martin Dawson; 26.03.2016
comment
Ya saya sudah mencoba mengatur FadeTime ke 5 detik dan beberapa waktu lainnya tetapi hasilnya sama, tiba-tiba alpha menjadi 0 hingga 255 setelah FadeTime. - person Tayab; 26.03.2016

Terima kasih @Martin Mazza Dawson atas jawabannya. Meskipun pada awalnya tidak berfungsi dengan baik, saya berhasil memperbaikinya dengan perbaikan sederhana.

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);
}

Aku mencintaimu :)

person Tayab    schedule 25.03.2016
comment
Ya ampun, ini jelas hanya mengatur alpha sampai waktunya habis. - person Martin Dawson; 26.03.2016
comment
@MartinMazzaDawson Berikut tampilan permainan dengan kode Anda: giphy.com/gifs/test -unity3d-tower-defence-3osxYaCazTAorHa5sA - terima kasih lagi ‹3 - person Tayab; 26.03.2016