using System.Collections; using System.Collections.Generic; using UnityEngine; public class LoraxCuller : MonoBehaviour { public Lorax[] Loraces; public int[] Radius; public bool[] Omnidirectional; public bool CullingStatusChanged = false; private HashSet OldChunks = new HashSet(); private int LastX = int.MaxValue; private int LastY = int.MaxValue; private int LastAngle = int.MaxValue; private void Update() { if (Loraces.Length == 0) { // Not in the world of the lorax yet. return; } int BaseX = Mathf.FloorToInt(transform.position.x / 20) * 20 + 10; int BaseY = Mathf.FloorToInt(transform.position.z / 20) * 20 + 10; int Angle = Mathf.FloorToInt(transform.localEulerAngles.y / 5) * 5; if (BaseX == LastX && BaseY == LastY && Angle == LastAngle) { return; } LastX = BaseX; LastY = BaseY; LastAngle = Angle; HashSet EnabledChunks = new HashSet(); for (int LoraxIndex = 0; LoraxIndex < Loraces.Length; LoraxIndex++) { Lorax Lorax = Loraces[LoraxIndex]; for (float X = BaseX - Radius[LoraxIndex]; X <= BaseX + Radius[LoraxIndex]; X += 10) { for (float Y = BaseY - Radius[LoraxIndex]; Y <= BaseY + Radius[LoraxIndex]; Y += 10) { if (!Omnidirectional[LoraxIndex]) { Vector3 Delta = new Vector3(X - BaseX, 0, Y - BaseY); if (Delta.magnitude > Mathf.Sqrt(Mathf.Pow(20, 2) * 2)) { if (Vector3.Dot(Delta.normalized, transform.forward) < -0.2) { continue; } } } GameObject Chunk = Lorax.GetChunkAt(X, Y); if (Chunk != null) { Chunk.SetActive(true); EnabledChunks.Add(Chunk); } } } } CullingStatusChanged = false; foreach (GameObject OldChunk in OldChunks) { if (!EnabledChunks.Contains(OldChunk)) { OldChunk.SetActive(false); CullingStatusChanged = true; } } if (EnabledChunks.Count > OldChunks.Count) { CullingStatusChanged = true; } OldChunks = EnabledChunks; } }