協程實現canvas影像隨機閃爍

born_in_youth發表於2019-03-19

              

如圖,閃爍截圖。程式碼如下,掛在canvas下的image上。

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

//獲得image列表,將列表索引打亂,然後順序的顯示圖片並閃爍(使用協程)
//
//類的方法transform.childCount
//transform.GetChild (i)獲得子物件
//strat函式可以使用協程,update不可以使用協程
public class MyRandomFlash : MonoBehaviour {
    private List<Image> imagelist =new List<Image> ();//注意是List<Image>型別的,而不是Image.
    private float flashtime = 1f;
    public float intervalTime = 0.5f;
    // Use this for initialization
    IEnumerator Start()
    {
        imagelist.Clear();
        //初始化imagelist列表
        int len = transform.childCount;
        for (int i = 0; i < len; i++)
        {
            //imagelist[i] = transform.GetChild (i).GetComponent <Image>() ;//這裡也可以使用列表的add方法
            imagelist.Add(transform.GetChild(i).GetComponent<Image>());
        }
        List<int> myindex = GetRandomIndexs(imagelist.Count);
        for (int i = 0; i < imagelist.Count; i++)
        {
            Image myimage = imagelist[myindex[i]];
            StartCoroutine(Flash(myimage));
            yield return new WaitForSeconds(Random.Range(0, intervalTime));
        }
    }
	// Update is called once per frame
    //strat中的變數不能在update中使用
	
	

    //協程實現圖片閃爍
    IEnumerator Flash(Image image) {
        for (float f=1f;f>0;f=f-Time .deltaTime/flashtime/2 ) {
            Color c = image.color;
            c.a = f;
            image.color = c;
            yield return 0;
        }
        for (float f = 0f; f <1; f = f + Time.deltaTime / flashtime / 2)
        {
            Color c = image.color;
            c.a = f;
            image.color = c;
            yield return 0;
        }
        yield return 0.2f;
    }

    //獲得隨機的索引
    List<int> GetRandomIndexs(int count)
    {
        List<int> result = new List<int>();//儲存最終的索引
        List<int> list = new List<int>();//輔助實現不重複
        for (int i = 0; i < count; i++)
        {
            list.Add(i);
        }
        while (list.Count > 0)
        {
            int index = Random.Range(0, list.Count);
            Debug.Log(index);
            result.Add(list[index]);
            list.Remove(list[index]);
        }
        return result;
    }
}

 

相關文章