using EZXR.Glass.Core; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace EZXR.Glass.Inputs { /// /// 手部碰撞 /// public class HandCollision : MonoBehaviour { Dictionary rigidbodyForCollision = new Dictionary(); /// /// 是否启用手部物理碰撞 /// public bool enablePhysicsInteraction; GameObject prefab_KeyPointForCollision; HandInfo handInfo; private void Awake() { Init(); } void Init() { handInfo = GetComponent(); prefab_KeyPointForCollision = ResourcesManager.Load("KeyPoint/KeyPointForCollision"); } void LateUpdate() { if (enablePhysicsInteraction) { if (handInfo.Exist) { if (rigidbodyForCollision != null) { foreach (HandJointType key in rigidbodyForCollision.Keys) { int id = (int)key; //更新KeyPoint的Pose rigidbodyForCollision[id].MovePosition(handInfo.GetJointData(key).position); rigidbodyForCollision[id].MoveRotation(handInfo.GetJointData(key).rotation); } } } } } /// /// 启用/禁用手部物理碰撞 /// public void SetPhysicsInteraction(bool value) { if (handInfo == null) { Init(); } enablePhysicsInteraction = value; 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 }; if (enablePhysicsInteraction) { if (rigidbodyForCollision.Count == 0) { foreach (HandJointType handJointType in handJointTypes) { Rigidbody rigidbodyForCollision = Instantiate(prefab_KeyPointForCollision, handInfo.root).GetComponent(); rigidbodyForCollision.name = "Physics_" + handInfo.handType + "_" + handJointType.ToString(); this.rigidbodyForCollision.Add((int)handJointType, rigidbodyForCollision); } } } else { foreach (KeyValuePair item in rigidbodyForCollision) { Destroy(item.Value.gameObject); } rigidbodyForCollision.Clear(); } } } }