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(); lodGroup = GetComponent(); // Enable the animator by default animator.enabled = true; renderers = GetComponentsInChildren(); } //[SerializeField] List 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(); 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; } }