Unityで新しいカメラを作り、Main Cameraと切り替えが出来るようにスクリプトを組んでいきたいと思います。
カメラを切り替える為には、現在使っているカメラを休止、切り替えるカメラを休止状態から稼働状態へと変更する必要があります。
複数のカメラを切り替える事が出来れば、ゲームの視点を切り替える事が出来るようになります。
今回作成する機能は
↑のようになります。
スクリプトを組む前にまずはカメラの休止状態と稼働状態を手作業で切り替えてみます。
何の事はないんですが、インスペクタ上のコンポーネントの名前の左にチェックボックスがあり、そのチェックを外すと休止状態になります。
コンポーネント毎にチェックを外して機能しないようにも出来ますし、シーンに配置したインスタンスのインスペクタの名前の左のチェックボックスを外した場合、インスタンス自身を存在しない状態(厳密には隠した状態)に出来ます。
これはゲーム開始前の設定として手動で機能のOn・Offをするだけなので、ゲーム中に機能のOn・Offをするにはスクリプトで行う必要があります。
カメラの切り替えをスクリプトで行う為の準備
前回メインカメラとは別にサブカメラを作成しました。
メインカメラは「masasi」君の頭の少し後ろからの視点になっているので、新しいカメラを作成し、「masasi」君からより遠くの視点にします。
↑の記事で作成したサブカメラとは別のカメラを作成し、メインカメラと他のカメラをスクリプトから切り替えが出来るようにします。
まずはMain Cameraより少し遠くからみるOther Cameraを作ります。
上のように名前をOther Cameraとしインスペクタ上のOther Cameraの左側のチェックを外してゲーム起動時には機能しないようにします。
また、カメラは「masasi」君をフォローして動くようにしパラメータを設定してMain Cameraより少し遠めに配置します。
次にMain CameraとOther Cameraを切り替えるスクリプトを取りつけるゲームオブジェクトを配置します。
カメラ自体にスクリプトを取りつけた場合、カメラを非アクティブにした時にスクリプトも機能しなくなる為、全体を管理するスクリプトは別のゲームオブジェクトに設定していきます(masasi君にスクリプトを取り付けても構いません)。
Create Emptyで空のオブジェクトを作り、名前を「Script」とします。
Scriptゲームオブジェクトのインスペクタ上からAdd ComponentでNew Script、名前を「ChangeCamera」とします。
カメラ切り替えスクリプトを実現する為にはどうすればいいのか?
まずは切り替えるカメラのゲームオブジェクトが必要なので、メインカメラと他のカメラを設定するフィールドを作成します。
1 2 3 4 5 6 | [SerializeField] private GameObject mainCamera; [SerializeField] private GameObject otherCamera; |
これでインスペクタでMain CameraとOther Cameraを設定出来るようになります。
カメラの切り替えは数字の1を押した時に行うようにします。
なのでUpdateメソッド内でキーボードの「1」が押されたかどうかの判定が必要になります。
キーの判定には
Input.GetKeyDown(“キー名”)
を使います。
オブジェクトのOn・Offは
ゲームオブジェクト.SetActive(true)でOn
ゲームオブジェクト.SetActive(false)でOff
で出来ます。
ゲームオブジェクト自身のOn・Offではなくゲームオブジェクトに設定されているコンポーネントのOn・Offは
ゲームオブジェクトのコンポーネント.enabled = true
ゲームオブジェクトのコンポーネント.enabled = false
で出来ます。
今回は1のキーを押すたびにMainカメラとOtherカメラの切り替えをするので、MainCameraがonの時はOtherCameraをOff、MainCameraがOffの時はOtherCameraをOnにするという処理が必要になります。
そのカメラ自身がOnの時、つまりアクティブであるかどうかを調べるのは、
ゲームオブジェクト.activeSelf
というプロパティで調べられます。
プロパティは持ってる情報、みたいな感じです。この場合は「ゲームオブジェクトがアクティブかどうかの情報」ですね。
という事は、このプロパティ値を取得し、反転させた値をSetActiveで指定すれば良いという事になります。
値の反転は!(エクスクラメーションマーク)で出来ます。
切り替えの方法を踏まえてスクリプトを記述する
Updateメソッド内は
1 2 3 4 5 6 7 8 | void Update () { if(Input.GetKeyDown("1")) { mainCamera.SetActive(!mainCamera.activeSelf); otherCamera.SetActive(!otherCamera.activeSelf); } } |
と記述します。
最終的なコードは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; public class ChangeCamera : MonoBehaviour { // メインカメラ [SerializeField] private GameObject mainCamera; // 切り替える他のカメラ [SerializeField] private GameObject otherCamera; // Update is called once per frame void Update () { // 1キーを押したらカメラの切り替えをする if(Input.GetKeyDown("1")) { mainCamera.SetActive(!mainCamera.activeSelf); otherCamera.SetActive(!otherCamera.activeSelf); } } } |
となります。
それではUnityに戻ってChangeCameraスクリプトのインスペクタでMain CameraとOther Cameraをドラッグ&ドロップしましょう。
上のようにスクリプトにカメラの設定をしたら、Unityの実行ボタンを押して試してみます。
最初はMain Cameraの視点ですが、数字の1を打つとOther Cameraに切り替わり、もう一度押せばMain Cameraに切り替わるようになりました。
以前の記事で作成したSub Cameraを機能させるにはOther CameraのCameraコンポーネントのDepthを-1にしてSub Cameraよりも奥側にします。
カメラ切り替えをスクリプトで出来ると何がよいか?
今回は少し遠めにカメラを切り替えるという事でしたが、Other Cameraの位置を変えたり、さらにカメラを増やすことによって、ユーザーがカメラの視点切り替えをする機能が作れると思います。
FPS(FirstPersonShooter)とTPS(ThirdPersonShooter)をカメラの切り替えだけで実現出来てしまうので感慨深いものがありますねぇ・・・・。
次回はライトについて少しやってみます。