。在非常多遊戲開場的時候,都會有一個Logo漸入漸出的效果,如圖是國産單機遊戲《仙劍奇俠傳五》的Logo展示。Logo從營銷的角度來說它是一種品牌的樹立,能夠添加使用者對于一個品牌的認知感。而作為遊戲來說,Logo的設計不僅能夠添加遊戲産品的藝術感,更能夠通過Logo設計中所表達的寓意來暗示或者是映射遊戲世界中的某些東西。比方《古劍奇譚一》通過Logo中的文字表達的是琴心劍魄今何在這種感慨,而相應到遊戲其中即使主人公百裡屠蘇和太子長琴的轉世歐陽少恭,由此可見Logo的設計對于一款産品來說是至關重要,由于Logo傳達出的東西應該就是這款産品真正想要表達的東西吧。好了,關于Logo我們先讨論到這裡,今天我們就來一起實作Unity3D中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
最後大家一起來看看效果示範吧:
每日箴言:所謂愛,就是陪伴,沒太多别的。——韓寒