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

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

詳細はこちら
VIVE

VIVEは、VR向けヘッドマウントディスプレイです。センサーによって部屋自体をVR空間にするルームスケールが大きな特徴。プレイヤーはその空間を自由に歩き回ることが可能なため、高い没入感を体験できます。

C#

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

Unity3D

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

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Unity

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

Q&A

解決済

1回答

2632閲覧

Unity SteamVR_Input_Actions.cs内のNullReferenceExceptionを解消する方法

ra7ra7_430

総合スコア5

VIVE

VIVEは、VR向けヘッドマウントディスプレイです。センサーによって部屋自体をVR空間にするルームスケールが大きな特徴。プレイヤーはその空間を自由に歩き回ることが可能なため、高い没入感を体験できます。

C#

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

Unity3D

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

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Unity

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

0グッド

0クリップ

投稿2019/09/27 09:28

編集2019/09/30 04:19

前提・実現したいこと

純文系人間ですが、仕事の一環で初めてのプログラミングをしております。
知識不足のため質問内容などわかりにくいところがあるかと思いますが、ご回答いただければ幸いです。

unityでHTC VIVEのハンドコントローラーのトラックパッドを4分割して
キャラクターの指を動かそうと考えています。
そこで以下のコードを作成したところ、NullReferenceExceptionが出てしまい
unityの再生では問題ないのですが、ビルドがうまくいきません。

どうして作成したコードをunityにアタッチすると該当箇所がnullになってしまうのか
そしてどのようにして対処すればよいか教えてください。

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

Do not use ReadObjectThread on scene object

NullReferenceException: Object reference not set to an instance of an object
Valve.VR.SteamVR_Actions.get_default_TrackPad () (at Assets/SteamVR_Input/SteamVR_Input_Actions.cs:132)
TrackpadControl..ctor () (at Assets/TrackpadControl.cs:9)

該当のソースコード

以下のコードを作成しました。

using System.Collections; using System.Collections.Generic; using VrmArPlayer; using UnityEngine; using Valve.VR; public class TrackpadControl : MonoBehaviour { private SteamVR_Action_Vector2 TrackPad = SteamVR_Actions.default_TrackPad; private Vector2 pos, pos2; } void Start() { var fingerController = gameObject.AddComponent<FingerController>(); } // Update is called once per frame void Update() { var fingerController = gameObject.AddComponent<FingerController>(); pos = TrackPad.GetLastAxis(SteamVR_Input_Sources.RightHand); pos2 = TrackPad.GetLastAxis(SteamVR_Input_Sources.LeftHand); Debug.Log(pos.x + " " + pos.y); if (pos.x < 0) { if (pos.y < 0) { //右手をグー fingerController.FingerRotation(FingerController.FingerType.RightAll, 1.0f); } else { //右手で1(人差し指だけ立てる) fingerController.FingerRotation(FingerController.FingerType.RightAll, 1.0f); fingerController.FingerRotation(FingerController.FingerType.RightIndex, 0.0f); } } else { if (pos.y >= 0) { //右手をパー fingerController.FingerRotation(FingerController.FingerType.RightAll, 0.0f); } else { //右手をピース fingerController.FingerRotation(FingerController.FingerType.RightAll, 1.0f); fingerController.FingerRotation(FingerController.FingerType.RightIndex, 0.0f); fingerController.FingerRotation(FingerController.FingerType.RightMiddle, 0.0f); } } if (pos2.x <= 0) { if(pos2.y < 0) { //左手ピース fingerController.FingerRotation(FingerController.FingerType.LeftAll, 1.0f); fingerController.FingerRotation(FingerController.FingerType.LeftIndex, 0.0f); fingerController.FingerRotation(FingerController.FingerType.LeftMiddle, 0.0f); } else { //左手をパー fingerController.FingerRotation(FingerController.FingerType.LeftAll, 0.0f); } } else { if (pos2.y > 0) { //左手で1(人差し指だけ立てる) fingerController.FingerRotation(FingerController.FingerType.LeftAll, 1.0f); fingerController.FingerRotation(FingerController.FingerType.LeftIndex, 0.0f); } else { //左手をグー fingerController.FingerRotation(FingerController.FingerType.LeftAll, 1.0f); } } } }

エラー箇所の内容は以下(コードの一番下)

//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace Valve.VR { using System; using UnityEngine; public partial class SteamVR_Actions { private static SteamVR_Action_Boolean p_default_InteractUI; private static SteamVR_Action_Boolean p_default_Teleport; private static SteamVR_Action_Boolean p_default_GrabPinch; private static SteamVR_Action_Boolean p_default_GrabGrip; private static SteamVR_Action_Pose p_default_Pose; private static SteamVR_Action_Skeleton p_default_SkeletonLeftHand; private static SteamVR_Action_Skeleton p_default_SkeletonRightHand; private static SteamVR_Action_Single p_default_Squeeze; private static SteamVR_Action_Boolean p_default_HeadsetOnHead; private static SteamVR_Action_Vector2 p_default_TrackPad; private static SteamVR_Action_Vibration p_default_Haptic; private static SteamVR_Action_Vector2 p_platformer_Move; private static SteamVR_Action_Boolean p_platformer_Jump; private static SteamVR_Action_Vector2 p_buggy_Steering; private static SteamVR_Action_Single p_buggy_Throttle; private static SteamVR_Action_Boolean p_buggy_Brake; private static SteamVR_Action_Boolean p_buggy_Reset; private static SteamVR_Action_Pose p_mixedreality_ExternalCamera; public static SteamVR_Action_Boolean default_InteractUI { get { return SteamVR_Actions.p_default_InteractUI.GetCopy<SteamVR_Action_Boolean>(); } } public static SteamVR_Action_Boolean default_Teleport { get { return SteamVR_Actions.p_default_Teleport.GetCopy<SteamVR_Action_Boolean>(); } } public static SteamVR_Action_Boolean default_GrabPinch { get { return SteamVR_Actions.p_default_GrabPinch.GetCopy<SteamVR_Action_Boolean>(); } } public static SteamVR_Action_Boolean default_GrabGrip { get { return SteamVR_Actions.p_default_GrabGrip.GetCopy<SteamVR_Action_Boolean>(); } } public static SteamVR_Action_Pose default_Pose { get { return SteamVR_Actions.p_default_Pose.GetCopy<SteamVR_Action_Pose>(); } } public static SteamVR_Action_Skeleton default_SkeletonLeftHand { get { return SteamVR_Actions.p_default_SkeletonLeftHand.GetCopy<SteamVR_Action_Skeleton>(); } } public static SteamVR_Action_Skeleton default_SkeletonRightHand { get { return SteamVR_Actions.p_default_SkeletonRightHand.GetCopy<SteamVR_Action_Skeleton>(); } } public static SteamVR_Action_Single default_Squeeze { get { return SteamVR_Actions.p_default_Squeeze.GetCopy<SteamVR_Action_Single>(); } } public static SteamVR_Action_Boolean default_HeadsetOnHead { get { return SteamVR_Actions.p_default_HeadsetOnHead.GetCopy<SteamVR_Action_Boolean>(); } } public static SteamVR_Action_Vector2 default_TrackPad { get {          //↓ここがnullになってしまう return SteamVR_Actions.p_default_TrackPad.GetCopy<SteamVR_Action_Vector2>(); } }

試したこと

SteamVR_input_Actions.cs 内のエラーは(return SteamVR_Actions.p_default_TrackPad.GetCopy<SteamVR_Action_Vector2>();)で
p_default_TrackPadが生成されていないためnullになっている…ところまでは教えていただき
周囲の助言を経て該当場所をtryやcatchで囲んでみましたが駄目でした。

参照したサイト

https://qiita.com/sh_akira/items/81fca69d6f34a42d261c
(コントローラー部分を除いてすべて上記のサイトの通り制作)
https://qiita.com/nekoco/items/16435b0aebadc5860b29
(トラックパッドの設定などは上記サイトより)

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

unity 2019 2.2f
SteamVR 1.7.15
SteamVR Plugin 2.3.2

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

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

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

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

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

guest

回答1

0

自己解決

nullは現在進行形で消えていないのですが、ビルドして当初の目的だった指を動かすことに成功しました。

SteamVR Inputでコントローラーの設定をしたときに、保存はしたもののReplace Default Binding(日本語:デフォルトバインドの置換)というボタンを押していなかったことが原因でした。

投稿2019/10/03 01:29

ra7ra7_430

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問