วิธีสร้างวัตถุในเกมที่มองไม่เห็นด้วยความโปร่งใส/กระจายด้วยอัลฟ่า 0 ถึงอัลฟ่า 255 ที่มองเห็นได้เมื่อเวลาผ่านไป

ขอให้เป็นวันดีทุกคน

ฉันกำลังสร้างเกมป้องกันหอคอยใน 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 alpha จากนั้นหลังจาก FaceTime สีก็กลายเป็น 255 คุณสามารถตรวจสอบรหัสของคุณและดูว่าเกิดอะไรขึ้น ฉันอยากให้หอคอยค่อยๆ มองเห็นได้ ไม่ใช่อย่างกะทันหัน ขอบคุณนะ! - person Tayab; 26.03.2016
comment
@Tayab คุณได้ตั้งค่า FadeTime ในตัวตรวจสอบแล้วหรือยัง? ตั้งค่าไว้ในตัวตรวจสอบเป็น 5 วินาที หรือคุณสามารถดำเนินการใน Start() เพื่อให้เท่ากับเวลาสร้างหอคอยของคุณ หากคุณไม่ได้ตั้งค่า มันจะข้าม for loop และตั้งค่า alpha เป็น 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