スポンサーリンク

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

image image

image

Hierarchyビューで、Doorを選択した状態で、InspectorビューのLayerを、clickableに変更
Add Component > Physics > Box Collider
Inspectorビューで、適宜値を調整して、BoxCollider(判定領域)をだいたいドアと一致するように設定する。

image image

image

(2)ClearSceneの作成

TitleSceneを別名で保存して、ClearSceneという名前で保存。

image image

File > Build Settings… で、ClearSceneを、図のようにドラッグ&ドロップ

image image

image

実行すると、なぜか、TitleシーンからGame1シーンに移動すると、すごく暗くなってしまう。理由は不明。

(3)とりあえずandroid用にbuildする。

File > Build Settings…  > で Build をクリック。 Escape001.apk という名前で保存。

image

わりと時間はかかる。21MBであった。

image

自分の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

image image

TitleManager.cs

image

File > Build Settings…で、Player Settingsをクリックしたのち、Inspectorビューで、Versionを1.1に変更してから、Buildを実行。

image image

arrows M03(720×1280)で確認。

Screenmemo_share_2017-01-04-07-40-37

(5)しかし、arrows Tab F-02F(2560×1600)で表示すると、UIがすごく変な感じ

Screenshot_2017-01-04-09-02-49

(参考)
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
としておく。

image image

File > Build Settings…で、Player Settingsをクリックしたのち、Inspectorビューで、Versionを1.2にしてBuild
自分のAndroid端末にメールして、再度インストールすると、arrows Tab F-02F(2560×1600)でも、なんとかうまく表示された。

Screenshot_2017-01-04-09-20-29

Titleシーンも変更しておく

image image

ClearSceneも同様に変更。

image

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

スポンサーリンク

Unity

Posted by twosquirrel