画面のUIとして縦に表示させているスライダーを
VIVEのコントローラーのトリガーを押しながら上下に動かすとスライダーを上下に動かせるようにしたいと考えています。
プログラムを作って実行してみたのですが、トリガーを押しながら動かしても、スライダーは動いてくれません。
エラーは出ていないので、単純に動かないプログラムになってしまっていると思うのですが、
プログラミングは得意ではないため、自分の実力ではどこが間違っているのかわかりませんでした。
プログラム内では、コントローラーのy座標のみ使います。
y座標が上昇すると、スライダーも上に動き、
y座標が下降すると、スライダーが下に動くようにしたいです。
使用するy座標の範囲は、だいたい1.02.0の間です。10にしたときに、y座標が0.1ごとに変化するごとに、
なので、音量全体を0
スライダーの数値を1ずつ変わるようにしたいです。
プログラム全体は下記のようになっています。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.XR; 6using Valve.VR; 7using System; 8 9 10public class VolumeController : MonoBehaviour 11{ 12 Slider volumeSlider; 13 14 //左コントローラの1フレーム前の位置座標格納用 15 private float LeftHandPosition1; 16 17 18 //トリガーがどれだけ押されているのかを取得するためのsqeezeという関数にSteamVR_Actions.default_Squeezeを固定 19 private SteamVR_Action_Single squeeze = SteamVR_Actions.default_Squeeze; 20 //結果の格納用float型関数 21 private float pullleft; 22 23 private float Max = 10; 24 private float Now; 25 26 // Start is called before the first frame update 27 void Start() 28 { 29 volumeSlider = GetComponent<Slider>(); 30 31 Now = 5; 32 33 volumeSlider.maxValue = Max; 34 volumeSlider.value = Now; 35 } 36 37 // Update is called once per frame 38 void Update() 39 { 40 //現在の左コントローラの位置座標格納 41 Vector3 LeftHandPosition; 42 43 //LeftHand(左コントローラ)の情報を一時保管 44 //位置座標を取得 45 LeftHandPosition = InputTracking.GetLocalPosition(XRNode.LeftHand); 46 47 48 49 50 51 //結果をGetLastAxisで取得してpullleftに格納 52 //SteamVR_Input_Sources.機器名(ここは左コントローラ) 53 pullleft = squeeze.GetLastAxis(SteamVR_Input_Sources.LeftHand); 54 55 56 57 float after = LeftHandPosition.y; 58 // float before = LeftHandPosition1.y; 59 float ydifference = after - LeftHandPosition1; 60 if (pullleft > 0.5) 61 { 62 if (0.1 <= ydifference) 63 { 64 Now += 1f; 65 volumeSlider.value = Now; 66 } 67 else if( -0.1 >= ydifference) 68 { 69 Now -= 1f; 70 volumeSlider.value = Now; 71 } 72 73 } 74 75 LeftHandPosition1 = after;//現在の座標を1フレーム前の座標として保管 76 77 78 } 79 80 public void Method() 81 { 82 Debug.Log("現在値:" + volumeSlider.value); 83 84 } 85} 86 87
下記の部分で、スライダー操作を行えるようにしたいと思っています。
C#
1float after = LeftHandPosition.y;//現在の座標 2 // LeftHandPosition1.y:1フレーム前の座標 3 float ydifference = after - LeftHandPosition1; 4 if (pullleft > 0.5) 5 { 6 if (0.1 <= ydifference) 7 { 8 Now += 1f; 9 volumeSlider.value = Now; 10 } 11 else if( -0.1 >= ydifference) 12 { 13 Now -= 1f; 14 volumeSlider.value = Now; 15 } 16 17 } 18 19 LeftHandPosition1 = after;//現在の座標を1フレーム前の座標として保管
イメージとしては、トリガーを0.5以上深く押していたら、
現在の座標と1フレーム前の座標の差を求め、
その差が0.1以上なら、スライダーを1上に動かし、
0.1以下なら、スライダーを1下に動かすといったプログラムにしたいです。
よろしくお願いします。
VIVEのコントローラーの座標を取得する方法としては、下記のサイトを参考にさせていただいています。
URL : https://qiita.com/RyoyaHase/items/325e7250c01f47e7e63b
スライダー操作の部分は、下記のサイトを参考にさせていただいています。
URL:https://note.spage.jp/archives/268
環境
Unity2019.1.4f1
VIVE
SteamVR Ver.1.16.10
あなたの回答
tips
プレビュー