質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

638閲覧

2つ以上のオブジェクトを画面に収めつつ、カメラを円運動させたい

M4SH1R000

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2020/02/20 07:08

編集2020/02/20 07:09

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)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」です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/02/20 07:43

GetCenterPoint()は正しい位置を返していますか?
M4SH1R000

2020/02/20 08:47 編集

ありがとうございます。 ログを確認してみましたがどうも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)
tmp

2020/02/20 09:34

プレイヤーの中間で、回転させた後、LastUpdateで中間+offsetに移動させている(多分元の位置へ戻している?)から、移動せず回転のみになるのではないでしょうか?
guest

回答1

0

ベストアンサー

問題が発生するのはtransform.RotateAroundでカメラ移動をおこなった後にMove()内でカメラ移動をおこなっているからです。
移動の処理が二つに分かれているせいとも言えます。

transform.RotateAround部分は問題無いのでそこは直す必要はありません。

解決にはUpdate内でカメラ回転に合わせてoffsetの位置を変更する必要があるかと思います。

投稿2020/02/20 11:05

編集2020/02/20 11:21
Hawn

総合スコア1222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M4SH1R000

2020/02/20 23:07

ありがとうございます…大変助かりました! 回答者様の回答も有難かったのですが、さらにもっと良い方法が無いか模索したところ、前述の「キャラを画面内に収めるスクリプト」はそのままに、メインカメラとは別に「2者間の中間に常に移動するオブジェクト」を配置し、メインカメラをそのオブジェクトの子要素とし、そのオブジェクトをdeltaTimeで回転させることで、より自分の思った通りの動きにすることができました。 C#初心者の初歩的な質問にお付き合い頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問