カメラが自プレイヤーを遅れておっかけてくれるようにしました。
主に参考、というより以下のサイトのコードをそのまま持ってきました。
【Unity5】AC4系のようなカメラワークを再現する – N煎ログブログ
こちらの記事のコードをSubカメラを撤廃してそのまま実装しました。
ただそのままでは移動の際にカメラがカクついてしまっていて自分のプロジェクト用に修正が必要な部分もありました。
カメラのカクつきは以下のサイトが参考になりました。
FixedUpdateとUpdateごちゃまぜでTransformをいじるとカクつく – 考え中
プレイヤー移動の更新間隔、カメラ移動の更新間隔、ディスプレイの更新間隔をうまいことあわせないとカクつきが発生してしまうようでした。
全てUpdateにしてしまうと物理演算の処理間隔がカメラ移動の更新間隔やディスプレイの更新間隔と合わなくてカクつきが発生してしまうようです。
そこで更新間隔を固定値にするFixedUpdateを利用すると良いみたいです。このFixedUpdateをディスプレイの更新間隔とだいたい一緒にしてあげればうまいこといくみたい?
そんでこんな感じになりました
このまんまだと上下を向いたときにプレイヤーが全然見えなくなってしまうのでカメラの目標地点をプレイヤーの向いている角度によって変える必要がでてくる。
また、プレイヤーを常に中心とするのを目標とするのではなく、X軸方向の目標値には多少の余裕を持たせたい。(プレイヤーを真ん中ではなく右よりとか左よりのまんまにしたり)
CameraPositionTargetオブジェクトに以下のコードをアタッチして対応しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System.Collections; using System.Collections.Generic; using UnityEngine; /* 自分の向いている上下角度によって、カメラの目標位置を変えるようにする (上や下を向いているときは、カメラを自機に近づけてカメラ外にいかないようにする) */ public class CameraPosORG : MonoBehaviour { public GameObject rotateObject; Vector3 defDis = new Vector3(0, 2, -12); private Vector3 preWorldlPos; // Use this for initialization void Start () { transform.localPosition = defDis; preWorldlPos = this.transform.position; } // Update is called once per frame void Update () { Vector3 localPos = this.transform.localPosition; /*カメラを上下に動かしたときの目標カメラ位置補正*/ float angleX = rotateObject.transform.localEulerAngles.x; if (rotateObject.transform.localEulerAngles.x > 180) { //上を向いたとき angleX = Mathf.Abs (angleX - 360); localPos.y = defDis.y - defDis.y * ((angleX) / 70); localPos.z = defDis.z - defDis.z * ((angleX) / 70); } else { //下を向いたとき localPos.z = defDis.z - defDis.z * ((angleX) / 70); localPos.y = defDis.y + Mathf.Abs(localPos.z - defDis.z); } /*ローカルX軸のカメラワークに余裕を持たせる*/ float angleY = rotateObject.transform.eulerAngles.y; //ローカルX軸い前回からどれくらい動いたかを求める Vector3 diffVec = Quaternion.Euler (0f, -angleY, 0f) * (this.transform.position - preWorldlPos); localPos.x = localPos.x - diffVec.x; if (localPos.x >= 4) { localPos.x = 4; }else if(localPos.x <= -4){ localPos.x = -4; } this.transform.localPosition = localPos; preWorldlPos = this.transform.position; } } |
値の調整とかがまだできるようにしてないから稚拙なコードだけど・・・
こんな感じになりました。
旋回速度とかも考慮して細かい値はまだ要調整
以上です。
コメント