シーン切り替え確認
room2では2Dの落とし球ゲームを作成したいと思います。まずメインカメラと新規canvasをリンクさせますがroom1から移動してきたSingletonオブジェクト位置は(0, 0, 0)近辺で被ってしまう可能性があるので(100, 0, 0)にしておきましょう。canvasの子オブジェクトとして黒色背景を設置し、その上にタイトル(その15でroom1側に配置した画像と同じ)画面を設置しプレイ画面に切り替わるようにします。
プレイ画面は白地に・丸と四角のimageオブジェクト(画像は各自作成)を複数・枠外にGO・RETRY・BACKボタンをそれぞれ配置します。今回深くは掘り下げませんがGameウィンドウのアスペクト比によりcanvasサイズが変わってきますので、白地とタイトル画面の縦横サイズを上手く調整しましょう。
右下画像がそのプレイ画面になります。紫の球を落としてグレーの楕円中に収める事が出来ればクリア。出来なければ失敗→リトライというゲーム内容にしていきますが、今回は起動とroom1とのシーン行き来のテストだけになります。以下新たなスクリプトを作成してcanvasに設定しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class BallManager : MonoBehaviour
{
public GameObject title;//room1側に配置したアーケードゲームのディスプレイ
public GameObject goButton;
public GameObject backButton;
public GameObject retryButton;
void Start()
{
Invoke("Title", 2);
}
void Title()
{
title.SetActive(false);
goButton.SetActive(true);
backButton.SetActive(true);
}
public void PushBackButton()
{
SceneManager.LoadScene("room1");
}
}
Invoke(“メソッド名”, 秒数) でコルーチンのように遅延処理が行えます。Startメソッドで指定してますのでシーン移動2秒後にプレイ画面に切り替わります。LoadSceneは前回の復習ですね。BACKボタンのイベントに指定しましょう。
ItemSlotの保持
プレイデモを確認しているとシーン移動でアイテムスロットが付いてきていない事に気づきました。アイテムスロットはcanvasの子となっていてそのままSingletonの子オブジェクトにすればいい訳ではないので、room1のArcadeGameクラス内ArcadeGameClickメソッドとItemManagerクラスにそれぞれ以下のように追加します。
public class ArcadeGame : MonoBehaviour
{
public void ArcadeGameClick()//その16からの追加分は赤マーカー
{
GameObject singletons = GameObject.Find("Singletons");
GameObject[] itemSlot = GameObject.FindGameObjectsWithTag("ItemSlot");
foreach (GameObject i in itemSlot)
{
i.transform.SetParent(singletons.transform);
}
SceneManager.LoadScene("room2");
}
}
using UnityEngine.SceneManagement;//追加
public class ItemManager : MonoBehaviour
{
void Start()
{
SceneManager.sceneLoaded += SceneLoaded;
}
void SceneLoaded(Scene nextScene, LoadSceneMode mode)//シーン移動時の処理
{//現在のシーン名がroom1の時
if(SceneManager.GetActiveScene().name == "room1")
{
GameObject playerPanel = GameObject.Find("PlayerPanel");
GameObject[] itemSlot = GameObject.FindGameObjectsWithTag("ItemSlot");
foreach (GameObject i in itemSlot)
{
i.transform.SetParent(playerPanel.transform);
i.transform.rotation = Quaternion.Euler(0.0f, 0.0f, 0.0f);//角度修正
i.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);//ローカル座標修正_xyはgrid
i.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);//大きさ修正
}
}
}
}
room1からroom2に移動する時PlayerPanelからsingletonsにItemSlot(入手アイテム数に応じる)を移し替え、戻って来た時はsingletonsからPlayerPanelに移し戻す処理を行なっています。戻って来た時の処理にはsceneLoaded:移動検知→GetActiveScene().name :現在のシーン名 というSceneManagementの機能を活用しています。あとは戻ってきた時なぜかサイズや傾きがずれていたので各修正も行いました。以下デモ。
コメント