前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Unityで3Dのゲームを制作している者です。 カメラの挙動についてうまくいかないので、解決策をご教授頂きたいです。 要件としては以下になります。 ・カスタムロボのような、「俯瞰」視点で「2人以上のプレイヤー」が戦闘するゲームを制作しています。 ・「2人のプレイヤー」を画面に収めるスクリプトを実装 →ここはうまくいきました。 × しかし、上記の設定を維持したまま、 「2人のプレイヤーの中間を軸にカメラを円運動させるスクリプト」の実装がうまくいきません。 →軸を中心としたものではなくカメラ自体が回転してしまいます。 Unityのバージョンは 「2018 4.17f1」です。 ・イメージとしてはこんな感じのカメラです https://www.youtube.com/watch?v=Tr1YBUExHNw
該当のソースコード
C#
//プレイヤーを画面に収めるスクリプト [RequireComponent(typeof(Camera))] public class MultipleTargetCamera : MonoBehaviour { public Camera cam; public List<Transform> targets; public Vector3 offset; public float smoothTime = 0.5f; public float minZoom = 40; public float maxZoom = 10; public float zoomLimiter = 50; private Vector3 velocity; private void Reset() { cam = GetComponent<Camera>(); } private void LateUpdate() { if (targets.Count == 0) return; Move(); Zoom(); } private void Zoom() { var newZoom = Mathf.Lerp(maxZoom, minZoom, GetGreatestDistance() / zoomLimiter); cam.fieldOfView = Mathf.Lerp(cam.fieldOfView, newZoom, Time.deltaTime); } private void Move() { var centerPoint = GetCenterPoint(); var newPosition = centerPoint + offset; transform.position = Vector3.SmoothDamp(transform.position, newPosition, ref velocity, smoothTime); } private float GetGreatestDistance() { var bounds = new Bounds(targets[0].position, Vector3.zero); for (int i = 0; i < targets.Count; i++) { bounds.Encapsulate(targets[i].position); } return bounds.size.x; } private Vector3 GetCenterPoint() { if (targets.Count == 1) return targets[0].position; var bounds = new Bounds(targets[0].position, Vector3.zero); for (int i = 0; i < targets.Count; i++) { bounds.Encapsulate(targets[i].position); } return bounds.center; } **//y軸を中心にカメラが円運動するスクリプト** //(https://mogi0506.com/uinty-camera-rotation/ を参考) //回転させるスピード public float rotateSpeed = 3.0f; // Use this for initialization void Start() { } // Update is called once per frame void Update() { //回転させる角度 float angle = Input.GetAxis("Horizontal") * rotateSpeed; //カメラを回転させる transform.RotateAround(GetCenterPoint(), Vector3.up, angle); } }
試したこと
カメラに関して、スクリプトで取得した座標軸ではなく、
2者間の距離から座標を算出するスクリプトも試しましたが、
それでもうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
Unityのバージョンは
「2018 4.17f1」です。
GetCenterPoint()は正しい位置を返していますか?
ありがとうございます。
ログを確認してみましたがどうも2者間の位置ではなくカメラ位置を出してる感じがします…。
①GetCenterPoint()
(2.8, 0.3, -5.0)
UnityEngine.Debug:Log(Object)
MultipleTargetCamera:Update() (at Assets/Scripts/MultipleTargetCamera.cs:94)
②2者間の距離を確認
(Vector3 center = (targets[0].transform.position + targets[1].transform.position) * 0.5f;)
(2.8, 0.3, -5.0)
UnityEngine.Debug:Log(Object)
MultipleTargetCamera:Update() (at Assets/Scripts/MultipleTargetCamera.cs:95)
プレイヤーの中間で、回転させた後、LastUpdateで中間+offsetに移動させている(多分元の位置へ戻している?)から、移動せず回転のみになるのではないでしょうか?
回答1件
あなたの回答
tips
プレビュー