public Chunk(Vector2 cord, int size, LODinfo [] Levels, Transform parent, Material Mat) { this.Levels = Levels; position = cord * size; bounds = new Bounds(position, Vector2.one * size); Vector3 pos3D = new Vector3(position.x, 0, position.y); meshObj = new GameObject("chunk"); meshRenderer = meshObj.AddComponent <MeshRenderer>(); meshFilter = meshObj.AddComponent <MeshFilter>(); collider = meshObj.AddComponent <MeshCollider>(); meshRenderer.material = Mat; meshObj.transform.position = pos3D * scale; meshObj.transform.parent = parent; meshObj.transform.localScale = Vector3.one * scale; setvisable(false); LODMeshes = new LODmesh[Levels.Length]; for (int i = 0; i < Levels.Length; i++) { LODMeshes[i] = new LODmesh(Levels[i].LOD, updateChunk); if (Levels[i].useForCollider) { LODcollider = LODMeshes[i]; } } MapGen.RequsetMap(position, OnMapDataRevired); }
/* * void OnMesh(MeshData meshData){ * meshFilter.mesh = meshData.CreateMesh(); * * } */ public void updateChunk() { float viewNear = Mathf.Sqrt(bounds.SqrDistance(viewerPos)); bool visable = viewNear <= MaxView; setvisable(visable); if (HasMapDataChunck) { if (visable) { int LevelsIndex = 0; for (int i = 0; i < Levels.Length - 1; i++) { if (viewNear > Levels[i].visableDstTreshhold) { LevelsIndex = i + 1; } else { break; } } if (LevelsIndex != PreLevelsIndex) { LODmesh lodMesh = LODMeshes[LevelsIndex]; if (lodMesh.HasMesh) { PreLevelsIndex = LevelsIndex; meshFilter.mesh = lodMesh.mesh; collider.sharedMesh = lodMesh.mesh; } else if (!lodMesh.requestedMesh) { lodMesh.requestMesh(mapDataChunck); } } if (LevelsIndex == 0) { if (LODcollider.HasMesh) { LODmesh lodMesh = LODMeshes[LevelsIndex]; collider.sharedMesh = lodMesh.mesh; } else if (!LODcollider.requestedMesh) { LODcollider.requestMesh(mapData); } } chunksShowen.Add(this); } setvisable(visable); } setvisable(visable); }