using UnityEngine; using System.Linq; using System.Collections.Generic; using UnityEngine.Rendering; using System.ComponentModel; /** * Code Inspired by these tutorial * Source: https://www.youtube.com/watch?v=KuMe6Iz8pFI, https://www.youtube.com/watch?v=B_NnQQKiw6I * Consulted on : 24/10/2022 */ public class Ragdoll : MonoBehaviour { [SerializeField] private bool _startsRagdolled; [SerializeField] private Transform _hipBone; private List _ragdollRigidbodies; private bool _isRagdoll { get { return _ragdollRigidbodies != null && !_ragdollRigidbodies.Select(x => x.isKinematic).FirstOrDefault(); } } private void Awake() { _ragdollRigidbodies = GetComponentsInChildren().ToList(); void setRagdollState() { if (_startsRagdolled) { EnableRagdoll(); } else { DisableRagdoll(); } } setRagdollState(); } private void EnableRagdoll() { _ragdollRigidbodies.ForEach(rigidbody => rigidbody.isKinematic = false); } private void DisableRagdoll() { _ragdollRigidbodies.ForEach(rigidbody => { rigidbody.isKinematic = true; rigidbody.detectCollisions = true; }); StandBackUp(); } private void StandBackUp() { Vector3 originalHipsPosition = _hipBone.position; transform.position = originalHipsPosition; void setRightHeight() { if (Physics.Raycast(transform.position, Vector3.down, out RaycastHit hitInfo)) { transform.position = new Vector3(transform.position.x, hitInfo.point.y, transform.position.z); } } setRightHeight(); _hipBone.position = originalHipsPosition; } }