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

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

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

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

Unity3D

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

Unity

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

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Q&A

解決済

1回答

2620閲覧

UnityでKinectの座標を使いたいのですがエラーが発生します

snowtmdrop

総合スコア7

C#

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

Unity3D

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

Unity

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

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

0グッド

0クリップ

投稿2017/12/25 02:36

###前提・実現したいこと
Kinectで認識した骨格の座標をUnityで使いたいのですが座標が出力されず、エラーが発生します。
座標はx,y,z全てとる予定ですがとりあえずx座標のみで試している状態です。

この状態でもKinectは動きます。
エラーは毎フレーム増えていき骨格を認識するとエラーは止まるのですが、骨格を認識しても座標を出力しないです。
###発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object HipLeft.SerchKinectJoint () (at Assets/KinectView/Scripts/HipLeft.cs:25) HipLeft.Update () (at Assets/KinectView/Scripts/HipLeft.cs:16)

###該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class HipLeft : MonoBehaviour { 6 Transform KinectJointTransform; 7 GameObject KinectJoint; 8 // Use this for initialization 9 void Start () { 10 11 } 12 13 // Update is called once per frame 14 void Update () { 15 16 SerchKinectJoint();//16行目 17 18 } 19 20 21 22 void SerchKinectJoint() 23 { 24 GameObject KinectJoint = GameObject.Find("HipLeft"); //HipLeftは取りたい座標の名前 25 Transform KinectJointTransform = KinectJoint.transform;//25行目 26 float jointX = KinectJointTransform.position.x; 27 28 } 29 30 31}

###試したこと
NullReferenceExceptionについては調べ、開始時に”HipLeft”が見つからずにエラーが起こってしまうのを防ぐためにNullチェックをするのは理解したのですが具体的にどうすればいいのかがわかりませんでした。
また、出力するために Debug.Log があるということも知り、試してみましたが知りたい座標ではなく「HipLeft.x」と返されてしまいました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Kinectは詳しくない(というか持っていない)ので、見当違いだったらすいません。

NullReferenceExceptionについては調べ、開始時に”HipLeft”が見つからずにエラーが起こってしまうのを防ぐためにNullチェックをするのは理解したのですが具体的にどうすればいいのかがわかりませんでした。

nullかどうかを比較し、もしnullであれば、nullだと処理できない処理をスキップする感じになります。
具体的には以下のような感じです。

C#

1 void SerchKinectJoint() 2 { 3 GameObject KinectJoint = GameObject.Find("HipLeft"); //HipLeftは取りたい座標の名前 4 if (KinectJoint != null) 5 { 6 Transform KinectJointTransform = KinectJoint.transform; 7 float jointX = KinectJointTransform.position.x; 8 Debug.Log(jointX); // 出力(詳細は後述) 9 } 10 }

出力するために Debug.Log があるということも知り、試してみましたが知りたい座標ではなく「HipLeft.x」と返されてしまいました。

内容から察するに、以下のように呼び出しているのではないかと思います。

C#

1Debug.Log("HipLeft.x");

Debug.Log()は文字列をそのまま出力する関数なので、当然「HipLeft.x」と表示されます。
また、HipLeftという変数は存在していないので、Debug.Log(HipLeft.x);としてもエラーになるでしょう。
今回の場合、jointXがX座標を表しているので、前述のソースのようにDebug.Log(jointX);とするのが正しいです。


また、質問とは関係ないですが、

C#

1 Transform KinectJointTransform; 2 GameObject KinectJoint;

という箇所がありますが、

C#

1 void SerchKinectJoint() 2 { 3 GameObject KinectJoint = GameObject.Find("HipLeft"); //HipLeftは取りたい座標の名前 4 Transform KinectJointTransform = KinectJoint.transform;//25行目 5 float jointX = KinectJointTransform.position.x; 6 7 }

という具合に、SerchKinectJoint()で再度定義されているので、前者の箇所は使われておりません。
バグの原因となりうるので、他の関数で使いたいなら前者のみで定義し、そうでなければ後者のみで定義するのがよいです。


これらの内容は、Kinectとは直接関係していない基礎的な内容です。
Kinectを使うなとは言いませんが、平行して基礎的な内容を勉強することをおすすめします。

投稿2017/12/25 03:25

fiveHundred

総合スコア9797

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

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

snowtmdrop

2017/12/25 03:53

fiveHundredさん 回答して頂いた内容を試したところエラーは無事解決できました。 座標の出力は、 JointX UnityEngine.Debug:Log(Object) HipLeft:SerchKinectJoint() (at Assets/KinectView/Scripts/HipLeft.cs:28) HipLeft:Update() (at Assets/KinectView/Scripts/HipLeft.cs:15) と出てしまうのですが、もう一度自分で調べて挑戦したいと考えています。 回答ありがとうございました。
fiveHundred

2017/12/25 04:24

「Debug.Log("jointX");」ではなく「Debug.Log(jointX);」としてください。 ""で囲ってしまうと、それは文字列として扱われます。 「Debug.Log()は文字列をそのまま出力する関数なので、~」と言ったのはそういう意味です。
snowtmdrop

2017/12/25 05:01

回答ありがとうございます。 あらためて自分には基礎的な内容が足りないと実感しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問