今回はカメラの特に「動き」の部分について見ていくことにします。
[基本] プログラムでの取得方法!
[基本] カメラをプログラムで操作しよう!
[応用] いろいろな動きを実現しよう!
まずはプログラムでのカメラ取得方法を学び、次に実際によくある挙動を実践ベースで見ていきましょう。
それではよろしくお願いします。
カメラとは?
Unityでのカメラオブジェクトとは、実際の「実行中の画面」として見える画面を撮影してくれる存在です。
つまり作品内で上手なカメラワークを行うには、このカメラオブジェクトの扱い方を極める必要があるわけです!
プログラムでの取得方法!
兎にも角にも、カメラを動かすにはプログラム上でカメラオブジェクトを取得できなければなりません。
ここでは、そのいくつかの取得手段を見ていきましょう。
変数に入れて取得!
例えばCameraManagerオブジェクトの「CameraManagerスクリプト」内でカメラが必要になった状況だったとします。
そしたら変数を用意してエディタ上で投げ入れましょう。
みなさんUnityをここまで触ってきた中で、一度はやったことがありますよね。
これが一番手っ取り早い手段です。
Camera.mainを使って取得!
次に説明するのは「Camera.main関数」です。
この関数は「MainCameraにタグ付けされている最初の有効なカメラを取得する関数」です。
Unityを起動した時最初に作られるカメラは、このタグがつけられています。
つまり初心者に大半の状況では、この関数を呼ぶだけでカメラを取得できます。
実験してみましょう。
次に記載するのは「Camera.main関数」でカメラを取得し、前へ移動し続けるだけの処理です。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraManager : MonoBehaviour { void Update () { // メインカメラを取得 Camera camera = Camera.main; // カメラを前に移動し続ける camera.gameObject.transform.Translate(new Vector3(0.0f,0.0f,1.0f)); } }
これだけでカメラオブジェクトをを取得出来るとは、非常に便利ですね!
検索して取得!
次は、オブジェクトの名前で取得する方法です。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraManager : MonoBehaviour { void Update () { // オブジェクトの名前で検索して取得 GameObject camera_object = GameObject.Find ("Main Camera"); } }
上記のプログラムでは、Main Cameraというオブジェクトを探して取得しています。
もしカメラの名前を変えている場合は、探す名前もちゃんと変更しましょう。
Find関数についてもっと知りたい場合は以下の記事にまとめてありますので、ぜひお読みください。
自在にオブジェクトを取得するにはFind関数は欠かせません。
どの取得方法が一番いいの?
どれも正しい方法です。
しかしカメラが一つしかない状況ならば「Camera.main」で取得するのが一番手っ取り早いでしょう。
しかしカメラを複数使ったりする場合は、検索や変数に入れて取得する方法などを検討すると良いでしょう。
今回は記載していませんが、タグなどで管理して取得するのも手だと思います。
いろいろな動きを実現しよう
ここから先は、非常に簡単に出来るカメラオブジェクトの操作方法について見てきましょう。
一番簡単にキャラクターを追随する方法
非常に簡単な方法で、様々なゲームや作品にを再現できる、カメラの操作方法があります。
それはキャラクターに子オブジェクトとしてカメラを持たせる方法です。
画像のようにキャラクターの子としてカメラを配置します。
座標的にはキャラクターの少し後ろに配置しましょう。
すると、移動や回転が親子関係の影響で追随されます。
ちゃんと後ろをついてきていますね!
プログラムを組まずとも、これだけで簡単なゲームに使うカメラの動きなら、実現できそうです。
今回はキャラクターの後ろに配置していますが「真上に置けば見下ろし型」「頭の位置に置けばFPS」のようなゲームが簡単に再現できますね!
シンプルかつ有用な手段です。
特定のオブジェクトを見続けるには?
見続けるだけならば「transform.LookAt関数」を利用するのが非常に簡単でオススメです。
transform.LookAt関数は引数に、注目したいオブジェクトのtransformを渡すことにより、そのオブジェクトを注視ししてくれます。
今回はカメラに紐付けた「CameraObjectスクリプト」を用意しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraObject : MonoBehaviour { public GameObject target = null; void Update () { // targetオブジェクトを注視する this.transform.LookAt (target.transform); } }
targetオブジェクトへは、注視したいオブジェクトを入れてあります。
結果を見てみましょう。
どうでしょう!
関数一つでオブジェクトを見続けることが可能になりましたね!
まとめ
今回は非常に簡単に出来る、カメラの動きだけ見てきました。
意外と簡単に有用なことが再現出来る事を知ってもらえたなら幸いです!
今回学んだ事を応用して、カメラワークを研究しましょう。