114 lines
3.3 KiB
C#
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;
|
|
}
|
|
} |