Professional Documents
Culture Documents
Code
Code
Collections;
2. using System.Collections.Generic;
3. using UnityEngine;
4.
5. public class Chunk : MonoBehaviour {
6. /*
7. List<Vector3> vertices = new List<Vector3>();
8. List<int> triangles = new List<int>();
9. List<Vector2> uv = new List<Vector2>();
10.
11. enum BlockSide {
12. TOP,
13. NORTH,
14. EAST,
15. SOUTH,
16. WEST,
17. BOTTOM
18. };
19. */
20.
21. const int ChunkSize = 10;
22.
23. BlockType[,,] block = new BlockType[ChunkSize, ChunkSize, ChunkSize];
24.
25. //int numFaces = 0;
26.
27. [SerializeField]
28. Material material;
29.
30. void Start() {
31. BuidMesh();
32. }
33.
34. void Update() {
35.
36. }
37.
38. void BuidMesh() {
39. Mesh mesh = new Mesh();
40.
41. List<Vector3> vertices = new List<Vector3>();
42. List<int> triangles = new List<int>();
43. List<Vector2> uv = new List<Vector2>();
44.
45. for(int x = 0; x < ChunkSize; x++) {
46. for(int y = 0; y < ChunkSize; y++) {
47. for(int z = 0; z < ChunkSize; z++) {
48. if(block[x, y, z] != BlockType.air) {
49. Vector3 blockPos = new Vector3(x, y, z);
50.
51. int numFaces = 0;
52.
53. if(block[x, y + 1, z] == BlockType.air) {
54. //GetVerts(BlockSide.TOP);
55. vertices.Add(new Vector3(0, 1, 0) + blockPos);
56. vertices.Add(new Vector3(0, 1, 1) + blockPos);
57. vertices.Add(new Vector3(1, 1, 1) + blockPos);
58. vertices.Add(new Vector3(1, 1, 0) + blockPos);
59.
60. //numFaces++;
61. }
62. if(block[x, y, z + 1] == BlockType.air) {
63. //GetVerts(BlockSide.NORTH);
64. vertices.Add(new Vector3(1, 0, 1) + blockPos);
65. vertices.Add(new Vector3(1, 1, 1) + blockPos);
66. vertices.Add(new Vector3(0, 1, 1) + blockPos);
67. vertices.Add(new Vector3(0, 0, 1) + blockPos);
68.
69. //numFaces++;
70. }
71. if(block[x + 1, y, z] == BlockType.air) {
72. //GetVerts(BlockSide.EAST);
73. vertices.Add(new Vector3(1, 0, 0) + blockPos);
74. vertices.Add(new Vector3(1, 1, 0) + blockPos);
75. vertices.Add(new Vector3(1, 1, 1) + blockPos);
76. vertices.Add(new Vector3(1, 0, 1) + blockPos);
77.
78. //numFaces++;
79. }
80. if(block[x, y, z - 1] == BlockType.air) {
81. //GetVerts(BlockSide.SOUTH);
82. vertices.Add(new Vector3(0, 0, 0) + blockPos);
83. vertices.Add(new Vector3(0, 1, 0) + blockPos);
84. vertices.Add(new Vector3(1, 1, 0) + blockPos);
85. vertices.Add(new Vector3(1, 0, 0) + blockPos);
86.
87. //numFaces++;
88. }
89. if(block[x - 1, y, z] == BlockType.air) {
90. //GetVerts(BlockSide.WEST);
91. vertices.Add(new Vector3(0, 0, 1) + blockPos);
92. vertices.Add(new Vector3(0, 1, 1) + blockPos);
93. vertices.Add(new Vector3(0, 1, 0) + blockPos);
94. vertices.Add(new Vector3(0, 0, 0) + blockPos);
95.
96. //numFaces++;
97. }
98. if(block[x, y - 1, z] == BlockType.air) {
99. //GetVerts(BlockSide.BOTTOM);/
100. vertices.Add(new Vector3(0, 0, 1) + blockPos);
101. vertices.Add(new Vector3(0, 0, 0) + blockPos);
102. vertices.Add(new Vector3(1, 0, 0) + blockPos);
103. vertices.Add(new Vector3(1, 0, 1) + blockPos);
104.
105. //numFaces++;
106. }
107.
108. // Primeiro Triangulo
109. triangles.Add((numFaces * 4) + 0);
110. triangles.Add((numFaces * 4) + 1);
111. triangles.Add((numFaces * 4) + 2);
112.
113. // Segundo Triangulo
114. triangles.Add((numFaces * 4) + 0);
115. triangles.Add((numFaces * 4) + 2);
116. triangles.Add((numFaces * 4) + 3);
117.
118. numFaces++;
119.
120. /*
121. int tl = vertices.Count - 4 * numFaces;
122. for(int i = 0; i < numFaces; i++) {
123. triangles.AddRange(new int[] {
124. tl + i * 4,
125. tl + i * 4 + 1,
126. tl + i * 4 + 2,
127. tl + i * 4,
128. tl + i * 4 + 2,
129. tl + i * 4 + 3
130. });
131. }
132. */
133. }
134. }
135. }
136. }
137.
138. mesh.vertices = vertices.ToArray();
139. mesh.triangles = triangles.ToArray();
140. mesh.uv = uv.ToArray();
141.
142. mesh.RecalculateNormals();
143.
144. MeshFilter meshFilter = (MeshFilter)this.gameObject.AddComponent(typeof(MeshFilter));
145. meshFilter.mesh = mesh;
146.
147. MeshRenderer meshRenderer = (MeshRenderer)this.gameObject.AddComponent(typeof(MeshRenderer));
148. meshRenderer.material = material;
149. }
150.
151. /*
152. void GetTris() {
153. // Primeiro Triangulo
154. triangles.Add((numFaces * 4) + 0);
155. triangles.Add((numFaces * 4) + 1);
156. triangles.Add((numFaces * 4) + 2);
157.
158. // Segundo Triangulo
159. triangles.Add((numFaces * 4) + 0);
160. triangles.Add((numFaces * 4) + 2);
161. triangles.Add((numFaces * 4) + 3);
162.
163. numFaces++;
164. }
165.
166. void GetVerts(BlockSide side) {
167. GetTris();
168.
169. switch(side) {
170. case BlockSide.TOP: {
171. vertices.Add(new Vector3(0, 1, 0));
172. vertices.Add(new Vector3(0, 1, 1));
173. vertices.Add(new Vector3(1, 1, 1));
174. vertices.Add(new Vector3(1, 1, 0));
175.
176. break;
177. }
178. case BlockSide.NORTH: {
179. vertices.Add(new Vector3(1, 0, 1));
180. vertices.Add(new Vector3(1, 1, 1));
181. vertices.Add(new Vector3(0, 1, 1));
182. vertices.Add(new Vector3(0, 0, 1));
183.
184. break;
185. }
186. case BlockSide.EAST: {
187. vertices.Add(new Vector3(1, 0, 0));
188. vertices.Add(new Vector3(1, 1, 0));
189. vertices.Add(new Vector3(1, 1, 1));
190. vertices.Add(new Vector3(1, 0, 1));
191.
192. break;
193. }
194. case BlockSide.SOUTH: {
195. vertices.Add(new Vector3(0, 0, 0));
196. vertices.Add(new Vector3(0, 1, 0));
197. vertices.Add(new Vector3(1, 1, 0));
198. vertices.Add(new Vector3(1, 0, 0));
199.
200. break;
201. }
202. case BlockSide.WEST: {
203. vertices.Add(new Vector3(0, 0, 1));
204. vertices.Add(new Vector3(0, 1, 1));
205. vertices.Add(new Vector3(0, 1, 0));
206. vertices.Add(new Vector3(0, 0, 0));
207.
208. break;
209. }
210. case BlockSide.BOTTOM: {
211. vertices.Add(new Vector3(0, 0, 1));
212. vertices.Add(new Vector3(0, 0, 0));
213. vertices.Add(new Vector3(1, 0, 0));
214. vertices.Add(new Vector3(1, 0, 1));
215.
216. break;
217. }
218. }
219. }
220. */
221. }
222.
223. public enum BlockType {
224. air,
225. stone,
226. grass,
227. dirt
228. }