using System.Collections; using UnityEngine; namespace CC { [DefaultExecutionOrder(100)] public class PhysicsManager : MonoBehaviour { public Animator animator; public CapsuleCollider capsule; private Rigidbody[] rigidBodies; private Collider[] colliders; private ModifyBone[] modifyBones; public bool useGravity = true; public bool ragdolling; public bool customizing; //If customizing, colliders should be activated for hover detection private void Awake() { if (animator == null) animator = gameObject.GetComponent(); if (capsule == null) capsule = gameObject.GetComponent(); rigidBodies = gameObject.GetComponentsInChildren(); colliders = gameObject.GetComponentsInChildren(); modifyBones = gameObject.GetComponentsInChildren(); //Set rigid bodies to kinematic at start foreach (var item in rigidBodies) { if (item.gameObject == gameObject) continue; //Skip main rigid body item.useGravity = useGravity; item.isKinematic = true; } //Disable colliders if not in customization mode foreach (var item in colliders) { if (item == capsule) continue; //Ignore capsule item.enabled = customizing; } } private void Start() { if (ragdolling) StartCoroutine(ragdoll(true)); } public void customizationSetup() { //Create head rig var headRig = GetComponentInChildren(); if (headRig != null) { headRig.createColliders(); } //Enable colliders for hover detection foreach (var item in colliders) { item.enabled = true; } //Disable capsule when customizing if (capsule != null) capsule.enabled = false; customizing = true; } public IEnumerator ragdoll(bool shouldRagdoll) { ragdolling = shouldRagdoll; //Enable colliders if ragdolling foreach (var item in colliders) { item.enabled = ragdolling; } //Notify modifyBone scripts foreach (var item in modifyBones) { item.onSimulate(ragdolling); } if (ragdolling) yield return new WaitForFixedUpdate(); //Disable capsule when ragdolling or customizing if (capsule != null) capsule.enabled = !ragdolling; //Enable physics foreach (var item in rigidBodies) { item.isKinematic = !ragdolling; item.angularVelocity = Vector3.zero; } //Disable animator when ragdolling if (animator != null) animator.enabled = !ragdolling; yield break; } } }