using UnityEngine; using System.Collections; using System.Collections.Generic; public class SkeletonUtilityKinematicShadow : MonoBehaviour { public bool hideShadow = true; public Transform parent; Dictionary shadowTable; GameObject shadowRoot; void Start() { shadowRoot = (GameObject)Instantiate(gameObject); if (hideShadow) shadowRoot.hideFlags = HideFlags.HideInHierarchy; if (parent == null) shadowRoot.transform.parent = transform.root; else shadowRoot.transform.parent = parent; shadowTable = new Dictionary(); Destroy(shadowRoot.GetComponent()); shadowRoot.transform.position = transform.position; shadowRoot.transform.rotation = transform.rotation; Vector3 scaleRef = transform.TransformPoint(Vector3.right); float scale = Vector3.Distance(transform.position, scaleRef); shadowRoot.transform.localScale = Vector3.one; var shadowJoints = shadowRoot.GetComponentsInChildren(); foreach (Joint j in shadowJoints) { j.connectedAnchor *= scale; } var joints = GetComponentsInChildren(); foreach (var j in joints) Destroy(j); var rbs = GetComponentsInChildren(); foreach (var rb in rbs) Destroy(rb); var colliders = GetComponentsInChildren(); foreach (var c in colliders) Destroy(c); //match by bone name var shadowBones = shadowRoot.GetComponentsInChildren(); var bones = GetComponentsInChildren(); //build bone lookup foreach (var b in bones) { if (b.gameObject == gameObject) continue; foreach (var sb in shadowBones) { if (sb.GetComponent() == null) continue; if (sb.boneName == b.boneName) { shadowTable.Add(sb.transform, b.transform); break; } } } foreach (var b in shadowBones) Destroy(b); } void FixedUpdate() { shadowRoot.GetComponent().MovePosition(transform.position); shadowRoot.GetComponent().MoveRotation(transform.rotation); foreach (var pair in shadowTable) { pair.Value.localPosition = pair.Key.localPosition; pair.Value.localRotation = pair.Key.localRotation; } } }