zoukankan      html  css  js  c++  java
  • [Unity3D]Unity3D游戏开发之Logo渐入渐出效果的实现

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei

    转载请注明出处,本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39801917

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

          各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址blog.csdn.net/qinyuanpei。在非常多游戏开场的时候,都会有一个Logo渐入渐出的效果,如图是国产单机游戏《仙剑奇侠传五》的Logo展示。Logo从营销的角度来说它是一种品牌的树立,能够添加用户对于一个品牌的认知感。而作为游戏来说,Logo的设计不仅能够添加游戏产品的艺术感,更能够通过Logo设计中所表达的寓意来暗示或者是映射游戏世界中的某些东西。比方《古剑奇谭一》通过Logo中的文字表达的是琴心剑魄今何在这种感慨,而相应到游戏其中即使主人公百里屠苏和太子长琴的转世欧阳少恭,由此可见Logo的设计对于一款产品来说是至关重要,由于Logo传达出的东西应该就是这款产品真正想要表达的东西吧。好了,关于Logo我们先讨论到这里,今天我们就来一起实现Unity3D中Logo渐入渐出效果吧。


          首先我们来讲述一下详细的原理吧,在Unity的GUI类中有一个Color类型的属性color,它表示的是全局的GUI染色,假设我们改变这个属性值,那么Unity场景中的背景和文本颜色都将发生改变。Color类型是典型的RGBA模式,即一个色彩值能够用Red、Green、Blue、Alpah这四个值来表示。通常情况下,这四个值是能够在0-255之间的不论什么一个数,这一点对于熟悉平面设计的朋友应该是非常熟悉的吧,而在Unity中,这四个值被限定在0-1之间,我们能够使用0-1之间的不论什么一个数来为它们赋值。这里我们重点要说的是Alpha,它是用来表示透明度的一个值,当该值为0时,表示全然透明,当该值为1时,表示全然不透明。在今天的这个实例中,我们就是通过对Alpah进行插值从而实现Logo的渐入渐出效果的。好了,以下我们来看代码:

    /*************************************************************/
    /* 本代码由SplashScreen改动而来,移除了源码中的LogoPositioning类型 */
    /* 此次改动添加了当mStatus是FadeWait时对用户的提示,以Debug形式实现 */
    
    
    
    using UnityEngine;
    using System.Collections;
    
    public class SplashScript : MonoBehaviour {
    
    	//要载入的关卡
    	public string LevelToLoad="";
    	//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;
    					Application.LoadLevel(LevelToLoad);
    				}
    			}
    
    			if(mAlpha<0.0F)
    			{
    				//假设须要在关卡载入完后渐出
    				if(Type==SplashType.FadeOutThenLoadLevel)
    				{
    					Application.LoadLevel(LevelToLoad);
    				}else
    				{
    					Destroy(mCamObj);
    					Destroy(this);
    				}
    			}
    		}
    
    		if(mStatus==FadeStatus.FadeWait)
    		{
    			Debug.Log("请按随意键继续");   
    		}
    	}
    
    	void OnLevelWasLoaded(int index)
    	{
    		//假设目标关卡已载入须要手动销毁场景中的GUI和AudioListener
    		if(LevelisLoaded)
    		{
    			Destroy(mCam.GetComponent<AudioListener>());
    			Destroy(mCam.GetComponent<GUILayer>());
    		}
    	}
    
    }
    
           代码中给出了详尽的凝视,假设大家有明确的地方能够给我留言,谢谢大家,今天的内容就是这样了(十一没有回家,但是不知道为什么,感觉写代码的时候总是心有余而力不足啊,呵呵)。对了,博主的Github已经开通了,博主会将自己写得比較好的项目放到上面和大家分享,希望大家有时间的话就去看看吧,我的Github主页地址是https://github.com/qinyuanpei

    最后大家一起来看看效果演示吧:



    每日箴言:所谓爱,就是陪伴,没太多别的。——韩寒




    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei

    转载请注明出处,本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39801917

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



  • 相关阅读:
    已知二叉树的前序遍历、中序遍历,求后序遍历
    排序算法
    应用层
    运输层
    mysql分页查询
    mysql 性能分析及explain用法
    数据库SQL优化
    MATLAB GUI设计(1)
    路径选择
    Python itchat库(1)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4173721.html
Copyright © 2011-2022 走看看