Unityで脱出ゲームの作り方(4)「部屋の中を移動する・UIでカメラ回転編」
2015/08/02
第4回はカメラ回転のスクリプトを実際に書いていきます。
上の画像のようにぐるりと一周できるようになるところまで進みます。
カメラを回転しよう
カメラとイベントシステムを定義します。
これでカメラの向きや位置をプログラムで扱えるようになります。
イベントシステムはひとまず「いろんな物事を受け取るシステム」とでも覚えておきます。
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System; using System.Collections; public class GameSystem : MonoBehaviour { public GameObject mainCamera; //カメラの定義 public EventSystem eventsystem; //イベントシステム(いろんなことに使う)の定義 // Use this for initialization void Start () { eventsystem = GameObject.Find("EventSystem").GetComponent<EventSystem>(); } // Update is called once per frame void Update () { } }
試しに90度横を向いてみましょう。
カメラの名前をmainCameraにし、Rorationを全部0,0,0にあわせて、
↓こんなかんじにします。「試しに部屋全体を消す一行」は消しました。
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System; using System.Collections; public class GameSystem : MonoBehaviour { public GameObject mainCamera; //カメラの定義 public EventSystem eventsystem; //イベントシステム(いろんなことに使う)の定義 // Use this for initialization void Start () { eventsystem = GameObject.Find("EventSystem").GetComponent<EventSystem>(); GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); } // Update is called once per frame void Update () { } }
回転の方法はいくつかありますが、ここで一番わかり易いのはインスペクターと同じ値を入れられるQuaternion.Eulerでしょう。インスペクターのRotationで角度を変えながら向かせたい角度を見つけ、その値を入れます。
GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0);
ボタン(UI)を押してカメラを回転させる
ちょっとむずかしくなりますね!全体はこんなかんじです↓
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System; using System.Collections; public class GameSystem : MonoBehaviour { public GameObject mainCamera; //カメラの定義 public EventSystem eventsystem; //イベントシステム(いろんなことに使う)の定義 // Use this for initialization void Start () { eventsystem = GameObject.Find("EventSystem").GetComponent<EventSystem>(); // GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); } // Update is called once per frame void Update () { /*-------------- 画面クリック処理 --------------*/ if(Input.GetMouseButtonUp(0)){ //左クリック if(eventsystem.currentSelectedGameObject==null){// UI以外(3D)をさわった //3Dオブジェクトをクリックした時の処理 ここはまたあとで }else{ // UIをさわった switch(eventsystem.currentSelectedGameObject.name){ case "turnLBtn": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); break; } } } } }
void Updateの中に書いたプログラムは秒間目まぐるしい速さで何度も実行されます。ババババババーっと。Flashでいうenterframeですね。
↓Update関数に書いたこの行でマウスの左クリックをしたかどうかをずっと監視し続けてもらいます。
if(Input.GetMouseButtonUp(0)){ //左クリック
↓eventsystem.currentSelectedGameObjectでクリックしたUIを取得できます。あとで3Dをクリックした時の処理も書くつもりなので、if文で3DかUIかを分けておきます。(UIでない=3Dである)
if(eventsystem.currentSelectedGameObject==null){// UI以外(3D)をさわった
↓eventsystem.currentSelectedGameObjectにつけた名前がturnLBtn(=左ボタン)だったとき、さっきStart関数に書いた回転のスクリプトを持ってくれば左ボタンでカメラが回転するようになります。
カメラでぐるっと一周させる
これだと左回転ボタンを押しても西しか向けないので、最初を北として「北→西→南→東」の順でループするようにします。
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System; using System.Collections; public class GameSystem : MonoBehaviour { public GameObject mainCamera; //カメラの定義 public EventSystem eventsystem; //イベントシステム(いろんなことに使う)の定義 /*------------ 管理 ------------*/ public string standName; //現在の立ち位置 // Use this for initialization void Start () { standName = "centerN"; //現在の立ち位置 = 北向き eventsystem = GameObject.Find("EventSystem").GetComponent<EventSystem>(); } // Update is called once per frame void Update () { /*-------------- 画面クリック処理 --------------*/ if(Input.GetMouseButtonUp(0)){ //左クリック if(eventsystem.currentSelectedGameObject==null){// UI以外(3D)をさわった //3Dオブジェクトをクリックした時の処理 ここはまたあとで }else{ // UIをさわった switch(eventsystem.currentSelectedGameObject.name){ case "turnLBtn": turnL(); break; } } } } public void turnL () { switch(standName){ case "centerN": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 270, 0); GameObject.Find("mainCamera").transform.position = new Vector3(-1, 7, -20); standName = "centerW"; break; case "centerW": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 180, 0); GameObject.Find("mainCamera").transform.position = new Vector3(-1, 7, -20); standName = "centerS"; break; case "centerS": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 90, 0); GameObject.Find("mainCamera").transform.position = new Vector3(-5, 7, -20); standName = "centerE"; break; case "centerE": GameObject.Find("mainCamera").transform.rotation = Quaternion.Euler(0, 0, 0); GameObject.Find("mainCamera").transform.position = new Vector3(-6, 7, -26); standName = "centerN"; break; } } }
上記のスクリプトを詳しく見て行きましょう
standNameという現在立っている場所を表す変数を作りまして、
/*------------ 管理 ------------*/ public string standName; //現在の立ち位置
ゲーム開始時にcenterN(=部屋中央、北向き)にします。
void Start () { standName = "centerN"; //現在の立ち位置 = 北向き
turnLというvoidを作り、左ボタンクリックしたらturnLが起こるようにします。
case "turnLBtn": turnL(); break;
さっきは回転するだけでしたが、今回は回転にあわせてカメラの位置(poisiton)も微妙に変えています。見せたいものをカメラにきれいに収めるためです。
カメラの座業移動には下記のnew Vector3を使います。小数は入れられませんが、インスペクターと同じ値を入れられるので便利です。
GameObject.Find("mainCamera").transform.position = new Vector3(-5, 7, -20);
これでカメラが一周するようになりました。
カメラを滑らかに回転させることもできるのですが、そのやり方はもうちょっとまってね!(第6回で扱います)
関連記事
-
Unityで脱出ゲームの作り方(3)「部屋の中を移動する・下準備編」
このパートでは脱出ゲーム定番の移動ボタンを追加します。 画面上に固定で表示するU …
-
Unityで脱出ゲームの作り方(6)「物体を滑らかにアニメーションで動かす」
第6回は物体のなめらかなアニメーション(トゥイーン)を実装します。 脱出ゲームに …
-
Unityで脱出ゲームの作り方(1)「3Dの部屋を作る」
Unityで脱出ゲーム講座 初回は3Dの部屋づくりからはじめます。 このパートで …
-
Unityで脱出ゲームの作り方(7)「アイテムリストを作る」
前回まででスイッチを押すとカギが降ってくるようにしました。 ここで落ちてきたカギ …
-
Unityで脱出ゲームの作り方(8)「アイテムを選択(装備)する」
アイテムリストクリックでアイテムを装備する アイテムリストのカギをクリックしたら …
-
Unityで脱出ゲームの作り方(2)「UnityにSketchupの3Dの部屋をインポート」
第2回からはUnityという今話題のゲーム作成ソフトを使っていきます。 とても高 …
-
Unityで脱出ゲームの作り方(5)「3Dオブジェクトをクリックで取得」
これまでのパートでUIボタンのクリックはできました。 このパートでは上の画像の、 …
Comment
コード部分の
スクロールができないです
Win10のIEでもクロームでもダメでした
普通にブログにテキストで貼るか
コメント欄に書いていただけませんか?
こんにちは
脱出ゲームの作り方を参考にさせてもらっている者です。
とても分かりやすく、ありがたいサイトなのですが、コードの右側が見れないために使うスクロールバーがうまく使えず、一部コードがわかりません。。。
これは私側の不具合なのでしょうか?
もし管理者様の不具合であれば、改善していただけると本当に助かります。
よろしくお願いいたします。