質問編集履歴

4

タグにC#を追加しました

2021/07/13 09:37

投稿

ameshikou
ameshikou

スコア8

test CHANGED
File without changes
test CHANGED
File without changes

3

プログラム内容のミスを修正しました。

2021/07/13 09:37

投稿

ameshikou
ameshikou

スコア8

test CHANGED
File without changes
test CHANGED
@@ -160,7 +160,7 @@
160
160
 
161
161
  {
162
162
 
163
- Now += 0.1f;
163
+ Now += 1f;
164
164
 
165
165
  volumeSlider.value = Now;
166
166
 
@@ -170,7 +170,7 @@
170
170
 
171
171
  {
172
172
 
173
- Now -= 0.1f;
173
+ Now -= 1f;
174
174
 
175
175
  volumeSlider.value = Now;
176
176
 
@@ -232,7 +232,7 @@
232
232
 
233
233
  {
234
234
 
235
- Now += 0.1f;
235
+ Now += 1f;
236
236
 
237
237
  volumeSlider.value = Now;
238
238
 
@@ -242,7 +242,7 @@
242
242
 
243
243
  {
244
244
 
245
- Now -= 0.1f;
245
+ Now -= 1f;
246
246
 
247
247
  volumeSlider.value = Now;
248
248
 

2

質問内容を具体的に記入しました。

2021/07/13 08:48

投稿

ameshikou
ameshikou

スコア8

test CHANGED
@@ -1 +1 @@
1
- UnityのスライダーをVIVEのコントローラーで動かしたい
1
+ UnityのスライダーをVIVEのコントローラーで動かしたいが動かない
test CHANGED
@@ -20,6 +20,14 @@
20
20
 
21
21
 
22
22
 
23
+ 使用するy座標の範囲は、だいたい1.0~2.0の間です。
24
+
25
+ なので、音量全体を0~10にしたときに、y座標が0.1ごとに変化するごとに、
26
+
27
+ スライダーの数値を1ずつ変わるようにしたいです。
28
+
29
+
30
+
23
31
  プログラム全体は下記のようになっています。
24
32
 
25
33
 
@@ -52,111 +60,175 @@
52
60
 
53
61
 
54
62
 
63
+ //左コントローラの1フレーム前の位置座標格納用
64
+
65
+ private float LeftHandPosition1;
66
+
67
+
68
+
69
+
70
+
71
+ //トリガーがどれだけ押されているのかを取得するためのsqeezeという関数にSteamVR_Actions.default_Squeezeを固定
72
+
73
+ private SteamVR_Action_Single squeeze = SteamVR_Actions.default_Squeeze;
74
+
75
+ //結果の格納用float型関数
76
+
77
+ private float pullleft;
78
+
79
+
80
+
81
+ private float Max = 10;
82
+
83
+ private float Now;
84
+
85
+
86
+
87
+ // Start is called before the first frame update
88
+
89
+ void Start()
90
+
91
+ {
92
+
93
+ volumeSlider = GetComponent<Slider>();
94
+
95
+
96
+
97
+ Now = 5;
98
+
99
+
100
+
101
+ volumeSlider.maxValue = Max;
102
+
103
+ volumeSlider.value = Now;
104
+
105
+ }
106
+
107
+
108
+
109
+ // Update is called once per frame
110
+
111
+ void Update()
112
+
113
+ {
114
+
115
+ //現在の左コントローラの位置座標格納
116
+
117
+ Vector3 LeftHandPosition;
118
+
55
119
 
56
120
 
57
- //左コントローラの1フレーム前の位置座標格納用
121
+ //LeftHand(左コントローラ情報を一時保管
122
+
58
-
123
+ //位置座標を取得
124
+
125
+ LeftHandPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+ //結果をGetLastAxisで取得してpullleftに格納
138
+
139
+ //SteamVR_Input_Sources.機器名(ここは左コントローラ)
140
+
141
+ pullleft = squeeze.GetLastAxis(SteamVR_Input_Sources.LeftHand);
142
+
143
+
144
+
145
+
146
+
147
+
148
+
59
- private float LeftHandPosition1;
149
+ float after = LeftHandPosition.y;
60
-
61
-
62
-
63
-
64
-
65
- //トリガーがどれだけ押されているのかを取得するためのsqeezeという関数にSteamVR_Actions.default_Squeezeを固定
150
+
66
-
67
- private SteamVR_Action_Single squeeze = SteamVR_Actions.default_Squeeze;
68
-
69
- //結果の格納用floot型関数
70
-
71
- private float pullleft;
72
-
73
-
74
-
75
-
76
-
77
- private float Max = 10;
78
-
79
- private float Now;
80
-
81
-
82
-
83
- // Start is called before the first frame update
151
+ // float before = LeftHandPosition1.y;
152
+
84
-
153
+ float ydifference = after - LeftHandPosition1;
154
+
155
+ if (pullleft > 0.5)
156
+
157
+ {
158
+
159
+ if (0.1 <= ydifference)
160
+
161
+ {
162
+
163
+ Now += 0.1f;
164
+
165
+ volumeSlider.value = Now;
166
+
167
+ }
168
+
169
+ else if( -0.1 >= ydifference)
170
+
171
+ {
172
+
173
+ Now -= 0.1f;
174
+
175
+ volumeSlider.value = Now;
176
+
177
+ }
178
+
179
+
180
+
181
+ }
182
+
183
+
184
+
185
+ LeftHandPosition1 = after;//現在の座標を1フレーム前の座標として保管
186
+
187
+
188
+
189
+
190
+
191
+ }
192
+
193
+
194
+
85
- void Start()
195
+ public void Method()
86
196
 
87
197
  {
88
198
 
89
- volumeSlider = GetComponent<Slider>();
199
+ Debug.Log("現在値:" + volumeSlider.value);
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
- Now = 5;
200
+
98
-
99
-
100
-
101
- volumeSlider.maxValue = Max;
201
+
102
-
103
- volumeSlider.value = Now;
104
202
 
105
203
  }
106
204
 
107
-
108
-
109
- // Update is called once per frame
110
-
111
- void Update()
112
-
113
- {
205
+ }
206
+
207
+
208
+
209
+
210
+
114
-
211
+ ```
212
+
213
+
214
+
115
- //現在左コントロラの位置座標格納
215
+ 下記部分で、スライダ操作を行えるようにしたいと思っています。
116
-
117
- Vector3 LeftHandPosition;
216
+
118
-
119
-
120
-
121
- //LeftHand(左コントローラ)の情報を一時保管
217
+
122
-
218
+
123
- //位置座標を取得
219
+ ```C#
124
-
125
- LeftHandPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
220
+
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
- //結果をGetLastAxisで取得してpullleftに格納(トリガー関連)
138
-
139
- //SteamVR_Input_Sources.機器名(ここは左コントローラ)
140
-
141
- pullleft = squeeze.GetLastAxis(SteamVR_Input_Sources.LeftHand);
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
- float after = LeftHandPosition.y;
221
+ float after = LeftHandPosition.y;//現在の座標
150
-
222
+
151
- // float before = LeftHandPosition1.y;
223
+ // LeftHandPosition1.y:1フレーム前の座標
152
-
224
+
153
- float ydifference = LeftHandPosition1 - after;
225
+ float ydifference = after - LeftHandPosition1;
154
226
 
155
227
  if (pullleft > 0.5)
156
228
 
157
229
  {
158
230
 
159
- if (-0.1 > ydifference)
231
+ if (0.1 <= ydifference)
160
232
 
161
233
  {
162
234
 
@@ -166,7 +238,7 @@
166
238
 
167
239
  }
168
240
 
169
- else if( 0.1 < ydifference)
241
+ else if( -0.1 >= ydifference)
170
242
 
171
243
  {
172
244
 
@@ -182,77 +254,21 @@
182
254
 
183
255
 
184
256
 
185
- LeftHandPosition1 = after;
257
+ LeftHandPosition1 = after;//現在の座標を1フレーム前の座標として保管
186
-
187
-
188
-
189
-
190
-
191
- }
192
-
193
-
194
-
195
- public void Method()
196
-
197
- {
198
-
199
- Debug.Log("現在値:" + volumeSlider.value);
200
-
201
- }
202
-
203
- }
204
-
205
-
206
258
 
207
259
  ```
208
260
 
209
261
 
210
262
 
263
+
264
+
265
+ イメージとしては、トリガーを0.5以上深く押していたら、
266
+
267
+ 現在の座標と1フレーム前の座標の差を求め、
268
+
269
+ その差が0.1以上なら、スライダーを1上に動かし、
270
+
211
- 記の部分で、スライダー操作行えるようにしたいと思っています。
271
+ 0.1以なら、スライダーを1下動かすといったプログラムにしたいす。
212
-
213
-
214
-
215
- ```C#
216
-
217
- float after = LeftHandPosition.y;
218
-
219
- // float before = LeftHandPosition1.y;
220
-
221
- float ydifference = LeftHandPosition1 - after;
222
-
223
- if (pullleft > 0.5)
224
-
225
- {
226
-
227
- if (-0.1 > ydifference)
228
-
229
- {
230
-
231
- Now += 0.1f;
232
-
233
- volumeSlider.value = Now;
234
-
235
- }
236
-
237
- else if( 0.1 < ydifference)
238
-
239
- {
240
-
241
- Now -= 0.1f;
242
-
243
- volumeSlider.value = Now;
244
-
245
- }
246
-
247
-
248
-
249
- }
250
-
251
-
252
-
253
- LeftHandPosition1 = after;
254
-
255
- ```
256
272
 
257
273
 
258
274
 
@@ -283,3 +299,5 @@
283
299
  Unity2019.1.4f1
284
300
 
285
301
  VIVE
302
+
303
+ SteamVR Ver.1.16.10

1

質問内容を改善しました。

2021/07/13 08:35

投稿

ameshikou
ameshikou

スコア8

test CHANGED
File without changes
test CHANGED
@@ -1,18 +1,258 @@
1
- 私は現在、UnityでVRゲームを作っています。
2
-
3
- その中で、画面のUIとして縦に表示させているスライダーを
1
+ 画面のUIとして縦に表示させているスライダーを
4
2
 
5
3
  VIVEのコントローラーのトリガーを押しながら上下に動かすとスライダーを上下に動かせるようにしたいと考えています。
6
4
 
7
5
 
8
6
 
7
+ プログラムを作って実行してみたのですが、トリガーを押しながら動かしても、スライダーは動いてくれません。
8
+
9
+ エラーは出ていないので、単純に動かないプログラムになってしまっていると思うのですが、
10
+
9
- 私自身、あまりプログラミング得意ではないため、いざ挑戦してみたもの、うすればのかわかりません。
11
+ プログラミング得意ではないため、自分実力ではこが間違ってのかわかりませんでした
12
+
13
+
14
+
10
-
15
+ プログラム内では、コントローラーのy座標のみ使います。
16
+
17
+ y座標が上昇すると、スライダーも上に動き、
18
+
19
+ y座標が下降すると、スライダーが下に動くようにしたいです。
20
+
21
+
22
+
23
+ プログラム全体は下記のようになっています。
24
+
25
+
26
+
27
+ ```C#
28
+
29
+ using System.Collections;
30
+
31
+ using System.Collections.Generic;
32
+
33
+ using UnityEngine;
34
+
35
+ using UnityEngine.UI;
36
+
37
+ using UnityEngine.XR;
38
+
39
+ using Valve.VR;
40
+
41
+ using System;
42
+
43
+
44
+
45
+
46
+
47
+ public class VolumeController : MonoBehaviour
48
+
49
+ {
50
+
51
+ Slider volumeSlider;
52
+
53
+
54
+
55
+
56
+
57
+ //左コントローラの1フレーム前の位置座標格納用
58
+
59
+ private float LeftHandPosition1;
60
+
61
+
62
+
63
+
64
+
65
+ //トリガーがどれだけ押されているのかを取得するためのsqeezeという関数にSteamVR_Actions.default_Squeezeを固定
66
+
67
+ private SteamVR_Action_Single squeeze = SteamVR_Actions.default_Squeeze;
68
+
69
+ //結果の格納用floot型関数
70
+
71
+ private float pullleft;
72
+
73
+
74
+
75
+
76
+
77
+ private float Max = 10;
78
+
79
+ private float Now;
80
+
81
+
82
+
83
+ // Start is called before the first frame update
84
+
85
+ void Start()
86
+
87
+ {
88
+
89
+ volumeSlider = GetComponent<Slider>();
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+ Now = 5;
98
+
99
+
100
+
101
+ volumeSlider.maxValue = Max;
102
+
103
+ volumeSlider.value = Now;
104
+
105
+ }
106
+
107
+
108
+
109
+ // Update is called once per frame
110
+
111
+ void Update()
112
+
113
+ {
114
+
115
+ //現在の左コントローラの位置座標格納
116
+
117
+ Vector3 LeftHandPosition;
118
+
119
+
120
+
121
+ //LeftHand(左コントローラ)の情報を一時保管
122
+
123
+ //位置座標を取得
124
+
125
+ LeftHandPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
11
- 様々なサイトしてみましたが、参考なるものを見つけることができず、こちらで質問させていただきました。
137
+ //結果GetLastAxisで取得してpullleft格納(トリガー関連)
12
-
13
-
14
-
138
+
15
- 何か、んなやり方があるよ、んな使い方をするといいよというものがあれば、知識をぜひお貸しいただきたいです。
139
+ //SteamVR_Input_Sources.機器名(ここは左コントローラ)
140
+
141
+ pullleft = squeeze.GetLastAxis(SteamVR_Input_Sources.LeftHand);
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+ float after = LeftHandPosition.y;
150
+
151
+ // float before = LeftHandPosition1.y;
152
+
153
+ float ydifference = LeftHandPosition1 - after;
154
+
155
+ if (pullleft > 0.5)
156
+
157
+ {
158
+
159
+ if (-0.1 > ydifference)
160
+
161
+ {
162
+
163
+ Now += 0.1f;
164
+
165
+ volumeSlider.value = Now;
166
+
167
+ }
168
+
169
+ else if( 0.1 < ydifference)
170
+
171
+ {
172
+
173
+ Now -= 0.1f;
174
+
175
+ volumeSlider.value = Now;
176
+
177
+ }
178
+
179
+
180
+
181
+ }
182
+
183
+
184
+
185
+ LeftHandPosition1 = after;
186
+
187
+
188
+
189
+
190
+
191
+ }
192
+
193
+
194
+
195
+ public void Method()
196
+
197
+ {
198
+
199
+ Debug.Log("現在値:" + volumeSlider.value);
200
+
201
+ }
202
+
203
+ }
204
+
205
+
206
+
207
+ ```
208
+
209
+
210
+
211
+ 下記の部分で、スライダー操作を行えるようにしたいと思っています。
212
+
213
+
214
+
215
+ ```C#
216
+
217
+ float after = LeftHandPosition.y;
218
+
219
+ // float before = LeftHandPosition1.y;
220
+
221
+ float ydifference = LeftHandPosition1 - after;
222
+
223
+ if (pullleft > 0.5)
224
+
225
+ {
226
+
227
+ if (-0.1 > ydifference)
228
+
229
+ {
230
+
231
+ Now += 0.1f;
232
+
233
+ volumeSlider.value = Now;
234
+
235
+ }
236
+
237
+ else if( 0.1 < ydifference)
238
+
239
+ {
240
+
241
+ Now -= 0.1f;
242
+
243
+ volumeSlider.value = Now;
244
+
245
+ }
246
+
247
+
248
+
249
+ }
250
+
251
+
252
+
253
+ LeftHandPosition1 = after;
254
+
255
+ ```
16
256
 
17
257
 
18
258
 
@@ -30,6 +270,14 @@
30
270
 
31
271
 
32
272
 
273
+ スライダー操作の部分は、下記のサイトを参考にさせていただいています。
274
+
275
+
276
+
277
+ URL:https://note.spage.jp/archives/268
278
+
279
+
280
+
33
281
  環境
34
282
 
35
283
  Unity2019.1.4f1