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

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

新規登録して質問してみよう
ただいま回答率
85.49%
UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

Q&A

解決済

1回答

1175閲覧

ボタンを押しても、カメラがY軸方向に90°回転しない。

Satoshi040989

総合スコア1

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/05/25 03:27

前提・実現したいこと

リンク内容
このサイトを手順通りにカメラ操作の処理を書き、手順通りにしたがボタンを押しても反応せず、以下のエラーが発生する。
ボタンをおしてカメラがY軸方向に90°回転させたい。

発生している問題・エラーメッセージ

UnassignedReferenceException: The variable cameraTransform of Camera_controller has not been assigned. You probably need to assign the cameraTransform variable of the Camera_controller script in the inspector. UnityEngine.Transform.get_localRotation () (at <a5949084587241189a974c7df1839e1c>:0) Camera_controller.RotateCamera (System.Single angle) (at Assets/script/Camera_controller.cs:24)

該当のソースコード

C#

1using UnityEngine; 2using System.Collections; 3 4public class Camera_controller : MonoBehaviour 5{ 6 7 Transform cameraTransform; 8 // Start is called before the first frame update 9 void Start() 10 { 11 cameraTransform = Camera.main.transform; 12 Debug.Log(cameraTransform.transform.rotation); 13 14 } 15 //カメラをY軸方向に回転させるメソッド 16 //ボタンを通じて呼び出すので、このスクリプト内では定義しておくだけ。 17 public void RotateCamera(float angle) 18 { 19 Debug.Log(angle); 20 if(angle == 0) 21 { 22 return; 23 } 24 cameraTransform.localRotation = Quaternion.Euler(Vector3.up * angle) *cameraTransform.localRotation; 25 Debug.Log(cameraTransform.transform.rotation); 26 //カメラのローカル座標

試したこと

変数が代入されていないエラーだったので、debug.logで値が設定されていないものを調べた。

C#

1cameraTransform.localRotation = Quaternion.Euler(Vector3.up * angle) *cameraTransform.localRotation;

の部分で代入ができていない事が分かった。

処理を理解できていなかったのでQuaternionやVector3について調べたが、なぜもう一度localRotationを掛ける必要があるのかが分からなかった。

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

Unity2019.4.26

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

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

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

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

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

guest

回答1

0

ベストアンサー

「cameraTransformに何も設定されていないよ」というエラーです。
感で答えますが、Start()が実行される前にRotateCamera()が呼ばれているのではないでしょうか。
試しに、Start()ではなくAwake()でcameraTransformを設定するとどうなりますでしょうか。

cameraTransform.localRotation = Quaternion.Euler(Vector3.up * angle) *cameraTransform.localRotation;

Quaternion同士の掛け算は、「所定の回転(Quaternion)に対してさらに回転を加える」という意味です。
それを踏まえると「Y軸に対してangle度の回転」に「現在のローカルのカメラの向き」を加えたものになります。
(数学的な理由から掛け算になっていますが、実質的には回転同士の足し算だと思うとわかりやすいかもしれません)

投稿2021/05/25 03:57

fiveHundred

総合スコア9796

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

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

Satoshi040989

2021/05/25 04:41 編集

ご回答いただきありがとうございます。 startの部分をAwakeに変えても, ' UnassignedReferenceException: The variable cameraTransform of Camera_controller has not been assigned. You probably need to assign the cameraTransform variable of the Camera_controller script in the inspector. UnityEngine.Transform.get_localRotation () (at <a5949084587241189a974c7df1839e1c>:0) ' というエラーになりました。
fiveHundred

2021/05/25 05:33

- Awake()(Start())にある、「Debug.Log(cameraTransform.transform.rotation);」は正常に表示されていますか? - RotateCamera()はどこから呼ばれていますか?
Satoshi040989

2021/05/25 09:09

debug.logは正常に表示されていました。 RotateCameraがどこから呼ばれているのかは, Camera_controller.RotateCamera (System.Single angle) (at Assets/script/Camera_controller.cs:38) と書かれていたので、38行目のcameraTransform.localRotationの計算で呼ばれているようです。
fiveHundred

2021/05/25 09:50

> RotateCamera すみません、コードのコメントに「ボタンを通じて呼び出す」って書かれていますね。 cameraTransform.localRotationがどうたらというのではなく、これを聞きたかったのです。 「cameraTransform.localRotation = Quaternion.Euler(Vector3.up * angle) *cameraTransform.localRotation;」の前に「Debug.Log(cameraTransform);」とするとどうなりますか?
Satoshi040989

2021/05/26 08:21

回答遅くなり申し訳ないです。 値がnullと出力されました
fiveHundred

2021/05/26 08:28

だとすると、cameraTransformが何らかの原因で設定できていないのでしょう。 原因がわからないので何とも言えませんが、Start()ではなくRotateCamera()の中で「cameraTransform = Camera.main.transform;」を(最初の1回目のみ)取得すると上手くいくかもしれません。
Satoshi040989

2021/05/26 08:55

言われた通りにしたらうまくいきました。 教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問