Unityでカメラが壁に遮られキャラクターが見えなくなったらカメラを移動させる

Unity内のステージで広い草原であれば考えなくてもいい事なんですが、ゲームステージに建物や山のような地形があった場合、カメラとキャラクターの間に何らかの障害物が映り、キャラクターが見えなくなってしまう事があります。

こうなるとキャラクターが今どこを動いているのかわからなくなってしまいます。

カメラ12

スポンサーリンク

キャラクターが壁のせいで見えなくなる時の対処

こういう時はカメラが自動で位置を変えキャラクターを表示するか、またはキャラクターが狭い建物に入った時(入口のOnTriggerEnterで判定)にあらかじめ設定してあった別のカメラの表示に切り替えて、キャラクターが見えなくならないようにするという方法があります。

カメラを切り替える方法はメインカメラで表示していたものを固定のカメラに切り替え、メインカメラをOffにするという機能を追加すればいいんですが、
カメラの切り替えに関しては

Unityで二つのカメラをスクリプトから切り替えるようにし、視点変更機能を作成してきます。

を参照してください。

今回は自動でカメラの位置を変える機能を追加してみます。

↑のような感じで主人公とカメラの間に壁や敵が入った場合はその位置にカメラを移動させています。

狭い部屋などを主人公キャラクターが移動する事がある時は便利ですね。(^^)/

今回のサンプルでは壁だけでなく敵も障害物と同じ対象にしてますが、対象はレイヤーの指定をするかしないかだけなのですぐ変更出来ます。

キャラクターとカメラの間に障害物があるかを調べるスクリプトの作成

カメラとキャラクターの間に障害物があるかどうか判定し障害物があった時はカメラの位置を移動します。

障害物があるかどうか調べる為にPhysics.Linecastを使います。

Linecastは始点から終点にレイを飛ばして、他のゲームオブジェクトと衝突するかどうかを調べる事が出来ます。

playerはカメラの親要素であるキャラクターをStartメソッドで設定します。

カメラの初期位置もStartメソッドで指定します。

初期位置はローカル位置で設定します。

UpdateメソッドではPhysics.Linecastを使ってプレイヤーキャラクターからカメラまでレイを飛ばして、指定したレイヤーと衝突しているかどうかを調べます。

衝突した位置はhit.pointで得られますが、この位置はワールド空間の位置なのでカメラ位置もtransform.positionの位置に設定します。

いきなりカメラが移動するとパッと切り替わってしまう為、Vector3.Lerpを使って滑らかに移動するようにします。

レイが衝突していなければカメラのローカル位置を元の位置に滑らかに移動するようにします。

Debug.DrawLineで視覚的にレイを確認

Debug.DrawLineを使用するとシーンビューで視覚的にレイの様子を確認する事が出来ます。

↑の場合はプレイヤーの基点である足元にVector3.up(Vector3(0, 1, 0))を足した位置からカメラ位置にレイを表示し、レイの色を赤色、レイを表示する間隔を0(0なので常に表示)、最後の条件はトリガーに設定されたものも対象にするかどうかみたいですがよくわかりません。(^_^;)

カメラ13

上のような感じで通常表示されるカメラ位置とは違う位置で表示され、壁でキャラクターが見えなくなる事はなくなりました。

これで自動でカメラの位置を変更する事が出来るようになりました。
初期のバイオみたいに、ある部屋はこの視点で、ある通路はこの視点で、みたいのもレトロな感じで面白そうですけどね。

カメラが自動でキャラクターを映す機能を作り終えて

カメラがうまくキャラクターを表示してくれず色々やっていた記憶がありますが、単純に処理を間違えていました・・・(^_^;)
レイを飛ばす方向を

『RayCastゲームオブジェクトからキャラクター』へ飛ばしていましたが、実際に壁が間に入ったかどうかは

『キャラクターからRayCastゲームオブジェクト』へ飛ばす必要があります。

なぜならRayCastからレイを飛ばすとRayCast側の壁を接触場所にしてしまって結局キャラクターを映せないという事になります。
キャラクターからRayCastの方にレイを飛ばせばキャラクター側の壁が接触場所になるので必ずキャラクターを映してくれます。

これでちゃんとキャラクターを映してくれると思います。

以前書いていた不要な処理は混乱を招くので削除しました。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます