代码改变世界

Unity 启动画面淡入淡出

2015-05-24 14:35  wuzhang  阅读(9196)  评论(0编辑  收藏  举报

  前几天在玩我叫MT 2游戏的时候发现打开他们应用的时候发现他们Logo淡入淡出的效果做的挺好的,例如第一张是运营商腾讯的logo第二张是他们公司的游戏logo。我们也来模仿一下:

第一张图片:运营商的

这是第二张图片,游戏公司自己的。

1,新建测试工程。

  

 

脚本文件SplashScreen.cs

  

using UnityEngine;
using System.Collections;

public class SplashScreen : MonoBehaviour {
    
    //要加载的关卡
    public string LevelToLoad="DiveUnityDemo";
    //Logo贴图
    public Texture2D SplashLogo;
    //渐入渐出速度
    public float FadeSpeed=0.3F;
    //等待时间
    public float WaitTime=0.5F;
    
    #region 渐入渐出的类型
    public enum SplashType
    {
        LoadLevelThenFadeOut,
        FadeOutThenLoadLevel
    }
    public SplashType Type=SplashType.LoadLevelThenFadeOut;
    #endregion
    
    #region 渐入渐出的状态
    public enum FadeStatus
    {
        FadeIn,
        FadeWait,
        FadeOut
    }
    private FadeStatus mStatus=FadeStatus.FadeIn;
    #endregion
    
    //是否允许玩家触发渐入渐出事件
    public bool WaitForInput=true;
    //当前透明度
    private float mAlpha=0.0F;
    //摄像机
    private Camera mCam;
    private GameObject mCamObj;
    //Logo贴图位置
    private Rect mSplashLogoPos;
    //渐入结束的时间
    private float mFadeInFinishedTime;
    //关卡是否加载完毕
    private bool LevelisLoaded=false;
    
    void Start () 
    {
        //保存相机
        mCam=Camera.main;
        mCamObj=Camera.main.gameObject;
        //计算Logo绘制的位置
        mSplashLogoPos.x=(Screen.width * 0.5F-SplashLogo.width * 0.5F);
        mSplashLogoPos.y=(Screen.height * 0.5F-SplashLogo.height * 0.5F);
        mSplashLogoPos.width=SplashLogo.width;
        mSplashLogoPos.height=SplashLogo.height;
        //如果是渐出后加载关卡则保留相机
        if (Type == SplashType.LoadLevelThenFadeOut)
        {
            DontDestroyOnLoad(this);
            DontDestroyOnLoad(Camera.main);
        }
        //检查目标关卡是否为空
        if ((Application.levelCount <= 1) || (LevelToLoad == ""))
        {
            Debug.Log("There is not have the level to load please check again");
            return;
        }
    }
    
    void Update () 
    {
        switch(mStatus)
        {
        case FadeStatus.FadeIn:
            mAlpha+=FadeSpeed * Time.deltaTime;
            break;
        case FadeStatus.FadeOut:
            mAlpha-=FadeSpeed * Time.deltaTime;
            break;
        case FadeStatus.FadeWait:
            //当设定为FadeWait时可根据时间判定或者玩家触发进入下一个状态
            if((!WaitForInput && Time.time>mFadeInFinishedTime+WaitTime) || (WaitForInput && Input.anyKey))
            {
                mStatus=FadeStatus.FadeOut;
            }
            break;
        }
        
    }
    
    void OnGUI()
    {
        if(SplashLogo!=null)
        {
            //绘制Logo
            GUI.color=new Color(GUI.color.r,GUI.color.g,GUI.color.b,Mathf.Clamp(mAlpha,0,1));
            GUI.DrawTexture(mSplashLogoPos,SplashLogo);
            
            //状态判断
            if(mAlpha>1.0F)
            {
                mStatus=FadeStatus.FadeWait;
                mFadeInFinishedTime=Time.time;
                mAlpha=1.0F;
                //如果需要在渐入结束后加载关卡
                if(Type==SplashType.LoadLevelThenFadeOut)
                {
                    mCam.depth=-1000;

                }
            }
            
            if(mAlpha<0.0F)
            {
                //如果需要在关卡加载完后渐出
                if(Type==SplashType.FadeOutThenLoadLevel)
                {
                    Application.LoadLevel("sence2");
                }else
                {
                    Destroy(mCamObj);
                    Destroy(this);
                }
            }
        }
        
        if(mStatus==FadeStatus.FadeWait)
        {
            mStatus = FadeStatus.FadeOut;
            StartCoroutine("loadSence2");
            //Debug.Log("请按任意键继续");   
        }
    }

    public IEnumerator loadSence2()
    {
        yield return new WaitForSeconds(2f);
        Application.LoadLevel("sence2");

    }
    void OnLevelWasLoaded(int index)
    {
        //如果目标关卡已加载需要手动销毁场景中的GUI和AudioListener
        if(LevelisLoaded)
        {
            Destroy(mCam.GetComponent<AudioListener>());
            Destroy(mCam.GetComponent<GUILayer>());
        }
    }
    
}

将脚本挂到MainCamera上,添加图片即可!

运行效果:

源代码github连接:https://github.com/wuzhangwuzhang/test/tree/master/testFade