using Opsive.Shared.Events;
using System.Collections;
using UnityEngine;
public class RagdollSkinnedMeshUpdateBounds : MonoBehaviour
{
[SerializeField]
private GameObject characterGO;
[SerializeField]
private SkinnedMeshRenderer skinnedMeshRenderer;
[SerializeField]
private float boundsUpdateFrequency = 1;
private float t;
private bool updateBounds;
private Bounds originalBounds;
// Start is called before the first frame update
void Start()
{
EventHandler.RegisterEvent<Vector3, Vector3, GameObject>(characterGO, "OnDeath", OnDeath);
EventHandler.RegisterEvent(characterGO, "OnRespawn", OnRespawn);
}
private void OnDestroy()
{
EventHandler.UnregisterEvent<Vector3, Vector3, GameObject>(characterGO, "OnDeath", OnDeath);
EventHandler.UnregisterEvent(characterGO, "OnRespawn", OnRespawn);
}
private void OnRespawn()
{
updateBounds = false;
StopAllCoroutines();
skinnedMeshRenderer.updateWhenOffscreen = false;
skinnedMeshRenderer.localBounds = originalBounds;
t = 0;
}
private void OnDeath(Vector3 arg1, Vector3 arg2, GameObject arg3)
{
originalBounds = skinnedMeshRenderer.localBounds;
//Update the bounds immediately
StartCoroutine(UpdateSkinnedMeshBounds());
updateBounds = true;
}
// Update is called once per frame
void Update()
{
if (updateBounds)
{
t += Time.deltaTime;
if(t >= boundsUpdateFrequency)
{
StartCoroutine(UpdateSkinnedMeshBounds());
t = 0;
}
}
}
//Update the skinned mesh renderer bounds for a single frame to match the ragdolls mesh position
private IEnumerator UpdateSkinnedMeshBounds()
{
if (skinnedMeshRenderer == null)
{
Debug.LogError("Skinned Mesh Renderer is null.");
yield break;
}
skinnedMeshRenderer.updateWhenOffscreen = true;
yield return null;
var newBounds = skinnedMeshRenderer.localBounds;
skinnedMeshRenderer.updateWhenOffscreen = false;
skinnedMeshRenderer.localBounds = newBounds;
}
}