97 lines
2.2 KiB
C#

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<Rigidbody> _ragdollRigidbodies;
private bool _isRagdoll
{
get { return _ragdollRigidbodies != null && !_ragdollRigidbodies.Select(x => x.isKinematic).FirstOrDefault(); }
}
private void Awake()
{
_ragdollRigidbodies = GetComponentsInChildren<Rigidbody>().ToList();
void setRagdollState()
{
if (_startsRagdolled)
{
EnableRagdoll();
}
else
{
DisableRagdoll();
}
}
setRagdollState();
}
// Update is called once per frame
private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
if (_isRagdoll)
{
DisableRagdoll();
}
else
{
EnableRagdoll();
}
}
}
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;
}
}