最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

[Unity3D] Unity3D游戏开发之Logo渐入渐出效果的实现

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-11 17:28:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

在很多游戏开场的时候,都会有一个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的渐入渐出效果的。好了,下面我们来看代码:


[AppleScript] 纯文本查看 复制代码
/*************************************************************/
/* 本代码由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


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


楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-19 12:02

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表