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

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

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

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

Q&A

解決済

1回答

2047閲覧

オブジェクトのドラッグができません

meguru

総合スコア16

Unity3D

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

0グッド

0クリップ

投稿2018/11/12 06:31

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
Unityでジグソーパズルを作成しています。
自分で作成した.objのピースをドラッグで移動しようとしているのですが、うまくいきません。
とりあえず、ネットにあったソースを使ってみたのですがだめでした。

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

NullReferenceException: Object reference not set to an instance of an object PieceController.OnMouseDown () (at Assets/PieceController.cs:14)

該当のソースコード

C#

1 private Vector3 screenPoint; 2 private Vector3 offset; 3 4 void OnMouseDown() 5 { 6 screenPoint = Camera.main.WorldToScreenPoint(transform.position); 7 8 float x = Input.mousePosition.x; 9 float y = Input.mousePosition.y; 10 11 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(x, y, screenPoint.z)); 12 } 13 14 void OnMouseDrag() 15 { 16 float x = Input.mousePosition.x; 17 float y = Input.mousePosition.y; 18 19 Debug.Log(x.ToString() + " - " + y.ToString()); 20 21 Vector3 currentScreenPoint = new Vector3(x, y, screenPoint.z); 22 23 Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint) + offset; 24 25 transform.position = currentPosition; 26 }

試したこと

様々なソースコードで試しました。

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

Unity Personal 最新バージョン, Visual Stadio2017

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご提示のコードの中でnullになりうる物となるとCamera.mainかと思います。
タグが「MainCamera」のカメラが一つもないとnullになりますので、タグをチェックしてみてはいかがでしょうか。

参考:【Unity】スクリプトからMain Cameraを取得するのは簡単だよ

#追記
リファレンスによるとCamera.mainは一見ただの変数のように見えますが、内部的にFindGameObjectsWithTagを使っているプロパティだそうです。

Unityでのセオリーとして、Updateや、今回使っているOnMouseDragのような高頻度で実行されるメソッド中でFind系メソッドを乱発するな...とよく言われますが、それに従うと下記のようにOnMouseDownで(あるいはAwakeStartなどで)一度だけ取得する方が望ましいかもしれません。

C#

1 private Vector3 screenPoint; 2 private Vector3 offset; 3 private Camera mainCamera; 4 5 void OnMouseDown() 6 { 7 mainCamera = Camera.main; 8 9 screenPoint = mainCamera.WorldToScreenPoint(transform.position); 10 11 float x = Input.mousePosition.x; 12 float y = Input.mousePosition.y; 13 14 offset = transform.position - mainCamera.ScreenToWorldPoint(new Vector3(x, y, screenPoint.z)); 15 } 16 17 void OnMouseDrag() 18 { 19 float x = Input.mousePosition.x; 20 float y = Input.mousePosition.y; 21 22 Debug.Log(x.ToString() + " - " + y.ToString()); 23 24 Vector3 currentScreenPoint = new Vector3(x, y, screenPoint.z); 25 26 Vector3 currentPosition = mainCamera.ScreenToWorldPoint(currentScreenPoint) + offset; 27 28 transform.position = currentPosition; 29 }

参考:Unite Europe 2017 - Squeezing Unity: Tips for raising performance

投稿2018/11/12 13:41

編集2018/11/15 21:25
Bongo

総合スコア10807

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

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

meguru

2018/11/15 14:41

おっしゃっていただいた通り、メインカメラが原因でした! 教えていただいてありがとうございました!
Bongo

2018/11/15 21:25

うまくいきましたようでよかったです。現状のコードでも動作上問題ないでしょうが、Camera.mainを使用する回数はなるべく少なく抑えると、ちょっと効率的になるみたいですね。私も過去に書いたコードを見返してみたところ、けっこう無駄にCamera.mainを使っておりました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問