I_Jemin

Support both VRTrigger and VRTriggerDown

...@@ -12,12 +12,12 @@ public class GunController : MonoBehaviour { ...@@ -12,12 +12,12 @@ public class GunController : MonoBehaviour {
12 12
13 void Update() 13 void Update()
14 { 14 {
15 - if(VRInput.GetTriggerButton(VRInput.Hand.Right)) 15 + if(VRInput.GetVRButtonDown(VRInput.Button.RightIndex))
16 { 16 {
17 gun.Fire(); 17 gun.Fire();
18 } 18 }
19 19
20 - if(VRInput.GetGripButton(VRInput.Hand.Right)) 20 + if(VRInput.GetVRButtonDown(VRInput.Button.RightGrip))
21 { 21 {
22 gun.Reload(); 22 gun.Reload();
23 } 23 }
......
...@@ -21,11 +21,9 @@ public class VREyeRaycaster : MonoBehaviour ...@@ -21,11 +21,9 @@ public class VREyeRaycaster : MonoBehaviour
21 { 21 {
22 EyeRaycast(); 22 EyeRaycast();
23 23
24 - if(VRInput.GetTriggerButton(VRInput.Hand.Right)) 24 + if(VRInput.GetVRButtonDown(VRInput.Button.LeftIndex))
25 { 25 {
26 - // Xbox 나 VR 컨트롤러의 'A' 키를 누르면 인터렉터블 오브젝트의 OnClick 이벤트를 발동시킴 26 + if(m_CurrentInteractible)
27 - // TODO: VR 컨트롤러의 트리거 버튼 클릭으로 대체
28 - if(m_CurrentInteractible && Input.GetButtonDown("Fire1"))
29 { 27 {
30 m_CurrentInteractible.OnClick(); 28 m_CurrentInteractible.OnClick();
31 } 29 }
......
...@@ -3,11 +3,35 @@ using System.Collections.Generic; ...@@ -3,11 +3,35 @@ using System.Collections.Generic;
3 using UnityEngine; 3 using UnityEngine;
4 using UnityEngine.XR; 4 using UnityEngine.XR;
5 5
6 -// VR 컨트롤러의 입력을 GetVRTriggerButton 과 GetVRGripButton 로 제공하는 클래스 6 +// VR 컨트롤러의 입력 감지를 GetButton 함수로 제공하는 클래스
7 -public static class VRInput { 7 +public class VRInput: MonoBehaviour {
8 8
9 - public enum Hand {Left,Right}; 9 + private static VRInput m_instance;
10 10
11 + public static VRInput instance
12 + {
13 + get
14 + {
15 + if (!m_instance)
16 + {
17 + m_instance = new GameObject("VRInput").AddComponent<VRInput>();
18 + }
19 +
20 + return m_instance;
21 + }
22 + }
23 +
24 + private void Start()
25 + {
26 + if (m_instance != null && m_instance != this)
27 + {
28 + Debug.LogError("There are more than one VRInput instance");
29 + DestroyImmediate(this);
30 + }
31 + }
32 +
33 +
34 + public enum Button {LeftIndex,RightIndex,LeftGrip,RightGrip};
11 35
12 /* 36 /*
13 유니티는 OpenVR API 를 내장하고 있다. 37 유니티는 OpenVR API 를 내장하고 있다.
...@@ -41,60 +65,185 @@ public static class VRInput { ...@@ -41,60 +65,185 @@ public static class VRInput {
41 65
42 //왼손 66 //왼손
43 // 검지 손가락 트리거에 대응되는 입력 세팅 이름 67 // 검지 손가락 트리거에 대응되는 입력 세팅 이름
44 - static string leftIndexTriggerName = "LeftIndexTrigger"; 68 + public static string leftIndexTriggerName = "LeftIndexTrigger";
45 // 쥐는 트리거에 대응되는 입력 세팅 이름 69 // 쥐는 트리거에 대응되는 입력 세팅 이름
46 - static string leftGripTriggerName = "LeftGripTrigger"; 70 + public static string leftGripTriggerName = "LeftGripTrigger";
47 71
48 72
49 -
50 // 오른손 73 // 오른손
51 // 검지 손가락 트리거에 대응되는 입력 세팅 이름 74 // 검지 손가락 트리거에 대응되는 입력 세팅 이름
52 - static string rightIndexTriggerName = "RightIndexTrigger"; 75 + public string rightIndexTriggerName = "RightIndexTrigger";
53 // 쥐는 트리거에 대응되는 입력 세팅 이름 76 // 쥐는 트리거에 대응되는 입력 세팅 이름
54 - static string rightGripTriggerName = "RightGripTrigger"; 77 + public string rightGripTriggerName = "RightGripTrigger";
55 78
56 79
57 - // 편의를 위해 정적 함수로 입력을 제공 80 + private bool m_isLeftIndexTriggerDown;
58 - public static bool GetTriggerButton(Hand hand) 81 + private bool m_isLeftIndexTriggerStay;
82 +
83 +
84 + private bool m_isRightIndexTriggerDown;
85 + private bool m_isRightIndexTriggerStay;
86 +
87 +
88 + private bool m_isLeftGripTriggerDown;
89 + private bool m_isLeftGripTriggerStay;
90 +
91 +
92 + private bool m_isRightGripTriggerDown;
93 + private bool m_isRightGripTriggerStay;
94 +
95 +
96 + void Awake()
97 + {
98 + m_isRightIndexTriggerDown = false;
99 + m_isRightIndexTriggerStay = false;
100 +
101 + m_isRightGripTriggerDown = false;
102 + m_isRightGripTriggerStay = false;
103 +
104 + m_isLeftIndexTriggerDown = false;
105 + m_isLeftIndexTriggerStay = false;
106 +
107 + m_isLeftGripTriggerDown = false;
108 + m_isLeftGripTriggerStay = false;
109 + }
110 +
111 +
112 + public static bool GetVRButtonDown(Button button)
113 + {
114 + switch (button)
115 + {
116 + case Button.LeftIndex:
117 + return instance.m_isLeftIndexTriggerDown;
118 +
119 + case Button.LeftGrip:
120 + return instance.m_isLeftGripTriggerDown;
121 +
122 + case Button.RightIndex:
123 + return instance.m_isRightIndexTriggerDown;
124 +
125 + case Button.RightGrip:
126 + return instance.m_isRightGripTriggerDown;
127 + }
128 +
129 + return false;
130 + }
131 +
132 +
133 + public static bool GetVRButton(Button button)
134 + {
135 + switch (button)
136 + {
137 + case Button.LeftIndex:
138 + return instance.m_isLeftIndexTriggerStay;
139 +
140 + case Button.LeftGrip:
141 + return instance.m_isLeftGripTriggerStay;
142 +
143 + case Button.RightIndex:
144 + return instance.m_isRightIndexTriggerStay;
145 +
146 + case Button.RightGrip:
147 + return instance.m_isRightGripTriggerStay;
148 + }
149 +
150 + return false;
151 + }
152 +
153 +
154 + void Update()
155 + {
156 + UpdateIndexState();
157 + UpdateGripState();
158 +
159 + }
160 +
161 + void UpdateIndexState()
59 { 162 {
60 - if(hand == Hand.Right) 163 +
164 + if(Input.GetAxisRaw(rightIndexTriggerName) >= 0.1f)
61 { 165 {
62 - if(Input.GetAxisRaw(rightIndexTriggerName) >= 0.1f) 166 + if(m_isRightIndexTriggerDown || m_isRightIndexTriggerStay)
167 + {
168 + m_isRightIndexTriggerDown = false;
169 + }
170 + else
63 { 171 {
64 - return true; 172 + m_isRightIndexTriggerDown = true;
65 } 173 }
174 +
175 + m_isRightIndexTriggerStay = true;
176 + }
177 + else
178 + {
179 + m_isRightIndexTriggerDown = false;
180 + m_isRightIndexTriggerStay = false;
66 } 181 }
67 - else if(hand == Hand.Left) 182 +
183 +
184 + if(Input.GetAxisRaw(leftIndexTriggerName) >= 0.1f)
68 { 185 {
69 - if(Input.GetAxisRaw(leftIndexTriggerName) >= 0.1f) 186 + if(m_isLeftIndexTriggerDown || m_isLeftIndexTriggerStay)
187 + {
188 + m_isLeftIndexTriggerDown = false;
189 + }
190 + else
70 { 191 {
71 - return true; 192 + m_isLeftIndexTriggerDown = true;
72 } 193 }
194 +
195 + m_isLeftIndexTriggerStay = true;
196 + }
197 + else
198 + {
199 + m_isLeftIndexTriggerDown = false;
200 + m_isLeftIndexTriggerStay = false;
73 } 201 }
74 -
75 - return false;
76 } 202 }
77 203
78 - 204 + void UpdateGripState()
79 - public static bool GetGripButton(Hand hand)
80 { 205 {
81 - if(hand == Hand.Right) 206 +
207 +
208 + if(Input.GetAxisRaw(rightGripTriggerName) >= 0.1f)
82 { 209 {
83 - if(Input.GetAxisRaw(rightGripTriggerName) >= 0.1f) 210 + if(m_isRightGripTriggerDown || m_isRightGripTriggerStay)
211 + {
212 + m_isRightGripTriggerDown = false;
213 + }
214 + else
84 { 215 {
85 - return true; 216 + m_isRightGripTriggerDown = true;
86 } 217 }
218 +
219 + m_isRightGripTriggerStay = true;
87 } 220 }
88 - else if(hand == Hand.Left) 221 + else
89 { 222 {
90 - if(Input.GetAxisRaw(leftGripTriggerName) >= 0.1f) 223 + m_isRightGripTriggerDown = false;
224 + m_isRightGripTriggerStay = false;
225 + }
226 +
227 +
228 + if(Input.GetAxisRaw(leftGripTriggerName) >= 0.1f)
229 + {
230 + if(m_isLeftGripTriggerDown || m_isLeftGripTriggerStay)
231 + {
232 + m_isLeftGripTriggerDown = false;
233 + }
234 + else
91 { 235 {
92 - return true; 236 + m_isLeftGripTriggerDown = true;
93 } 237 }
238 +
239 + m_isLeftGripTriggerStay = true;
240 + }
241 + else
242 + {
243 + m_isLeftGripTriggerDown = false;
244 + m_isLeftGripTriggerStay = false;
94 } 245 }
95 -
96 - return false;
97 } 246 }
98 247
99 - //TODO GetTriggerDown 과 GetTriggerUp 만들기 248 +
100 } 249 }
......