HandCollision.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using EZXR.Glass.Core;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. namespace EZXR.Glass.Inputs
  7. {
  8. /// <summary>
  9. /// 手部碰撞
  10. /// </summary>
  11. public class HandCollision : MonoBehaviour
  12. {
  13. Dictionary<int, Rigidbody> rigidbodyForCollision = new Dictionary<int, Rigidbody>();
  14. /// <summary>
  15. /// 是否启用手部物理碰撞
  16. /// </summary>
  17. public bool enablePhysicsInteraction;
  18. GameObject prefab_KeyPointForCollision;
  19. HandInfo handInfo;
  20. private void Awake()
  21. {
  22. Init();
  23. }
  24. void Init()
  25. {
  26. handInfo = GetComponent<HandInfo>();
  27. prefab_KeyPointForCollision = ResourcesManager.Load<GameObject>("KeyPoint/KeyPointForCollision");
  28. }
  29. void LateUpdate()
  30. {
  31. if (enablePhysicsInteraction)
  32. {
  33. if (handInfo.Exist)
  34. {
  35. if (rigidbodyForCollision != null)
  36. {
  37. foreach (HandJointType key in rigidbodyForCollision.Keys)
  38. {
  39. int id = (int)key;
  40. //更新KeyPoint的Pose
  41. rigidbodyForCollision[id].MovePosition(handInfo.GetJointData(key).position);
  42. rigidbodyForCollision[id].MoveRotation(handInfo.GetJointData(key).rotation);
  43. }
  44. }
  45. }
  46. }
  47. }
  48. /// <summary>
  49. /// 启用/禁用手部物理碰撞
  50. /// </summary>
  51. public void SetPhysicsInteraction(bool value)
  52. {
  53. if (handInfo == null)
  54. {
  55. Init();
  56. }
  57. enablePhysicsInteraction = value;
  58. HandJointType[] handJointTypes = new HandJointType[7] { HandJointType.Thumb_3, HandJointType.Index_4, HandJointType.Middle_4, HandJointType.Ring_4, HandJointType.Pinky_4, HandJointType.Palm, HandJointType.Wrist_Middle };
  59. if (enablePhysicsInteraction)
  60. {
  61. if (rigidbodyForCollision.Count == 0)
  62. {
  63. foreach (HandJointType handJointType in handJointTypes)
  64. {
  65. Rigidbody rigidbodyForCollision = Instantiate(prefab_KeyPointForCollision, handInfo.root).GetComponent<Rigidbody>();
  66. rigidbodyForCollision.name = "Physics_" + handInfo.handType + "_" + handJointType.ToString();
  67. this.rigidbodyForCollision.Add((int)handJointType, rigidbodyForCollision);
  68. }
  69. }
  70. }
  71. else
  72. {
  73. foreach (KeyValuePair<int, Rigidbody> item in rigidbodyForCollision)
  74. {
  75. Destroy(item.Value.gameObject);
  76. }
  77. rigidbodyForCollision.Clear();
  78. }
  79. }
  80. }
  81. }