前提・実現したいこと
純文系人間ですが、仕事の一環で初めてのプログラミングをしております。
知識不足のため質問内容などわかりにくいところがあるかと思いますが、ご回答いただければ幸いです。
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。