Unity地形动态生成的一些经验记录

本文介绍了在Unity中动态生成地形的经验,包括地形对象的设置,如宽度、长度、高度和高度图分辨率,强调了高度图分辨率对地形平滑度的影响。还探讨了地形贴图的创建和混合,以及地形高度图的生成方法,如何根据设定产生平滑过渡的高地平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        正经人谁写日记啊
                                                --汪涵

        我以前也一直认为一个正经忙碌的人哪有时间和精力去写日记呢?

        但是我错了,正因为忙绿没有精力,才要将重要的事情记录下来.

        我记录的东西也都是一些比较简单的Unity使用,C#程序设计的浅显的东西.

        但是谁知道呢,当我不停地探索之后,发出来的内容,也许对于那些刚入门的新人来说,会是一个引导.

关于地形(terrain)对象

        有四个重要参数,地形宽度,地形长度和地形高度,以及高度图分辨率.

        前面三个都好理解,主要是最后一个高度图分辨率,它是一个二维的平面图,用灰色深度来代表地形高低起伏的一个图.(最黑为0)

        它不直观展示出来,它只在程序计算地形高度时起作用,这就比较抽象.

        并且高度图的分辨率和地形分辨率(长*宽)可以不是一样的.

        更低的分辨率在生成地形高度时会变得更陡峭.(这不是创建陡峭地形的方法,这种只会影响玩家的游戏体验.)

        一个1024*1024的地形图如果配上513*513的高度图那么整个地形的起伏会非常平滑

但是一个10240*10240的地形图,如果配上513*513的高度图,那么整个地形的起伏会变得非常突兀.

因为每个高度图的像素点,将要承担10倍于1024*1024地形图的起伏.

   

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;

public class CreateTerrain : MonoBehaviour
{
    public int seed;
    public float terrainWidth = 1024f;//地形的宽度
    public float terrainLength = 1024f;//地形的长度
    public int terrainHeight = 50;//地形的高度

    public Texture2D[] terrainTexture;
    public float perlinScale = 10.0f;
    public float[] perlinThreshold = {0.25f, 0.5f, 0.75f };

    private float randomOffsetX;
    private float randomOffsetY;
    public float centerHeight ;
    public float edgeHeight ;
    [Range(0, 2048)]
    public float slopeRadius;
    int terrainResolution;

    public static float Add(float a, float b)
    {
        float c = a + b;
        return c;
        //计算高度图分辨率
    }

    所以在创建高度图分辨率时应该和地形宽度和长度进行一个动态改变.

将长度和宽度相加,并且除以2,已达到清晰度和兼顾配置的需求.

 void Start()
    {
        terrainResolution = ((int)Add(terrainWidth,terrainLength)/2);
        Random.InitState(seed);
        randomOffsetX = Random.Range(0f, 10000f);
几个星期前,我在想,能否使用Unity来进行地形的实时变化?比如说,如果发生爆炸,它能否在地形中显示一个气泡?我认为学习更多高级的Unity中的地形特征将会是一个好的项目。 这要比我预想的更具挑战性,因为很难在执行这些操作时获得帧率来保持稳定。使用一些技巧,最终实现了我预想的效果。 示例是这样工作的。脚本随机产生“shell”并很快掉落到地面。每一个shell都依附着一个onTrigger对撞机。如果它和拥有 TerrainDeformer组件的地形相冲突的话,shell将告诉组件它的位置和爆炸的作用力。shell然后实例化一个爆炸(explosion)(由Ben Throop great Detonator framework提供),然后移除它自身。 TerrainDeformer脚本然后将那个位置翻译成相对地形的正确位置,并修改heightmap(地形高度)和alphamap(地形纹理)。一点儿数学知识用来在影响圆周内部查找所有的heightmap和alphamap位置。 被用于在影响范围重绘质地的纹理,是从基于传递到脚本(Terrain Deformation Texture Num)中的数字顺序索引值的地形纹理列表中选择的。在这个例子中,它被设置为1,因此它将使用列表中的第二个纹理来重绘质地。 在创建你自己的地形时,有必要将地形的高度设置为大于0米,从而形成弹坑。我建议深度至少为3米。这可以通过将地形高度设为大于3米的任何值,然后点击Terrain->Flatten Heightmap并输入3米。 出于执行的原因,保持你的Terrain Size为small是非常重要的,以及更重要的是保持Heightmap Resolution为low。在这个例子中,设置为33。 目前版本没有想缺乏地形边缘检测的局限性,并提供多个地形。这个例子表明它不仅能够工作,而且不会有大的性能损失。 感谢Calin创建一个泥土纹理。 为检测示例,<http://blog.almostlogical.com/workingExamples/RealTimeTerrainDeformation/index.html> 为获得源码(unitypackage), 源码要求:Unity 2.6 以及 Detonator Framework。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值