Advertisement
SebastianLague

Cody Shay map gen fixed

Jun 13th, 2016
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.30 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class EndlessTerrain: MonoBehaviour {
  5.     public
  6.     const float maxViewDst = 450;
  7.     public Transform viewer;
  8.     public Material mapMaterial;
  9.     public static Vector2 viewerPosition;
  10.     static MapGenerator mapGenerator;
  11.     int chunkSize;
  12.     int chunksVisibleInViewDst;
  13.     Dictionary < Vector2, TerrainChunk > terrainChunkDictionary = new Dictionary < Vector2, TerrainChunk > ();
  14.     List < TerrainChunk > terrainChunksVisibleLastUpdate = new List < TerrainChunk > ();
  15.  
  16.     void Start() {
  17.         mapGenerator = FindObjectOfType < MapGenerator > ();
  18.         chunkSize = MapGenerator.mapChunkSize - 1;
  19.         chunksVisibleInViewDst = Mathf.RoundToInt(maxViewDst / chunkSize);
  20.     }
  21.     void Update() {
  22.         viewerPosition = new Vector2(viewer.position.x, viewer.position.z);
  23.         UpdateVisibleChunks();
  24.     }
  25.     void UpdateVisibleChunks() {
  26.         for (int i = 0; i < terrainChunksVisibleLastUpdate.Count; i++) {
  27.             terrainChunksVisibleLastUpdate[i].SetVisible(false);
  28.         }
  29.         terrainChunksVisibleLastUpdate.Clear();
  30.         int currentChunkCoordX = Mathf.RoundToInt(viewerPosition.x / chunkSize);
  31.         int currentChunkCoordY = Mathf.RoundToInt(viewerPosition.y / chunkSize);
  32.         for (int yOffset = -chunksVisibleInViewDst; yOffset <= chunksVisibleInViewDst; yOffset++) {
  33.             for (int xOffset = -chunksVisibleInViewDst; xOffset <= chunksVisibleInViewDst; xOffset++) {
  34.                 Vector2 viewedChunkCoord = new Vector2(currentChunkCoordX + xOffset, currentChunkCoordY + yOffset);
  35.                 if (terrainChunkDictionary.ContainsKey(viewedChunkCoord)) {
  36.                     terrainChunkDictionary[viewedChunkCoord].UpdateTerrainChunk();
  37.                     if (terrainChunkDictionary[viewedChunkCoord].IsVisible()) {
  38.                         terrainChunksVisibleLastUpdate.Add(terrainChunkDictionary[viewedChunkCoord]);
  39.                     }
  40.                 } else {
  41.                     terrainChunkDictionary.Add(viewedChunkCoord, new TerrainChunk(viewedChunkCoord, chunkSize, transform, mapMaterial));
  42.                 }
  43.             }
  44.         }
  45.     }
  46.     public class TerrainChunk {
  47.         GameObject meshObject;
  48.         Vector2 position;
  49.         Bounds bounds;
  50.         MeshRenderer meshRenderer;
  51.         MeshFilter meshFilter;
  52.         public TerrainChunk(Vector2 coord, int size, Transform parent, Material material) {
  53.             position = coord * size;
  54.             bounds = new Bounds(position, Vector2.one * size);
  55.             Vector3 positionV3 = new Vector3(position.x, 0, position.y);
  56.             meshObject = new GameObject("Terrain Chunk");
  57.             meshRenderer = meshObject.AddComponent < MeshRenderer > ();
  58.             meshFilter = meshObject.AddComponent < MeshFilter > ();
  59.             meshRenderer.material = material;
  60.             meshObject.transform.position = positionV3;
  61.             meshObject.transform.parent = parent;
  62.             SetVisible(false);
  63.             print(mapGenerator);
  64.             mapGenerator.RequestMapData(OnMapDataReceived);
  65.         }
  66.         void OnMapDataReceived(MapData mapData) {
  67.             mapGenerator.RequestMeshData(mapData,OnMeshDataReceived); //Here the RequestMapData is highlighted.
  68.         }
  69.         void OnMeshDataReceived(MeshData meshData) {
  70.             meshFilter.mesh = meshData.CreateMesh();
  71.         }
  72.         public void UpdateTerrainChunk() {
  73.             float viewerDstFromNearestEdge = Mathf.Sqrt(bounds.SqrDistance(viewerPosition));
  74.             bool visible = viewerDstFromNearestEdge <= maxViewDst;
  75.             SetVisible(visible);
  76.         }
  77.         public void SetVisible(bool visible) {
  78.             meshObject.SetActive(visible);
  79.         }
  80.         public bool IsVisible() {
  81.             return meshObject.activeSelf;
  82.         }
  83.     }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement