🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

1回答

2368閲覧

カメラの初期位置をプレイヤーの後ろに配置したい。

Ayber

総合スコア8

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2019/11/09 08:01

編集2019/11/09 10:49

前提・実現したいこと

カメラの初期位置をプレイヤーの後ろに配置したい。

オブジェクトの初期向きをrotation y=90にしても、カメラの初期位置が後ろにあるようにしたいです。

オブジェクトの向きをいじる前は正常でしたが、上記の設定にした途端プレイヤーが右を向いた状態でゲームが始まってしまいました。

カメラの回転処理は問題ありません。

該当のソースコード

C#

1public class PlayerFollowCamera : MonoBehaviour 2{ 3 [SerializeField] private Transform player; // 注視対象プレイヤー 4 5 [SerializeField] private float distance = 15.0f; // 注視対象プレイヤーからカメラを離す距離 6 [SerializeField] private Quaternion vRotation; // カメラの垂直回転(見下ろし回転) 7 [SerializeField] public Quaternion hRotation; // カメラの水平回転 8 9 [SerializeField] private float turnSpeed = 10.0f; // 回転速度 10 [SerializeField] private float oppositeturnSpeed = -10.0f; //逆回転速度 11 12 void Start() 13 { 14 // 回転の初期化 15 vRotation = Quaternion.Euler(30, 0, 0); // 垂直回転(X軸を軸とする回転)は、30度見下ろす回転 16 hRotation = Quaternion.identity; // 水平回転(Y軸を軸とする回転)は、無回転 17 transform.rotation = hRotation * vRotation; // 最終的なカメラの回転は、垂直回転してから水平回転する合成回転 18 19 // 位置の初期化 20 // player位置から距離distanceだけ手前に引いた位置を設定します 21 transform.position = player.position - transform.rotation * Vector3.forward * distance; 22 } 23 24 void LateUpdate() 25 { 26 // カメラの位置(transform.position)の更新 27 // player位置から距離distanceだけ手前に引いた位置を設定します 28 transform.position = player.position - transform.rotation * Vector3.forward * distance; 29 30 // 水平回転の更新 31 if (Input.GetMouseButton(0)) 32 hRotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * turnSpeed, 0); 33 34 // 垂直回転の更新 35 if (Input.GetMouseButton(0)) 36 vRotation *= Quaternion.Euler(Input.GetAxis("Mouse Y") * oppositeturnSpeed, 0, 0); 37 38 39 // カメラの回転(transform.rotation)の更新 40 // 方法1 : 垂直回転してから水平回転する合成回転とします 41 transform.rotation = hRotation * vRotation; 42 43 // カメラの位置(transform.position)の更新 44 // player位置から距離distanceだけ手前に引いた位置を設定します 45 transform.position = player.position - transform.rotation * Vector3.forward * distance; 46 } 47}

試したこと

算出されるtransform.positionをどうにか弄れればいいのですが、Vector3で取得してしまっているせいで詰んでいます。
このスクリプト自体が個人のサイト様からコピーしたものなので、自分で完全に構造を把握できていないのも原因です。

補足情報(FW/ツールのバージョンなど)

バージョン Unity 2019 2.4f1
*追記*
対象プレイヤーの子オブジェクト化しても上手くいきませんでした。
イメージ説明

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

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

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

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

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

guest

回答1

0

カメラの位置をPlayerの子にすれば、常にプレイヤーの後ろにカメラが来るようになります

投稿2019/11/09 09:26

izmktr

総合スコア2856

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

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

Ayber

2019/11/09 09:44

試しましたが、上手くいきませんでした。 プレイヤーのRotationが0の時は上手くいきますが、y=90にしてみるとプレイヤーが横を向いた状態でスタートします。 オブジェクトの向きに関係なく、負のz軸方向が後ろ側だと認識されてしまうのでしょうか...。
izmktr

2019/11/09 10:25

Inspectorの画像をアップできますか? 回転しているプレイヤーの子としてカメラを設定できていますか?
Ayber

2019/11/09 10:49

補足情報の欄にアップさせていただきました。
izmktr

2019/11/10 04:00

実行前だと、Rotationをいじっても常にプレイヤーの後ろにカメラがあると思うんですが、 実行後にカメラの位置が移動しているんでしょうか? そうなるとスクリプトで変な処理が入っているので、その辺を取り除かないと無理ですね
Ayber

2019/11/10 15:40

そうですね、実行した途端位置が変わってしまいます。 カメラに取り付けたスクリプトは上記のものだけなので、ここに原因があるということでしょうか? いずれにせよどこを修正するべきなのか分からないです...。
izmktr

2019/11/11 01:11

上のスクリプトがカメラに取り付けられているものだとしたら、Startの3行目をこうですかね? transform.rotation = transform.rotation * hRotation * vRotation;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問