【Unity】透明度渐变

感情迁移 提交于 2020-01-15 19:46:06

写给美术大佬的脚本,还要继续改,github地址:TransEffect【github】

效果图如下:

Ver.1源码,针对3d Object:

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

public class TransEffect : MonoBehaviour
{

    public List<GoInfo> GoList;
    public float varifySpeed = 0.5f;
    public float aTime = 5f;//每个物体保持出现的时间
    public float dTime = 5f;

    private float minAlpha = 0.0f;
    private float maxAlpha = .9f;
    private float curAlpha = 1.0f;
    private float nextAlpha = 0.0f;
    private int i = 0;

    public void OnEnable()
    {
        LoadGo();
    }

    // Use this for initialization
    void Start()
    {
        //初始化全List隐形
        foreach (GoInfo go in GoList)
        {
                Color c = go.rend.material.color;
                c.a = 0;
                go.rend.material.color = c;
            
        }
    }

    // Update is called once per frame
    public void Update()
    {
        Trans();
    }


    void LoadGo()
    {
        GoList = new List<GoInfo>();
        GoList.Add(new GoInfo("Cylinder", 0, transform.Find("Cylinder").GetComponent<GameObject>(), transform.Find("Cylinder").GetComponent<MeshRenderer>()));
        GoList.Add(new GoInfo("Cube", 1, transform.Find("Cube").GetComponent<GameObject>(), transform.Find("Cube").GetComponent<MeshRenderer>()));
        GoList.Add(new GoInfo("Sphere", 2, transform.Find("Sphere").GetComponent<GameObject>(), transform.Find("Sphere").GetComponent<MeshRenderer>()));
        GoList.Add(new GoInfo("Capsule", 3, transform.Find("Capsule").GetComponent<GameObject>(), transform.Find("Capsule").GetComponent<MeshRenderer>()));
    }

private void Trans()
    {
        GoInfo go = GoList[i];
        GoInfo nextgo;
        Color c = go.rend.material.color;
        Color nextc = go.rend.material.color;

        if (i <= GoList.Count)
        {
            if (i == GoList.Count - 1)
            {
                nextgo = GoList[0];
            }
            else
            {
                nextgo = GoList[i + 1];
            }

            Debug.Log(nextAlpha);
            Debug.Log(curAlpha);

            if (Time.time < aTime)//当前物体保持显形
            {
                c.a = 1;
                go.rend.material.color = c;
            }
            else if (Time.time >= aTime)
            {
                curAlpha += Time.deltaTime * varifySpeed * (-1);//当前物体逐渐消失
                nextAlpha += Time.deltaTime * varifySpeed;//下一个物体逐渐现形

                if (curAlpha <= minAlpha)//当前物体渐变到不透明时
                {
                    c.a = 0;//设置当前obj保持透明
                    go.rend.material.color = c;
                    i++;
                    //设置数据为下一物体做准备
                    curAlpha = 1;
                    nextAlpha = 0;
                }

                else//当前物体逐渐透明,下一物体逐渐现形
                {
                    curAlpha = Mathf.Clamp(curAlpha, minAlpha, maxAlpha);
                    nextAlpha = Mathf.Clamp(nextAlpha, minAlpha, maxAlpha);
                    c.a = curAlpha;
                    nextc.a = nextAlpha;
                    go.rend.material.color = c;
                    nextgo.rend.material.color = nextc;

                }

                if (curAlpha >= maxAlpha)//下一物体完全显形
                {
                    Debug.Log(nextAlpha);
                    Debug.Log(curAlpha);
                    aTime = Time.time + dTime; //设置新一轮时间限制
                    Debug.Log(aTime);

                }
            }
        }
        else
        {
            i = 0;
        }
    }

}

[System.Serializable]
public class GoInfo
{
    public string ID;
    public int index;
    public MeshRenderer rend;
    public GameObject[] obj;
    public GameObject curObj;
    private Color co;

    public GoInfo(string id0, int index0, GameObject obj0, MeshRenderer rend0)
    {
        ID = id0;
        index = index0;
        curObj = obj0;
        rend = rend0;
        
    }

}
View Code

创建物体:

 

写完才发现是要用在UI Image上的...不过其实差别也不大,还略简单点。

Ver.2源码,针对UI Image:

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


public class TransEffect : MonoBehaviour
{
    public Transform lib;
    public List<GoInfo> GoList;
    public float varifySpeed = 0.5f;
    public float aTime = 5f;//每个物体保持出现的时间
    public float dTime = 5f;//第一张图片第一轮循环时出现时间

    private float minAlpha = 0.0f;
    private float maxAlpha = .9f;
    private float curAlpha = 1.0f;
    private float nextAlpha = 0.0f;
    private int i = 0;



    public void OnEnable()
    {
        LoadGo();
    }

    // Use this for initialization
    void Start()
    {
        //初始化全List隐形
        foreach (GoInfo go in GoList)
        {
                Color c = go.curImg.color;
                c.a = 0;
                go.curImg.color = c;
            
        }
    }

    // Update is called once per frame
    public void Update()
    {
        Trans();
    }


    void LoadGo()
    {
        //添加图片列表
        GoList = new List<GoInfo>();
        for (int i = 0; i < lib.childCount; i++) {
            GoList.Add(new GoInfo(lib.GetChild(i).name.ToString(),lib.transform.GetChild(i).GetComponent<Image>()));
        }
        Debug.Log(GoList.Count);
    }

private void Trans()
    {

        Debug.Log(i);
        GoInfo go;
        GoInfo nextgo;

        if (i >= GoList.Count - 1)
        {
            go = GoList[i];
            nextgo = GoList[0]; 
        }
        else
        {
            go = GoList[i];
            nextgo = GoList[i + 1];
        }


        Color c = go.curImg.color;
        Color nextc = go.curImg.color;

        if (Time.time < aTime)//当前物体保持显形
        {
            c.a = 1;
            go.curImg.color = c;
        }
        else if (Time.time >= aTime)
        {
            curAlpha += Time.deltaTime * varifySpeed * (-1);//当前物体逐渐消失
            nextAlpha += Time.deltaTime * varifySpeed;//下一个物体逐渐现形

            if (curAlpha <= minAlpha)//当前物体渐变到不透明时
            {
                c.a = 0;//设置当前obj保持透明
                go.curImg.color = c;

                if (i == GoList.Count - 1)
                    i = -1;
                i++;
                
                //设置数据为下一物体做准备
                curAlpha = 1;
                nextAlpha = 0;
            }

            else//当前物体逐渐透明,下一物体逐渐现形
            {
                curAlpha = Mathf.Clamp(curAlpha, minAlpha, maxAlpha);
                nextAlpha = Mathf.Clamp(nextAlpha, minAlpha, maxAlpha);
                c.a = curAlpha;
                nextc.a = nextAlpha;
                go.curImg.color = c;
                nextgo.curImg.color = nextc;

            }

            if (curAlpha >= maxAlpha)//下一物体完全显形
            {
                aTime = Time.time + dTime; //设置新一轮时间限制
            }
        }

    }

}

[System.Serializable]
public class GoInfo
{
    public string ID;
    public Image[] imgList;
    public Image curImg;

    private Color co;

    public GoInfo(string id0,Image img)
    {
        ID = id0;
        curImg = img;    
    }

}
View Code

直接把存放图片子物体的父物体拖到Lib变量中,再调整所需渐变速度和显示时间即可。

 设置如下:

 

 

 

【over】

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!