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

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

詳細はこちら
Unity

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

Q&A

解決済

1回答

648閲覧

ネットで回転のサンプルがあったので動かしているのですが、オブジェクトの設定がわかりません。

tamachan2020

総合スコア31

Unity

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

0グッド

0クリップ

投稿2019/11/30 03:01

前提・実現したいこと

URL
ネットで回転のサンプルがあったので動かしているのですが、環境設定がわかりません。

表示して眺めたい3Dオブジェクトを配置する。
imageを使いたいので,Canvasを設定しましたがこの下の記述の設定がわかりません。

※次に空のゲームオブジェクトを生成し、そのオブジェクトを先に配置したオブジェクトの中心に配置する。
その下にMainCameraを配置する。位置は3Dモデルから少し離れた位置に。

実行すると
"NullReferenceException: Object reference not set to an instance of an object
Rotate.Start () (at Assets/Rotate.cs:21)
エラー表示されます。

エラー個所は
NullReferenceException: Object reference not set to an instance of an object
Rotate.Start () (at Assets/Rotate.cs:21)
なのですが?

次に空のゲームオブジェクトを生成し、そのオブジェクトを先に配置したオブジェクトの中心に配置する。
その下にMainCameraを配置する。位置は3Dモデルから少し離れた位置に。

イメージ説明
イメージ説明

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

NullReferenceException: Object reference not set to an instance of an object Rotate.Start () (at Assets/Rotate.cs:21)

該当のソースコード

Unity

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class GameController : MonoBehaviour { 6 7 // Use this for initialization 8 void Start () { 9 10 } 11 12 // Update is called once per frame 13 void Update () { 14 15 } 16} 17 18using UnityEngine; 19using UnityEngine.UI; 20using System.Collections; 21 22public class Rotate : MonoBehaviour 23{ 24 25 public float maxAngle = 60.0F; //垂直方向に回転できる上限角度 26 public float minAngle = 300.0F; //垂直方向に回転できる下限角度 27 public float rotateSpeed = 30.0f; //回転速度(角度/秒) 28 29 private GameObject camera; //メインカメラ 30 private Vector2 beforePoint; //1フレーム前のポイント(各指) 31 private Vector2 nowPoint; //現フレームのポイント(各指) 32 private Vector2 difference; //二本指操作チェック用差分 33 private float horizontalAngle; 34 private float varticalAngle; 35 36 void Start() 37 { 38 camera = this.transform.Find("MainCamera").gameObject; 39 } 40 41 void Update() 42 { 43 44 //1本指でタップした場合は回転 45 if (Input.touchCount == 1) 46 { 47 //押下時のポイントを取得 48 if (Input.touchCount > 0) 49 { 50 if (Input.GetTouch(0).phase == TouchPhase.Began) 51 { 52 beforePoint = Input.GetTouch(0).position; 53 } 54 } 55 //スワイプでの継続した入力があった場合、その方向へ回転させる 56 if (Input.GetTouch(0).phase == TouchPhase.Moved) 57 { 58 nowPoint = Input.GetTouch(0).position; 59 //水平方向の移動があった場合、水平方向に回転 60 if (nowPoint.x - beforePoint.x != 0) 61 { 62 horizontalAngle = nowPoint.x - beforePoint.x; 63 horizontalAngle *= rotateSpeed * Time.deltaTime; 64 65 //水平方向に回転させる(水平方向はワールド軸) 66 this.transform.Rotate(0, horizontalAngle, 0, Space.World); 67 } 68 69 //垂直方向の回転があった場合、垂直方向に回転 70 if (nowPoint.y - beforePoint.y != 0) 71 { 72 varticalAngle = nowPoint.y - beforePoint.y; 73 varticalAngle *= rotateSpeed * Time.deltaTime; 74 75 //現在の角度を丸め込み(小数点第一位) 76 float tmpAngles = Mathf.Round(this.transform.rotation.eulerAngles.x * 10); 77 tmpAngles /= 10; 78 79 //上方向に回転 80 if (tmpAngles <= maxAngle) 81 { 82 //指定した最大角度を超える場合は最大角度まで回転するようにする 83 if (varticalAngle + this.transform.rotation.eulerAngles.x > maxAngle) 84 { 85 varticalAngle = maxAngle - this.transform.rotation.eulerAngles.x; 86 } 87 //垂直方向に回転させる(垂直方向はローカル軸) 88 this.transform.Rotate(varticalAngle, 0, 0, Space.Self); 89 //指定角度を超えてしまった場合の処理 90 } 91 else if (tmpAngles > maxAngle && tmpAngles <= 180) 92 { 93 //下方向にしか回転できないようにする 94 if (varticalAngle < 0) 95 { 96 this.transform.Rotate(varticalAngle, 0, 0, Space.Self); 97 } 98 } 99 100 //下方向に回転 101 if (tmpAngles >= minAngle) 102 { 103 //指定した最大角度を超える場合は最大角度まで回転するようにする 104 if (varticalAngle + this.transform.rotation.eulerAngles.x < minAngle) 105 { 106 varticalAngle = minAngle - this.transform.rotation.eulerAngles.x; 107 } 108 this.transform.Rotate(varticalAngle, 0, 0, Space.Self); 109 //指定角度を超えてしまった場合の処理 110 } 111 else if (tmpAngles < minAngle && tmpAngles > 180) 112 { 113 //上方向にしか回転できないようにする 114 if (varticalAngle > 0) 115 { 116 this.transform.Rotate(varticalAngle, 0, 0, Space.Self); 117 } 118 } 119 } 120 121 //現フレームのポイントを格納 122 beforePoint = nowPoint; 123 } 124 } 125 } 126 127}

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

transform.Find で検索できるのは自分は含まない子のみです。
なので、MainCameraに割り付けられているRotateコンポーネントでは自分自身をはヒットできないです。
ちなみに孫もヒットしません。

GameObject.FindだとHierarchy全体でできるでしょうが、アクティブでないとヒットしないのと、意図しない同名がヒットする可能性もあります。

必要であれば、自分自身を含め、かつ孫までヒットするような処理(再帰)を作るとかがいいかと。


(2019/12/01 10:23追記)
一応、これだけ追記しておきます。
添付画像のMainCamera

  • MainCameraからみて自分
  • GameControllerからみて子
  • Canvasからみて孫

です。
今回のNullPointerRerefenceは Rotateが割り付けられた各GameObjectの子の中からMainCameraを探している 処理なのに、 MainCamera自身にもRotateが割り付けられているから見つけられない からです。

投稿2019/11/30 04:02

編集2019/12/01 01:31
vo3

総合スコア321

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

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

tamachan2020

2019/12/01 01:16

もう少し自分で考えてみます。
tamachan2020

2019/12/01 02:15

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問