読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Unity5でレースゲーム】ゴールを演出するカメラを設置

Unity オープンワールドレーシングゲーム

これまではゴールが無く何周でも好きなだけ走れたこのゲームですが、それではレースにならないので一応ゴールを設置しました。
最後のチェックポイントは通常のチェックポイントと違い、赤色の矢印が上から下に動くようにしてみました。

そして、ゴールの瞬間に車をコース脇に設置した固定カメラから映すような演出を入れてみました。
レースゲームで良くあるこういうヤツです。
f:id:takujidev:20150729221440j:plain
f:id:takujidev:20150729221713j:plain
f:id:takujidev:20150729221727j:plain

普通のゲームではこのとき自動操縦モードになってゴールの余韻に浸ったりできるわけですが、このゲームの場合は今のところ自動操縦にはならず、自分でアクセルを踏み続ける必要があります。

動画です。

ゴール用カメラのDepthの値はメインカメラより大きくしておき、普段はカメラコンポーネントとオーディオリスナーコンポーネントをディセーブル(.enabled = false)にしておきます。

ゴールした瞬間にプレイヤーカーからEnableCamera()メソッドが呼ばれるとカメラコンポーネントとオーディオリスナーをenableにします。
このとき、プレイヤーカーのオーディオソースのSpatialBlendを1に設定しています。
通常時は高速走行時の音の濁りを防止するため自車のSpatialBlendは0にして3D効果を切っているのですが、それだとカメラの目の前を通り過ぎて行く感じが出ないためです。

あとはメインカメラとゴール用カメラのタグを入れ替えゴール用カメラをメインカメラとし、メインカメラとメインカメラのオーディオリスナーをディセーブルにします。
メインカメラが生きたままだと、ゴール用カメラに切り替わった後も裏で処理をしておりフレームレートが下がるのでこうしています。
タグを入れ替えるのは、車のオーディオ処理用スクリプトがメインカメラを参照しているからです。

最後に自車を映し続けるコルーチンを起動して完了です。

スクリプトです。

using UnityEngine;
using System.Collections;
using UnityStandardAssets.Vehicles.Car;

public class GoalCamera : MonoBehaviour {

    private Camera _goalCamera;
    private GameObject _mainCameraObject;
    private Camera _mainCamera;
    private AudioListener _goalAudioListner;
    private AudioListener _mainAudioLister;
    private float _initialSpatialBlend = 0f; // とりあえず3D offで初期化しておく
    private IEnumerator _coroutine;
    private Transform _target;

    void Start () 
    {
        _goalCamera = GetComponent<Camera>();
        _goalCamera.enabled = false;
        _goalAudioListner = GetComponent<AudioListener>();
        _goalAudioListner.enabled = false;
        _mainCamera = Camera.main;
        _mainCameraObject = _mainCamera.gameObject;
        _mainAudioLister = _mainCamera.GetComponent<AudioListener>();
        _coroutine = FollowPlayerCar();
    }
	
    public void EnableCamera(Transform target)
    {
        _target = target;
        AudioSource audioSource = _target.GetComponent<AudioSource>();
        _initialSpatialBlend = audioSource.spatialBlend;
        _target.GetComponent<AudioSource>().spatialBlend = 1f; // 自車の3D効果をONにする
        gameObject.tag = "MainCamera";
        _goalCamera.enabled = true;
        _goalAudioListner.enabled = true;
        _mainCameraObject.tag = "Untagged";
        _mainCamera.enabled = false;
        _mainAudioLister.enabled = false;
        StartCoroutine(_coroutine);
    }

    IEnumerator FollowPlayerCar()
    {
        while(true) {
            transform.LookAt(_target, Vector3.up);
            yield return null;
        }
    }
}