RuntimeTerrains.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using UnityEngine;
  2. // using UnityEditor;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. namespace TerrainComposer2
  6. {
  7. [ExecuteInEditMode]
  8. public class RuntimeTerrains : MonoBehaviour
  9. {
  10. float frames;
  11. public bool moveTerrainsWithCamera;
  12. public Transform mainCamera;
  13. float terrainSize;
  14. // float halfTerrainSize;
  15. float totalSize;
  16. Vector3[] initPos;
  17. Vector3 oldPos;
  18. float relativePos, newPos, offset;
  19. public List<TCUnityTerrain> tcTerrains = new List<TCUnityTerrain>();
  20. public TC_TerrainArea terrainArea;
  21. List<TCUnityTerrain> taskList = new List<TCUnityTerrain>();
  22. void Start()
  23. {
  24. if (moveTerrainsWithCamera)
  25. {
  26. if (mainCamera == null)
  27. {
  28. Debug.Log("Assign the Main Camera");
  29. Debug.Break();
  30. }
  31. UpdateMoveTerrain();
  32. }
  33. }
  34. void OnEnable()
  35. {
  36. terrainArea = TC_Area2D.current.terrainAreas[0];
  37. tcTerrains = terrainArea.terrains;
  38. Start();
  39. }
  40. void Update()
  41. {
  42. UpdateMoveTerrain();
  43. }
  44. void UpdateMoveTerrain()
  45. {
  46. if (terrainArea == null || mainCamera == null) return;
  47. if (initPos == null || initPos.Length != tcTerrains.Count) StartMoveTerrains();
  48. UpdateTerrainPositionsX();
  49. UpdateTerrainPositionsZ();
  50. if (taskList.Count > 0)
  51. {
  52. // terrainArea.SetNeighbors();
  53. for (int i = 0; i < taskList.Count; i++)
  54. {
  55. TC_Generate.instance.Generate(taskList[i], false);
  56. }
  57. taskList.Clear();
  58. }
  59. }
  60. void StartMoveTerrains()
  61. {
  62. terrainSize = tcTerrains[0].terrain.terrainData.size.x;
  63. totalSize = terrainArea.tiles.x * terrainSize;
  64. // halfTerrainSize = terrainSize / 2;
  65. initPos = new Vector3[tcTerrains.Count];
  66. terrainArea.AssignTerrainArray();
  67. for (int i = 0; i < tcTerrains.Count; i++)
  68. {
  69. initPos[i] = tcTerrains[i].terrain.transform.position;
  70. }
  71. offset = terrainSize / 2;
  72. if ((totalSize / terrainSize) % 2 != 0)
  73. {
  74. }
  75. }
  76. void UpdateTerrainPositionsX()
  77. {
  78. for (int i = 0; i < tcTerrains.Count; i++)
  79. {
  80. TCUnityTerrain tcTerrain = tcTerrains[i];
  81. Terrain terrain = tcTerrain.terrain;
  82. relativePos = mainCamera.position.x - initPos[i].x;
  83. newPos = (Mathf.Round((relativePos - offset) / totalSize) * totalSize) + initPos[i].x;
  84. if (terrain.transform.position.x != newPos)
  85. {
  86. if (newPos > terrain.transform.position.x)
  87. {
  88. // Debug.Log("->");
  89. // terrainArea.terrainArray[terrainArea.tiles.x - 1, tcTerrain.tileZ] =
  90. // tcTerrain.tileX = terrainArea.tiles.x - 1;
  91. // for (int x = 1; x < terrainArea.tiles.x; x++) terrainArea.GetTCUnityTerrainTile(x, tcTerrain.tileZ).tileX = x - 1;
  92. // tcTerrains.RemoveAt(i);
  93. // tcTerrains.Insert(i + 1, tcTerrain);
  94. }
  95. else
  96. {
  97. // Debug.Log("<-");
  98. // tcTerrain.tileX = 0;
  99. // for (int x = 0; x < terrainArea.tiles.x - 1; x++) terrainArea.GetTCUnityTerrainTile(x, tcTerrain.tileZ).tileX = x + 1;
  100. }
  101. // terrain.gameObject.SetActive(false);
  102. tcTerrain.newPos = new Vector3(newPos, terrain.transform.position.y, terrain.transform.position.z);
  103. tcTerrain.updateTerrainPos = true;
  104. // terrains.Add(terrains[i]);
  105. tcTerrain.active = true;
  106. taskList.Add(tcTerrain);
  107. }
  108. }
  109. oldPos.x = Mathf.Round(mainCamera.position.x / terrainSize) * terrainSize;
  110. }
  111. void UpdateTerrainPositionsZ()
  112. {
  113. for (int i = 0; i < tcTerrains.Count; i++)
  114. {
  115. TCUnityTerrain tcTerrain = tcTerrains[i];
  116. Terrain terrain = tcTerrain.terrain;
  117. relativePos = mainCamera.position.z - initPos[i].z;
  118. newPos = (Mathf.Round((relativePos - offset) / totalSize) * totalSize) + initPos[i].z;
  119. if (terrain.transform.position.z != newPos)
  120. {
  121. if (newPos > terrain.transform.position.z)
  122. {
  123. tcTerrain.tileZ = terrainArea.tiles.y - 1;
  124. for (int z = 1; z < terrainArea.tiles.y; z++)
  125. {
  126. terrainArea.GetTCUnityTerrainTile(tcTerrain.tileX, z).tileZ = z - 1;
  127. }
  128. }
  129. else
  130. {
  131. tcTerrain.tileZ = 0;
  132. for (int z = 0; z < terrainArea.tiles.y - 1; z++) terrainArea.GetTCUnityTerrainTile(tcTerrain.tileX, z).tileZ = z + 1;
  133. }
  134. // terrain.gameObject.SetActive(false);
  135. tcTerrain.newPos = new Vector3(terrain.transform.position.x, terrain.transform.position.y, newPos);
  136. tcTerrain.updateTerrainPos = true;
  137. // terrains.Add(terrains[i]);
  138. tcTerrain.active = true;
  139. if (!taskList.Contains(tcTerrain)) taskList.Add(tcTerrain);
  140. }
  141. }
  142. oldPos.z = Mathf.Round(mainCamera.position.z / terrainSize) * terrainSize;
  143. }
  144. }
  145. }