大体のゲームは一つの画面で進行しません。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秒にしています。
コメント