天天看點

[Unity3D]Unity3D遊戲開發之Logo漸入漸出效果的實作

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

[Unity3D]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​​

最後大家一起來看看效果示範吧:

[Unity3D]Unity3D遊戲開發之Logo漸入漸出效果的實作

每日箴言:所謂愛,就是陪伴,沒太多别的。——韓寒

繼續閱讀