using SMPLModel; using UnityEngine; using UnityEngine.Serialization; namespace Display { /// /// Adapted from https://forum.unity.com/threads/rendering-bones.34863/ /// public class BoneDisplay : MonoBehaviour { [SerializeField] [FormerlySerializedAs("BonePrefab")] public BoneLine bonePrefab; SkinnedMeshRenderer skinnedMeshRenderer; GameObject boneDisplayContainer; SMPLCharacter smplCharacter; public bool DisplayBones => smplCharacter.DisplaySettings.DisplayBones == BoneDisplayState.On; void OnEnable() { smplCharacter = GetComponent(); if (smplCharacter == null) Debug.LogError("Can't find SMPLCharacter"); skinnedMeshRenderer = GetComponentInChildren(); SetupBones(skinnedMeshRenderer.bones[smplCharacter.Model.PelvisIndex]); } void SetupBones(Transform pelvisBoneToSetup) { CreateContainerIfNeeded(); CreateBoneDisplays(pelvisBoneToSetup); } void CreateBoneDisplays(Transform parent) { foreach (Transform child in parent) { if (!Bones.IsBone(child)) continue; BoneLine newBone = Instantiate(bonePrefab, boneDisplayContainer.transform); newBone.Init(smplCharacter, this, parent, child); SetupBones(child); } } void CreateContainerIfNeeded() { if (boneDisplayContainer != null) return; boneDisplayContainer = new GameObject() {name = "BoneDisplay Container"}; boneDisplayContainer.transform.SetParent(smplCharacter.gameObject.transform); } void OnDisable() { DestroyImmediate(boneDisplayContainer); } } }