2021년 4학년 1학기 기업연계프로젝트2 컴퓨터소프트웨어공학과 <원광투어팀> 팀장 : 송유진 팀원 : 김나영, 이경희, 한유진
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

498 lines
17 KiB

5 years ago
  1. //========= Copyright 2016-2020, HTC Corporation. All rights reserved. ===========
  2. using HTC.UnityPlugin.Utility;
  3. using HTC.UnityPlugin.Vive;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. public class ControllerManagerSample : MonoBehaviour
  7. {
  8. public enum CustomModelActiveModeEnum
  9. {
  10. None,
  11. ActiveOnGripped,
  12. ToggleByDoubleGrip
  13. }
  14. public enum LaserPointerActiveModeEnum
  15. {
  16. None,
  17. ToggleByMenuClick,
  18. ActiveOnPadPressed,
  19. ToggleByTriggerClick
  20. }
  21. public enum CurvePointerActiveModeEnum
  22. {
  23. None,
  24. ActiveOnPadPressed,
  25. ToggleByPadDoubleClick
  26. }
  27. // after changing following public fields in playing mode, call UpdateStatus() to apply changes
  28. [Header("Mode Settings")]
  29. public bool hideRenderModelOnGrab = true;
  30. public CustomModelActiveModeEnum customModelActiveMode;
  31. public LaserPointerActiveModeEnum laserPointerActiveMode;
  32. public CurvePointerActiveModeEnum curvePointerActiveMode;
  33. [Header("Right controller")]
  34. public GameObject rightRenderModel;
  35. public GameObject rightCustomModel;
  36. public GameObject rightGrabber;
  37. public GameObject rightLaserPointer;
  38. public GameObject rightCurvePointer;
  39. [Header("Left controller")]
  40. public GameObject leftRenderModel;
  41. public GameObject leftCustomModel;
  42. public GameObject leftGrabber;
  43. public GameObject leftLaserPointer;
  44. public GameObject leftCurvePointer;
  45. private bool m_rightCustomModelActive;
  46. private bool m_rightLaserPointerActive;
  47. private bool m_rightCurvePointerActive;
  48. private bool m_leftCustomModelActive;
  49. private bool m_leftLaserPointerActive;
  50. private bool m_leftCurvePointerActive;
  51. private bool isLeftStickyGrab = false;
  52. private bool isRightStickyGrab = false;
  53. private HashSet<GameObject> rightGrabbingSet = new HashSet<GameObject>();
  54. private HashSet<GameObject> leftGrabbingSet = new HashSet<GameObject>();
  55. //properties
  56. public bool rightGrabberActive
  57. {
  58. get { return !m_rightLaserPointerActive && !m_rightCurvePointerActive && !m_rightCustomModelActive; }
  59. }
  60. public bool rightLaserPointerActive
  61. {
  62. get { return m_rightLaserPointerActive; }
  63. set { SetRightLaserPointerActive(value); }
  64. }
  65. public bool rightCurvePointerActive
  66. {
  67. get { return m_rightCurvePointerActive; }
  68. set { SetRightCurvePointerActive(value); }
  69. }
  70. public bool rightCustomModelActive
  71. {
  72. get { return m_rightCustomModelActive; }
  73. set { SetRightCustomModelActive(value); }
  74. }
  75. public bool leftGrabberActive
  76. {
  77. get { return !m_leftLaserPointerActive && !m_leftCurvePointerActive && !m_leftCustomModelActive; }
  78. }
  79. public bool leftLaserPointerActive
  80. {
  81. get { return m_leftLaserPointerActive; }
  82. set { SetLeftLaserPointerActive(value); }
  83. }
  84. public bool leftCurvePointerActive
  85. {
  86. get { return m_leftCurvePointerActive; }
  87. set { SetLeftLaserPointerActive(value); }
  88. }
  89. public bool leftCustomModelActive
  90. {
  91. get { return m_leftCustomModelActive; }
  92. set { SetLeftCustomModelActive(value); }
  93. }
  94. public bool SetRightLaserPointerActive(bool value)
  95. {
  96. if (ChangeProp.Set(ref m_rightLaserPointerActive, value))
  97. {
  98. if (value) { m_rightCurvePointerActive = false; m_rightCustomModelActive = false; }
  99. return true;
  100. }
  101. return false;
  102. }
  103. public bool SetRightCurvePointerActive(bool value)
  104. {
  105. if (ChangeProp.Set(ref m_rightCurvePointerActive, value))
  106. {
  107. if (value) { m_rightLaserPointerActive = false; m_rightCustomModelActive = false; }
  108. return true;
  109. }
  110. return false;
  111. }
  112. public bool SetRightCustomModelActive(bool value)
  113. {
  114. if (ChangeProp.Set(ref m_rightCustomModelActive, value))
  115. {
  116. if (value) { m_rightLaserPointerActive = false; m_rightCurvePointerActive = false; }
  117. return true;
  118. }
  119. return false;
  120. }
  121. public bool SetLeftLaserPointerActive(bool value)
  122. {
  123. if (ChangeProp.Set(ref m_leftLaserPointerActive, value))
  124. {
  125. if (value) { m_leftCurvePointerActive = false; m_leftCustomModelActive = false; }
  126. return true;
  127. }
  128. return false;
  129. }
  130. public bool SetLeftCurvePointerActive(bool value)
  131. {
  132. if (ChangeProp.Set(ref m_leftCurvePointerActive, value))
  133. {
  134. if (value) { m_leftLaserPointerActive = false; m_leftCustomModelActive = false; }
  135. return true;
  136. }
  137. return false;
  138. }
  139. public bool SetLeftCustomModelActive(bool value)
  140. {
  141. if (ChangeProp.Set(ref m_leftCustomModelActive, value))
  142. {
  143. if (value) { m_leftLaserPointerActive = false; m_leftCurvePointerActive = false; }
  144. return true;
  145. }
  146. return false;
  147. }
  148. public void ToggleRightLaserPointer() { rightLaserPointerActive = !rightLaserPointerActive; }
  149. public void ToggleRightCurvePointer() { rightCurvePointerActive = !rightCurvePointerActive; }
  150. public void ToggleRightCustomModel() { rightCustomModelActive = !rightCustomModelActive; }
  151. public void ToggleLeftLaserPointer() { leftLaserPointerActive = !leftLaserPointerActive; }
  152. public void ToggleLeftCurvePointer() { leftCurvePointerActive = !leftCurvePointerActive; }
  153. public void ToggleLeftCustomModel() { leftCustomModelActive = !leftCustomModelActive; }
  154. #if UNITY_EDITOR
  155. protected virtual void OnValidate()
  156. {
  157. if (Application.isPlaying)
  158. {
  159. UpdateActivity();
  160. }
  161. }
  162. #endif
  163. protected virtual void Start()
  164. {
  165. m_rightLaserPointerActive = false;
  166. m_rightCustomModelActive = false;
  167. m_rightCurvePointerActive = false;
  168. m_leftLaserPointerActive = false;
  169. m_leftCustomModelActive = false;
  170. m_leftCurvePointerActive = false;
  171. UpdateActivity();
  172. }
  173. protected virtual void LateUpdate()
  174. {
  175. var needUpdate = false;
  176. switch (laserPointerActiveMode)
  177. {
  178. case LaserPointerActiveModeEnum.None:
  179. needUpdate |= SetRightLaserPointerActive(false);
  180. needUpdate |= SetLeftLaserPointerActive(false);
  181. break;
  182. case LaserPointerActiveModeEnum.ToggleByMenuClick:
  183. if (ViveInput.GetPressUpEx(HandRole.RightHand, ControllerButton.Menu))
  184. {
  185. ToggleRightLaserPointer();
  186. needUpdate = true;
  187. }
  188. if (ViveInput.GetPressUpEx(HandRole.LeftHand, ControllerButton.Menu))
  189. {
  190. ToggleLeftLaserPointer();
  191. needUpdate = true;
  192. }
  193. break;
  194. case LaserPointerActiveModeEnum.ToggleByTriggerClick:
  195. if (ViveInput.GetPressUpEx(HandRole.RightHand, ControllerButton.Trigger))
  196. {
  197. ToggleRightLaserPointer();
  198. needUpdate = true;
  199. }
  200. if (ViveInput.GetPressUpEx(HandRole.LeftHand, ControllerButton.Trigger))
  201. {
  202. ToggleLeftLaserPointer();
  203. needUpdate = true;
  204. }
  205. break;
  206. case LaserPointerActiveModeEnum.ActiveOnPadPressed:
  207. needUpdate |= SetRightLaserPointerActive(ViveInput.GetPressEx(HandRole.RightHand, ControllerButton.Pad));
  208. needUpdate |= SetLeftLaserPointerActive(ViveInput.GetPressEx(HandRole.LeftHand, ControllerButton.Pad));
  209. break;
  210. }
  211. switch (curvePointerActiveMode)
  212. {
  213. case CurvePointerActiveModeEnum.None:
  214. needUpdate |= SetRightCurvePointerActive(false);
  215. needUpdate |= SetLeftCurvePointerActive(false);
  216. break;
  217. case CurvePointerActiveModeEnum.ActiveOnPadPressed:
  218. needUpdate |= SetRightCurvePointerActive(ViveInput.GetPressEx(HandRole.RightHand, ControllerButton.Pad));
  219. needUpdate |= SetLeftCurvePointerActive(ViveInput.GetPressEx(HandRole.LeftHand, ControllerButton.Pad));
  220. break;
  221. case CurvePointerActiveModeEnum.ToggleByPadDoubleClick:
  222. if (ViveInput.GetPressDownEx(HandRole.RightHand, ControllerButton.Pad) && ViveInput.ClickCountEx(HandRole.RightHand, ControllerButton.Pad) == 2)
  223. {
  224. ToggleRightCurvePointer();
  225. needUpdate = true;
  226. }
  227. if (ViveInput.GetPressDownEx(HandRole.LeftHand, ControllerButton.Pad) && ViveInput.ClickCountEx(HandRole.LeftHand, ControllerButton.Pad) == 2)
  228. {
  229. ToggleLeftCurvePointer();
  230. needUpdate = true;
  231. }
  232. break;
  233. }
  234. switch (customModelActiveMode)
  235. {
  236. case CustomModelActiveModeEnum.None:
  237. needUpdate |= ChangeProp.Set(ref m_rightCustomModelActive, false);
  238. needUpdate |= ChangeProp.Set(ref m_leftCustomModelActive, false);
  239. break;
  240. case CustomModelActiveModeEnum.ActiveOnGripped:
  241. needUpdate |= SetRightCustomModelActive(ViveInput.GetPressEx(HandRole.RightHand, ControllerButton.Grip));
  242. needUpdate |= SetLeftCustomModelActive(ViveInput.GetPressEx(HandRole.LeftHand, ControllerButton.Grip));
  243. break;
  244. case CustomModelActiveModeEnum.ToggleByDoubleGrip:
  245. if (ViveInput.GetPressDownEx(HandRole.RightHand, ControllerButton.Grip) && ViveInput.ClickCountEx(HandRole.RightHand, ControllerButton.Grip) == 2)
  246. {
  247. ToggleRightCustomModel();
  248. needUpdate = true;
  249. }
  250. if (ViveInput.GetPressDownEx(HandRole.LeftHand, ControllerButton.Grip) && ViveInput.ClickCountEx(HandRole.LeftHand, ControllerButton.Grip) == 2)
  251. {
  252. ToggleLeftCustomModel();
  253. needUpdate = true;
  254. }
  255. break;
  256. }
  257. if (needUpdate) { UpdateActivity(); }
  258. }
  259. public void OnGrabbed(BasicGrabbable grabbedObj)
  260. {
  261. ViveColliderButtonEventData viveEventData;
  262. if (!grabbedObj.grabbedEvent.TryGetViveButtonEventData(out viveEventData)) { return; }
  263. switch (viveEventData.viveRole.ToRole<HandRole>())
  264. {
  265. case HandRole.RightHand:
  266. if (rightGrabbingSet.Add(grabbedObj.gameObject) && rightGrabbingSet.Count == 1)
  267. {
  268. UpdateActivity();
  269. }
  270. break;
  271. case HandRole.LeftHand:
  272. if (leftGrabbingSet.Add(grabbedObj.gameObject) && leftGrabbingSet.Count == 1)
  273. {
  274. UpdateActivity();
  275. }
  276. break;
  277. }
  278. }
  279. public void OnStickyGrabbed(StickyGrabbable grabbedObj)
  280. {
  281. ViveColliderButtonEventData viveEventData;
  282. if (!grabbedObj.grabbedEvent.TryGetViveButtonEventData(out viveEventData))
  283. {
  284. return;
  285. }
  286. UpdateActivity();
  287. switch (viveEventData.viveRole.ToRole<HandRole>())
  288. {
  289. case HandRole.RightHand:
  290. if (rightGrabbingSet.Count > 0 || isRightStickyGrab)
  291. {
  292. return;
  293. }
  294. if (rightGrabbingSet.Add(grabbedObj.gameObject) && rightGrabbingSet.Count == 1)
  295. {
  296. UpdateActivity();
  297. }
  298. break;
  299. case HandRole.LeftHand:
  300. if (leftGrabbingSet.Count > 0 || isLeftStickyGrab)
  301. {
  302. return;
  303. }
  304. if (leftGrabbingSet.Add(grabbedObj.gameObject) && leftGrabbingSet.Count == 1)
  305. {
  306. UpdateActivity();
  307. }
  308. break;
  309. }
  310. }
  311. public void OnRelease(BasicGrabbable releasedObj)
  312. {
  313. ViveColliderButtonEventData viveEventData;
  314. if (!releasedObj.grabbedEvent.TryGetViveButtonEventData(out viveEventData)) { return; }
  315. UpdateActivity();
  316. switch (viveEventData.viveRole.ToRole<HandRole>())
  317. {
  318. case HandRole.RightHand:
  319. if (rightGrabbingSet.Remove(releasedObj.gameObject) && rightGrabbingSet.Count == 0)
  320. {
  321. UpdateActivity();
  322. }
  323. break;
  324. case HandRole.LeftHand:
  325. if (leftGrabbingSet.Remove(releasedObj.gameObject) && leftGrabbingSet.Count == 0)
  326. {
  327. UpdateActivity();
  328. }
  329. break;
  330. }
  331. }
  332. public void OnLetGo(BasicGrabbable releaseObj)
  333. {
  334. leftGrabbingSet.Clear();
  335. rightGrabbingSet.Clear();
  336. UpdateActivity();
  337. }
  338. public void OnStickyLetGo(StickyGrabbable releaseObj)
  339. {
  340. leftGrabbingSet.Clear();
  341. rightGrabbingSet.Clear();
  342. UpdateActivity();
  343. }
  344. public void OnStickyRelease(StickyGrabbable releasedObj)
  345. {
  346. UpdateActivity();
  347. ViveColliderButtonEventData viveEventData;
  348. if (!releasedObj.grabbedEvent.TryGetViveButtonEventData(out viveEventData)) { return; }
  349. switch (viveEventData.viveRole.ToRole<HandRole>())
  350. {
  351. case HandRole.RightHand:
  352. if (rightGrabbingSet.Remove(releasedObj.gameObject) && rightGrabbingSet.Count == 0)
  353. {
  354. isRightStickyGrab = false;
  355. UpdateActivity();
  356. }
  357. break;
  358. case HandRole.LeftHand:
  359. if (leftGrabbingSet.Remove(releasedObj.gameObject) && leftGrabbingSet.Count == 0)
  360. {
  361. isLeftStickyGrab = false;
  362. UpdateActivity();
  363. }
  364. break;
  365. }
  366. }
  367. public void OnDropped(BasicGrabbable grabbedObj)
  368. {
  369. OnRelease(grabbedObj);
  370. }
  371. public void OnDropped(StickyGrabbable grabbedObj)
  372. {
  373. OnStickyRelease(grabbedObj);
  374. }
  375. public void UpdateActivity()
  376. {
  377. //var rightRenderModelShouldActive = !m_rightCustomModelActive && (!hideRenderModelOnGrab || rightGrabbingSet.Count == 0);
  378. var rightRenderModelShouldActive = !hideRenderModelOnGrab || rightGrabbingSet.Count == 0;
  379. var rightCustomModelShouldActive = m_rightCustomModelActive;
  380. var rightLaserPointerShouldActive = m_rightLaserPointerActive;
  381. var rightCurvePointerShouldActive = m_rightCurvePointerActive;
  382. var rightGrabberShouldActive = !m_rightLaserPointerActive && !m_rightCustomModelActive && !m_rightCurvePointerActive;
  383. if (rightRenderModel != null && rightRenderModel.activeSelf != rightRenderModelShouldActive)
  384. {
  385. rightRenderModel.SetActive(rightRenderModelShouldActive);
  386. }
  387. if (rightCustomModel != null && rightCustomModel.activeSelf != rightCustomModelShouldActive)
  388. {
  389. rightCustomModel.SetActive(rightCustomModelShouldActive);
  390. }
  391. if (rightLaserPointer != null && rightLaserPointer.activeSelf != rightLaserPointerShouldActive)
  392. {
  393. rightLaserPointer.SetActive(rightLaserPointerShouldActive);
  394. }
  395. if (rightCurvePointer != null && rightCurvePointer.activeSelf != rightCurvePointerShouldActive)
  396. {
  397. rightCurvePointer.SetActive(rightCurvePointerShouldActive);
  398. }
  399. if (rightGrabber != null && rightGrabber.activeSelf != rightGrabberShouldActive)
  400. {
  401. rightGrabber.SetActive(rightGrabberShouldActive);
  402. }
  403. // var leftRenderModelShouldActive = !m_leftCustomModelActive && (!hideRenderModelOnGrab || leftGrabbingSet.Count == 0);
  404. var leftRenderModelShouldActive = !hideRenderModelOnGrab || leftGrabbingSet.Count == 0;
  405. var leftCustomModelShouldActive = m_leftCustomModelActive;
  406. var leftLaserPointerShouldActive = m_leftLaserPointerActive;
  407. var leftCurvePointerShouldActive = m_leftCurvePointerActive;
  408. var leftGrabberShouldActive = !m_leftLaserPointerActive && !m_leftCustomModelActive && !m_leftCurvePointerActive;
  409. if (leftRenderModel != null && leftRenderModel.activeSelf != leftRenderModelShouldActive)
  410. {
  411. leftRenderModel.SetActive(leftRenderModelShouldActive);
  412. }
  413. if (leftCustomModel != null && leftCustomModel.activeSelf != leftCustomModelShouldActive)
  414. {
  415. leftCustomModel.SetActive(leftCustomModelShouldActive);
  416. }
  417. if (leftLaserPointer != null && leftLaserPointer.activeSelf != leftLaserPointerShouldActive)
  418. {
  419. leftLaserPointer.SetActive(leftLaserPointerShouldActive);
  420. }
  421. if (leftCurvePointer != null && leftCurvePointer.activeSelf != leftCurvePointerShouldActive)
  422. {
  423. leftCurvePointer.SetActive(leftCurvePointerShouldActive);
  424. }
  425. if (leftGrabber != null && leftGrabber.activeSelf != leftGrabberShouldActive)
  426. {
  427. leftGrabber.SetActive(leftGrabberShouldActive);
  428. }
  429. }
  430. }