Unityで3D脱出ゲーム(8)クリアシーンへの遷移
前回は、トンカチをゲットした状態でブタの貯金箱をクリックすると、中から鍵をゲットするスクリプトを作成した。
http://twosquirrel.mints.ne.jp/?p=13903
引き続き、以下の本とサイトを参考にしながら、進めていく。
閃光絵巻ラボ 「 Unityで脱出ゲームの作り方 」
http://senkouemaki.com/lab/?cat=2
<Unityの流れ>
(1)プロジェクトの作成
(2)オブジェクトの配置
(3)スクリプトの作成
(4)スクリプトのアタッチ
(環境)
Windows8.1
Unity5.5.0f3
VisualCode
SourceTree 1.9.10.0
Pageant
(1)ドアをクリックしたときにのスクリプトを作成
GameManager.cs
Hierarchyビューで、Doorを選択した状態で、InspectorビューのLayerを、clickableに変更
Add Component > Physics > Box Collider
Inspectorビューで、適宜値を調整して、BoxCollider(判定領域)をだいたいドアと一致するように設定する。
(2)ClearSceneの作成
TitleSceneを別名で保存して、ClearSceneという名前で保存。
File > Build Settings… で、ClearSceneを、図のようにドラッグ&ドロップ
実行すると、なぜか、TitleシーンからGame1シーンに移動すると、すごく暗くなってしまう。理由は不明。
(3)とりあえずandroid用にbuildする。
File > Build Settings… > で Build をクリック。 Escape001.apk という名前で保存。
わりと時間はかかる。21MBであった。
自分のAndroidにメールで送ってインストールして起動
P-02Eはうまくいかなかった。
arrows M03はなんとかうまくいった。
(4)いつものスマホ用スクリプト追加。
using UnityEngine; using System.Collections; public class GameDirector : MonoBehaviour { // Use this for initialization void Start () { Screen.fullScreen = false; } // Update is called once per frame void Update () { // プラットフォームがアンドロイドかチェック if (Application.platform == RuntimePlatform.Android) { // エスケープキーを取得 if (Input.GetKeyDown(KeyCode.Escape)) { // アプリケーション終了 Application.Quit(); return; } } } }
GameManager.cs
TitleManager.cs
File > Build Settings…で、Player Settingsをクリックしたのち、Inspectorビューで、Versionを1.1に変更してから、Buildを実行。
arrows M03(720×1280)で確認。
(5)しかし、arrows Tab F-02F(2560×1600)で表示すると、UIがすごく変な感じ
(参考)
http://dojican-lab.blogspot.jp/2015/08/unity.html
Hierarchyビューで、Canvasを選択した状態で、Inspectorビューで、Canvas Scaler(Script) > UI Scale Modeを、Constant Pixel Sizeから、Screen Space – Overlay に変更。
Canvas Scaler(Script)は、
UI Scale Mode: Scale With Screen Size
X: 800, Y:1280
Screen Match mode: Match Width Or Height
Match: 0
としておく。
File > Build Settings…で、Player Settingsをクリックしたのち、Inspectorビューで、Versionを1.2にしてBuild
自分のAndroid端末にメールして、再度インストールすると、arrows Tab F-02F(2560×1600)でも、なんとかうまく表示された。
Titleシーンも変更しておく
ClearSceneも同様に変更。
File > Build Settings…で、Player Settingsをクリックしたのち、Inspectorビューで、Versionを1.2にしてBuild
自分のAndroid端末にメールして、再度インストールすると、arrows Tab F-02F(2560×1600)でも、タイトルシーンやクリアシーンも、なんとかうまく表示された。
ここまでのスクリプト2つを、以下にコピペしておく。
TitleManager.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class TitleManager : MonoBehaviour { // Use this for initialization void Start() { Screen.fullScreen = false; } // Update is called once per frame void Update() { // プラットフォームがアンドロイドかチェック if (Application.platform == RuntimePlatform.Android) { // エスケープキーを取得 if (Input.GetKeyDown(KeyCode.Escape)) { // アプリケーション終了 Application.Quit(); return; } } } // Startボタンをクリックすると、Game1シーンへ遷移 public void PushStartButton () { SceneManager.LoadScene("Game1"); } }
GameManager.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { public GameObject mainCamera; // カメラの定義 public EventSystem eventsystem; // イベントシステム(いろんなことに使う)の定義 // クリックでRay(光線)を飛ばす public Ray ray; public Ray rayItem; public RaycastHit hit; public GameObject selectedGameObject; public string standName; // 現在の立ち位置 public GameObject buttonMessage; // ボタン:メッセージ public GameObject buttonMessageText; // メッセージテキスト public GameObject item_hammer3; public GameObject item_hammer4; public GameObject item_key1; public GameObject item_key2; public GameObject item_buta; private bool doesHaveHammer; private bool doesHaveKey; // Use this for initialization void Start () { Screen.fullScreen = false; //GameObject.Find("buta").SetActive(false); standName = "centerN"; // 現在の立ち位置 = 北向き doesHaveHammer = false; // トンカチは「持っていない」 doesHaveKey = false; // 鍵は「持っていない」 eventsystem = GameObject.Find("EventSystem").GetComponent<EventSystem>(); // GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); item_hammer3 = GameObject.Find("hammer3"); item_hammer3.SetActive(false); // トンカチを非表示 item_hammer4 = GameObject.Find("hammer4"); item_hammer4.SetActive(false); // トンカチを非表示 item_key1 = GameObject.Find("key1"); item_key1.SetActive(false); // 鍵を非表示 item_key2 = GameObject.Find("key2"); item_key2.SetActive(false); // 鍵を非表示 item_buta = GameObject.Find("buta"); // ブタの貯金箱を定義 } // Update is called once per frame void Update () { // プラットフォームがアンドロイドかチェック if (Application.platform == RuntimePlatform.Android) { // エスケープキーを取得 if (Input.GetKeyDown(KeyCode.Escape)) { // アプリケーション終了 Application.Quit(); return; } } /*------------ 画面クリック処理 -------------*/ if (Input.GetMouseButtonUp(0)) { // 左クリック if (eventsystem.currentSelectedGameObject == null) { // UI以外(3D)をさわった searchRoom(); // 3Dオブジェクトをクリックした時の処理 } else { // UIをさわった switch (eventsystem.currentSelectedGameObject.name) { case "ButtonLeft": // GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); turnL(); break; case "ButtonRight": turnR(); break; } } } } public void turnL() { switch (standName) { case "centerN": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 270, 0); standName = "centerW"; break; case "centerW": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 180, 0); standName = "centerS"; break; case "centerS": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); standName = "centerE"; break; case "centerE": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 0, 0); standName = "centerN"; break; } } public void turnR() { switch (standName) { case "centerN": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); standName = "centerE"; break; case "centerE": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 180, 0); standName = "centerS"; break; case "centerS": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 270, 0); standName = "centerW"; break; case "centerW": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 0, 0); standName = "centerN"; break; } } public void searchRoom() { selectedGameObject = null; ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, 10000000, 1 << 8)) { selectedGameObject = hit.collider.gameObject; switch (selectedGameObject.name) { case "memo": Debug.Log("メモ帳を押した"); DisplayMessage("エッフェル塔と書いてある。"); break; case "buttons": Debug.Log("金庫のbuttonsを押した"); DisplayMessage("金庫の中のトンカチをゲットした!"); item_hammer3.SetActive(true); item_hammer4.SetActive(true); doesHaveHammer = true; break; case "buta": Debug.Log("ブタを押した"); PushButtonPig(); break; case "Door": Debug.Log("ドアを押した"); PushButtonDoor(); break; } } } // メッセージをタップ public void PushButtonMessage() { buttonMessage.SetActive(false); // メッセージを消す } // メッセージを表示 void DisplayMessage(string mes) { buttonMessage.SetActive(true); buttonMessageText.GetComponent<Text>().text = mes; } // 貯金箱をタップ public void PushButtonPig() { // トンカチを持っているか? if (doesHaveHammer == false) { // トンカチを持っていない DisplayMessage("素手では割れない。"); } else { // トンカチを持っている DisplayMessage("貯金箱が割れて中から鍵が出てきた。"); item_buta.SetActive(false); // 貯金箱を消す item_key1.SetActive(true); // 鍵を表示 item_key2.SetActive(true); // 鍵を表示 doesHaveKey = true; } } // ドアをタップ public void PushButtonDoor(){ if (doesHaveKey == false) { // 鍵を持っていない DisplayMessage("鍵がかかっている。"); } else { // 鍵を持っている SceneManager.LoadScene("ClearScene"); } } }
(参考)上記ソースコードは、下記2つの本と、1つのサイトを非常に参考にしている。
閃光絵巻ラボ 「 Unityで脱出ゲームの作り方 」
http://senkouemaki.com/lab/?cat=2
ディスカッション
コメント一覧
まだ、コメントがありません