using System.Collections.Generic; using System.Linq; using UnityEngine; public class MapBaseboards : MonoBehaviour { public Material sideMaterial; public float minHeight = 64; private OnlineMapsTileSetControl control; private Mesh mesh; private Mesh mapMesh; private void OnMeshUpdated() { UpdateSides(); } private void Start() { control = OnlineMapsTileSetControl.instance; control.OnMeshUpdated += OnMeshUpdated; GameObject sidesContainer = new GameObject("Sides"); sidesContainer.transform.parent = control.transform; sidesContainer.transform.localPosition = Vector3.zero; sidesContainer.transform.localScale = Vector3.one; sidesContainer.transform.localRotation = Quaternion.Euler(Vector3.zero); MeshFilter meshFilter = sidesContainer.AddComponent(); MeshRenderer meshRenderer = sidesContainer.AddComponent(); meshRenderer.sharedMaterial = sideMaterial; mesh = new Mesh(); mesh.MarkDynamic(); meshFilter.sharedMesh = mesh; meshRenderer.material = sideMaterial; } private void UpdateSides() { mesh.Clear(); if (mapMesh == null) mapMesh = control.GetComponent().sharedMesh; Vector3[] mapVertices = mapMesh.vertices; List left = new List(); List right = new List(); List top = new List(); List bottom = new List(); float minY = float.MaxValue; for (int i = 0; i < mapVertices.Length; i++) { Vector3 v = mapVertices[i]; if (Mathf.Abs(v.x) <= 0.01f) left.Add(v); if (Mathf.Abs(v.x + control.sizeInScene.x) <= 0.01f) right.Add(v); if (Mathf.Abs(v.z) <= 0.01f) top.Add(v); if (Mathf.Abs(v.z - control.sizeInScene.y) <= 0.01f) bottom.Add(v); if (minY > v.y) minY = v.y; } left = left.Distinct().OrderBy(v => v.z).ToList(); right = right.Distinct().OrderBy(v => v.z).Reverse().ToList(); top = top.Distinct().OrderBy(v => v.x).ToList(); bottom = bottom.Distinct().OrderBy(v => v.x).Reverse().ToList(); minY -= minHeight; List vertices = new List(); List uv = new List(); List normals = new List(); List triangles = new List(); UpdateSide(left, vertices, uv, normals, triangles, Vector3.left, minY); UpdateSide(top, vertices, uv, normals, triangles, Vector3.forward, minY); UpdateSide(right, vertices, uv, normals, triangles, Vector3.right, minY); UpdateSide(bottom, vertices, uv, normals, triangles, Vector3.back, minY); mesh.vertices = vertices.ToArray(); mesh.uv = uv.ToArray(); mesh.normals = normals.ToArray(); mesh.SetTriangles(triangles.ToArray(), 0); } private static void UpdateSide(List side, List vertices, List uv, List normals, List triangles, Vector3 normal, float minY) { for (int i = 0; i < side.Count - 1; i++) { int cv = vertices.Count; Vector3 p1 = side[i]; Vector3 p2 = side[i + 1]; vertices.Add(p1); vertices.Add(p2); vertices.Add(new Vector3(p2.x, minY, p2.z)); vertices.Add(new Vector3(p1.x, minY, p1.z)); uv.Add(new Vector2(0, 1)); uv.Add(new Vector2(1, 1)); uv.Add(new Vector2(1, 0)); uv.Add(new Vector2(0, 0)); normals.Add(normal); normals.Add(normal); normals.Add(normal); normals.Add(normal); triangles.Add(cv); triangles.Add(cv + 1); triangles.Add(cv + 2); triangles.Add(cv); triangles.Add(cv + 2); triangles.Add(cv + 3); } } }