我的世界(方块地图)生成

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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值