-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
喜欢我的博客请记住我的名字:秦元培,我的博客地址是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
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------