using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using UnityEngine; public class MeshGenerator : MonoBehaviour { public class CubeSetting : MonoBehaviour { public object obj;//为了每个方块都有属于自己的属性 } /// <summary> /// 随机生成地图 /// </summary> //种子 private float _seedX = 1f, _seedZ = 1f; /// <summary> /// 运行情况下不能修改 /// </summary> //地图大小 [SerializeField] [Header("------PlayNoEdit------")] private float _width = 50; [SerializeField] private float _depth = 50; //是否需要碰撞器 [SerializeField] private bool _needToCollider = true; /// <summary> /// 运行情况下可以修改 /// </summary> //最大高度 [SerializeField] [Header("------PlayYesEdit------")] private float _maxHeight = 15; //使用柏林噪音的地图吗 [SerializeField] private bool _isPerlinNoiseMap = true; //起伏激烈 [SerializeField] private float _relief = 15f; //平滑y坐标(保持小数点以下不变) [SerializeField] private bool _isSmoothness = false; //地图大小 [SerializeField] private float _mapSize = 1f; private void Awake() { //地图大小设定 transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize); //种子生成以避免成为相同的地图 _seedX = UnityEngine.Random.value * 100f; _seedZ = UnityEngine.Random.value * 100f; //_seedX = 200f; //_seedZ = 700f; //立方结构 for (int x = 0; x < _width; x++) { for (int z = 0; z < _depth; z++) { //制作新立方体,放在平面上 GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.localPosition = new Vector3(x, 0, z); cube.transform.SetParent(transform); if (!_needToCollider) { Destroy(cube.GetComponent<BoxCollider>()); } //高度设定 SetY(cube); } } } //设定立方体的y坐标 private void SetY(GameObject cube) { float y = 0; //使用柏林噪声决定高度的场合 if (_isPerlinNoiseMap) { float xSample = (cube.transform.localPosition.x + _seedX) / _relief; float zSample = (cube.transform.localPosition.z + _seedZ) / _relief; float noise = Mathf.PerlinNoise(xSample, zSample); y = _maxHeight * noise; } //完全随机决定高度的场合 else { y = UnityEngine.Random.Range(0, _maxHeight); } //在不能平滑变化的情况下,将y四舍五入 if (!_isSmoothness) { y = Mathf.Round(y); } //位置设定 cube.transform.localPosition = new Vector3(cube.transform.localPosition.x, y, cube.transform.localPosition.z); //根据高度逐步变更颜色 UnityEngine.Color color = UnityEngine.Color.black;//浅灰色 if (y > _maxHeight * 0.3f) { ColorUtility.TryParseHtmlString("#019540FF", out color);//淡黄的颜色 } else if (y > _maxHeight * 0.2f) { ColorUtility.TryParseHtmlString("#2432ADFF", out color);//淡淡的颜色 } else if (y > _maxHeight * 0.1f) { ColorUtility.TryParseHtmlString("#D4500EFF", out color);//似岩浆的颜色 } cube.GetComponent<MeshRenderer>().material.color = color; cube.name = cube.transform.position+"";//专属的名字也方便查找 cube.AddComponent<CubeSetting>(); } //这个要不要无所谓(用于在运行过程中改变参数查看效果) private void OnValidate() { if (!Application.isPlaying) { return; } transform.localScale = new Vector3(_mapSize, _mapSize, _mapSize); foreach (Transform child in transform) { SetY(child.gameObject); } } }