using System.Collections.Generic; using System.Text; using UnityEngine; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; using UnityEngine.UI; namespace UnityEngine.XR.ARFoundation.Samples { public class HumanBodyTracker : MonoBehaviour { public GameObject m_SkeletonPrefab; public GameObject m_SkeletonPrefab1; public GameObject m_SkeletonPrefab2; List prefabs; public Button btn; int index = 0; [SerializeField] ARHumanBodyManager m_HumanBodyManager; private void Start() { prefabs.Add(m_SkeletonPrefab); prefabs.Add(m_SkeletonPrefab1); prefabs.Add(m_SkeletonPrefab2); btn.onClick.AddListener(() => SwitchPrefab()); } void SwitchPrefab() { index=(index+1)%3; } /// /// Get/Set the ARHumanBodyManager. /// /// public ARHumanBodyManager humanBodyManager { get { return m_HumanBodyManager; } set { m_HumanBodyManager = value; } } /// /// Get/Set the skeleton prefab. /// public GameObject skeletonPrefab { get { return prefabs[index]; } set { prefabs[index] = value; } } Dictionary m_SkeletonTracker = new Dictionary(); void OnEnable() { Debug.Assert(m_HumanBodyManager != null, "Human body manager is required."); m_HumanBodyManager.humanBodiesChanged += OnHumanBodiesChanged; } void OnDisable() { if (m_HumanBodyManager != null) m_HumanBodyManager.humanBodiesChanged -= OnHumanBodiesChanged; } void OnHumanBodiesChanged(ARHumanBodiesChangedEventArgs eventArgs) { BoneController boneController; foreach (var humanBody in eventArgs.added) { if (!m_SkeletonTracker.TryGetValue(humanBody.trackableId, out boneController)) { Debug.Log($"Adding a new skeleton [{humanBody.trackableId}]."); var newSkeletonGO = Instantiate(prefabs[index], humanBody.transform); boneController = newSkeletonGO.GetComponent(); m_SkeletonTracker.Add(humanBody.trackableId, boneController); } boneController.InitializeSkeletonJoints(); boneController.ApplyBodyPose(humanBody); } foreach (var humanBody in eventArgs.updated) { if (m_SkeletonTracker.TryGetValue(humanBody.trackableId, out boneController)) { boneController.ApplyBodyPose(humanBody); } } foreach (var humanBody in eventArgs.removed) { Debug.Log($"Removing a skeleton [{humanBody.trackableId}]."); if (m_SkeletonTracker.TryGetValue(humanBody.trackableId, out boneController)) { //Destroy(boneController.gameObject); m_SkeletonTracker.Remove(humanBody.trackableId); } } } } }