iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 27
0

(本篇文章網誌版:http://shineright.blogspot.tw/2016/12/day-27.html)

今天要把開始動畫放到遊戲裡,並讓玩家可以選擇自己要玩的角色。

我認為Unity並沒有為手機遊戲提供很好的影片播放系統。不同於桌機遊戲有內建的Movie Texture,若要用Unity在手機遊戲上播放影片,必須用手機上原始的播放方式。

開一個新的Scene,用以播放開始動畫。場景上只需放一個空的Game Object,加上以下的Script:

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class PlayMovieOnStartAndGoToScene : MonoBehaviour
{
    //影片結束後要到的Scene
    public int goToSceneAfterMovie;
    
    void Start()
    {
        StartCoroutine (AnimationCoroutine ());
    }
    
    IEnumerator AnimationCoroutine()
    {
        //呼叫裝置原始的全螢幕播放方式
        Handheld.PlayFullScreenMovie ("Intro Animation.mov");

        //待影格結束
        yield return new WaitForEndOfFrame ();
        
        //進入Game Scene
        SceneManager.LoadScene (goToSceneAfterMovie);
    }
}

簡單來說,呼叫Handheld.PlayFullScreenMovie(string filename)可以讓Unity切換至手機內建的播放方式,播放名為filename的影片(影片必須放在特殊的資料夾,之後會詳述)。

切換至手機內建的播放方式後,遊戲會自動暫停,等待影片結束或玩家手動結束才繼續執行接下來的程式碼。但為何要yield return new WaitForEndOfFrame()呢?因為Unity只保證Handheld.PlayFullScreenMovie在該影格結束前切換至手機的影片播放器並暫停執行Unity遊戲,所以若不等待該影格結束,Unity可能在影片還沒開始前就先呼叫SceneManager.LoadScene(...),而跳到遊戲開始的場景了。

回到Unity Editor,在Project欄中的Assets資料夾中建立一個名為「StreamingAssets」的資料夾,把「Intro Animation.mov」(開始動畫)丟進去。這個資料夾一定要叫StreamingAssets,不然就無法成功呼叫Handheld.PlayFullScreenMovie(...)要開啟的檔案。簡而言之,Unity在建置(Build)遊戲時,通常會把所有Assets結合在一起。然而,Handheld.PlayFullScreenMovie(...)因為是用手機內建的播放程式,所以該影片檔必須與Unity的Project分離,放在手機內的檔案系統。Unity在Build的時候會把Assets/StreamingAssets資料夾內的檔案和遊戲分離,獨自存儲在手機內部的檔案系統。

開始動畫結束後,緊接著就是角色選單和簡單的教學。

我在Game Scene中新建了一個Canvas,並為它加上Pause On Canvas (Script) Component,使遊戲先不要開始。

並把選擇角色的按鈕和教學看板在Scene視窗排好:

http://ithelp.ithome.com.tw/upload/images/20161227/20103149faSkpxjqOt.png

接著把下段程式碼加到每個角色選擇的按鈕上。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class InstantiatePlayerOnClick : MonoBehaviour
{
    public GameObject playerPrefab;  //角色Prefab
    public Vector3 instantiatePos;   //產生角色的座標
    public GameObject currCanvas;    //角色選擇Canvas
    
    void Start()
    {
        GetComponent<Button> ().onClick.AddListener (() => {
            ClickEvent ();
        } );
        
    }
    
    void ClickEvent()
    {
		//產生角色
        Instantiate (playerPrefab, instantiatePos, Quaternion.identity);
		
		//刪除目前Canvas
        Destroy (currCanvas);
    }
}

把各角色都做成Prefab後,將它們拉到Player Prefab欄,指定好重生位置,並把角色選擇的Canvas拉到Curr Canvas欄,角色選單就完成了!

然而,還有一點東西需要修改。遊戲結束時,會顯示角色俯視大樓的圖案。這角色的圖案也須隨著角色的不同而有所變化。

在Character.cs新增一個charIndex,並為每個角色的Prefab指定不同的charIndex

接著,再建立一個新的Script,加在遊戲結束,俯看大樓的Image上:

public class ChangeImageByIndex : MonoBehaviour
{
    public Sprite[] charSprites;
    public void Start()
    {
        GetComponent<Image> ().sprite = charSprites[GameObject.FindObjectOfType<Character> ().charIndex];
    }
}

把所有角色俯看的圖拉到charSprites對應的欄位中,遊戲結束時就會顯示不同的角色了。

http://ithelp.ithome.com.tw/upload/images/20161227/201031496tnBPYVoGk.png

待續。


上一篇
Day 26: 觸控、Camera Aspect Ratio
下一篇
Day 28: 排行榜
系列文
我要和天一樣高!!!(Unity 2D手機小遊戲開發日誌)30

尚未有邦友留言

立即登入留言