Files
HauntedBloodlines/Assets/Scripts/Animations Scripts/LODAnimationsUpdate.cs
2025-05-29 22:31:40 +03:00

114 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LODAnimationsUpdate : MonoBehaviour
{
[SerializeField] SkinnedMeshRenderer[] sourceSkinnedMeshRenderer;
[SerializeField] SkinnedMeshRenderer[] targetSkinnedMeshRenderer;
[SerializeField] private int targetLODLevel;
private LODGroup lodGroup;
private Animator animator;
private bool isPlaying = true;
Renderer[] renderers;
private void Start()
{
isPlaying = true;
animator = GetComponentInChildren<Animator>();
lodGroup = GetComponent<LODGroup>();
// Enable the animator by default
animator.enabled = true;
renderers = GetComponentsInChildren<Renderer>();
}
//[SerializeField] List<int> blendShapesCount;
//private void Awake()
//{
// blendShapesCount.Add(targetSkinnedMeshRenderer.Length);
//}
//// Start is called before the first frame update
//void Start()
//{
// for (int i = 0; i < targetSkinnedMeshRenderer.Length; i++)
// {
// blendShapesCount[i] = targetSkinnedMeshRenderer[i].sharedMesh.blendShapeCount;
// }
//}
// Update is called once per frame
void Update()
{
for (int i = 0; i < targetSkinnedMeshRenderer.Length; i++)
{
for (int index = 0; index < targetSkinnedMeshRenderer[i].sharedMesh.blendShapeCount; index++)
{
targetSkinnedMeshRenderer[i].SetBlendShapeWeight(index, sourceSkinnedMeshRenderer[i].GetBlendShapeWeight(index));
}
}
//// Get the current LOD level
//int currentLOD = GetActiveLODIndex();
//// Check the LOD level and enable/disable the animator
//if (currentLOD >= targetLODLevel && isPlaying)
//{
// animator.enabled = false;
// isPlaying = false;
//}
//else if (currentLOD < targetLODLevel && !isPlaying)
//{
// animator.enabled = true;
// isPlaying = true;
//}
}
private int GetActiveLODIndex()
{
LOD[] lods = lodGroup.GetLODs();
float relativeHeight = GetScreenRelativeTransitionHeight();
for (int i = 0; i < lods.Length; i++)
{
if (relativeHeight < lods[i].screenRelativeTransitionHeight)
{
return i;
}
}
return lods.Length - 1;
}
private float GetScreenRelativeTransitionHeight()
{
float relativeHeight = 0f;
Camera camera = Camera.main;
if (camera != null)
{
Transform cameraTransform = camera.transform;
Bounds bounds = new Bounds(transform.position, Vector3.zero);
//Renderer[] renderers = GetComponentsInChildren<Renderer>();
foreach (Renderer renderer in renderers)
{
bounds.Encapsulate(renderer.bounds);
}
Plane[] frustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera);
if (GeometryUtility.TestPlanesAABB(frustumPlanes, bounds))
{
Vector3 distanceVector = bounds.ClosestPoint(cameraTransform.position) - cameraTransform.position;
relativeHeight = distanceVector.magnitude / cameraTransform.localScale.y;
}
}
return relativeHeight;
}
}