Unity_画面切り替え及び視点移動

2D脱出ゲーム

大体のゲームは一つの画面で進行しません。2Dゲーム用に数パターン画面切り替え処理を付けてみましょう。

画面切り替え

canvasの子にpanelその子に4枚のpanelを配置し更にその子に4枚の画像を用意して、別途用意したUI(参考)に左右の矢印ボタンを付けましょう。以下新規スクリプトを作成します。

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

public class GameManager : MonoBehaviour
{
    public bool nowMessage = false;//メッセージ中に他操作をさせない
    public GameObject panelWalls;//PanelFirstをアタッチ
    public int wallNo;
    public const int WALL_FRONT = 1;
    public const int WALL_RIGHT = 2;
    public const int WALL_BACK = 3;
    public const int WALL_LEFT = 4;
    void Start(){wallNo = WALL_FRONT;}
    public void DisplayWall()
    {
        switch (wallNo)
        {
            case WALL_FRONT:
                panelWalls.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
                break;
            case WALL_RIGHT:
                panelWalls.transform.localPosition = new Vector3(-1000.0f, 0.0f, 0.0f);
                break;
            case WALL_BACK:
                panelWalls.transform.localPosition = new Vector3(-2000.0f, 0.0f, 0.0f);
                break;
            case WALL_LEFT:
                panelWalls.transform.localPosition = new Vector3(-3000.0f, 0.0f, 0.0f);
                break;
        }
    }
    public void PushButtonRight()//右ボタンにアタッチ
    {
        if (!nowMessage)
        {
            wallNo++;
            if (wallNo > WALL_LEFT && wallNo < WALL_FRONTTWO)
            {
                wallNo = WALL_FRONT;
            }
            else if(wallNo > WALL_LEFTTWO)
            {
                wallNo = WALL_FRONTTWO;
            }
            DisplayWall();
        }     
    }
    public void PushButtonLeft()//左ボタンにアタッチ
    {
        if (!nowMessage)
        {
            wallNo--;
            if (wallNo < WALL_FRONT)
            {
                wallNo = WALL_LEFT;
            }
            else if (wallNo < WALL_FRONTTWO && wallNo > WALL_LEFT)
            {
                wallNo = WALL_LEFTTWO;
            }
            DisplayWall();
        }    
    }
}

PanelFirstの子panelにそれぞれ番号を割り振り、switch case構文で対応する子panelの位置情報をリンクさせたのがDisplayWallメソッドになります。PushButtonRight or Leftメソッドを左右矢印ボタンのonclickイベントにアタッチするとwallNoの増減に応じて画面が切り替わる処理の完成です。画面は4つしか用意していないのでそれぞれ4以上or1以下はカウントしない、もしくは振り出し番号に戻す処理も忘れずに。注意点として移動するのはuiでなくmain画面の方なのでscene上の位置情報とはプラスマイナス逆になります。

nowMessageフラグは他のイベント進行中状態を意図してますので、セリフ中は画面移動させないといった条件をつける事もできます。

視点移動

DOTweenを活用して視点移動に動きをつけてみましょう。以下のようにpanel間を埋めて左右ボタンのメソッドを変更します。DOTween導入手順はこちらを参照。

int Wcount;//変数追加
    public void PushButtonRight()
    {
        if (!nowMessage)
        {
            if(Wcount >= 3)
            {
                Wcount = 0;
                panelWalls.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
            }
            else
            {
                Wcount++;
                float pWallNow = panelWalls.transform.localPosition.x;
                panelWalls.transform.DOLocalMoveX((pWallNow - 720.0f), 0.4f);
            }
        }     
    }
    public void PushButtonLeft()
    {
        if (!nowMessage)
        {
            if (Wcount <= 0)
            {
                Wcount = 3;
                panelWalls.transform.localPosition = new Vector3(-2160.0f, 0.0f, 0.0f);
            }
            else
            {
                Wcount--;
                float pWallNow = panelWalls.transform.localPosition.x;
                panelWalls.transform.DOLocalMoveX((pWallNow + 720.0f), 0.4f);
            }
        }    
    }

先程の手順とは異なりDisplayWall()メソッドの使用はせず、pWallNowで移動前の位置を記憶→4画面分までは移動する処理に修正しました。以下game画面上での違いです。

移動しすぎ防止

DOTweenの移動は現在0.4f=0.4秒に設定しています。つまり0.4秒以内に左右の移動ボタンを2回押してしまうと移動しすぎてしまいます。これを防止するためGameManagerクラスに以下追加してみましょう。

public void PushButtonRight()
{
  if (!nowMessage)
     {
       StartCoroutine("await");//以下は変更なし
       ・・・・・・・・
     }
}
public void PushButtonLeft()
{
  if (!nowMessage)
     {
       StartCoroutine("await");//以下は変更なし
       ・・・・・・・・
     }
}
IEnumerator await()
{
    nowMessage = true;
    yield return new WaitForSeconds(0.5f);
    nowMessage = false;
}

awaitコルーチンを追加して待機時間を0.5秒にしています。

コメント

タイトルとURLをコピーしました