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
ディスカッション
コメント一覧
まだ、コメントがありません