[饥荒独立游戏制作] 4-7.随机数种子及Mesh地面的绘制

本文介绍了在Unity中如何使用随机数种子来生成可重复的地形,包括伪随机数的概念、随机数种子的设置方法及如何利用这些原理生成带有UV坐标的地形Mesh。

伪随机与随机数种子

因为计算机中的随机是伪随机(体现在多次生成n个数,每次结果都一样),随机一般要基于一些外部的输入,常见的就是根据当前时间,但是我们也可以设置基于什么条件,这个条件就是种子。
    
//C#随机数种子 System . Random rand = new System . Random ( , ) ; //Unity随机数种子 Random . InitState ( 1 ) ; print ( Random . value ) ;

添加随机数种子

在生成的坐标中添加Unity随机数种子(伪随机,随机数种子一样,每次生成的地图都一样,因此可以进行存档)。
    
Random . InitState ( randomSeed ) ; float randomX = Random . Range ( 0 , 10000 ) ; float randomZ = Random . Range ( 0 , 10000 ) ; float y = Mathf . PerlinNoise ( x * lacunarity + randomX , z * lacunarity + randomZ ) * tileHeightMultiply ;

项目准备

引入程序框架

导入UnityPackage或者直接将框架文件夹拖入Assets下即可。 源代码链接

程序集定义

框架部分的代码已经确定,通常情况下不希望重新编译,通过额外设定程序集与CSharp做分离,在框架根目录下新建一个Assembly Definition即可。

实时绘制一个Mesh作为地面

Panel

Unity自带的Panel作为地面存在问题:
  • 顶点数量较多
  • UV信息导致贴图角度不对(z轴反了) 因此需要自己绘制一个矩形作为地面。

绘制三角网格和矩形

    
[ Button ( "生成地图" ) ] public void GenerateMap ( ) { Mesh mesh = new Mesh ( ) ; mesh . vertices = new Vector3 [ ] { new Vector3 ( 0 , 0 , 0 ) , new Vector3 ( 0 , 1 , 0 ) , new Vector3 ( 1 , 1 , 0 ) } ; mesh . triangles = new int [ ] { 0 , 1 , 2 } ; meshFilter . mesh = mesh ; }
首先定义mesh中的顶点坐标,再定义顶点编号(绘制顺序),即可绘制(注意物体可见需要同时有meshRender和meshFilter两个组件),三个点一个三角面,两个三角面构成一个矩形。
对生成Mesh单独封装后绘制矩形地面。
    
public MeshRenderer meshRenderer ; public MeshFilter meshFilter ; public int mapWidth ; public int mapHeight ; /// <summary> /// 生成地图 /// </summary> [ Button ( "生成地图" ) ] public void GenerateMap ( ) { meshFilter . mesh = GenerateMapMesh ( mapHeight , mapWidth ) ; } private Mesh GenerateMapMesh ( int height , int width ) { Mesh mesh = new Mesh ( ) ; mesh . vertices = new Vector3 [ ] { new Vector3 ( 0 , 0 , 0 ) , new Vector3 ( 0 , 0 , height ) , new Vector3 ( width , 0 , height ) , new Vector3 ( width , 0 , 0 ) } ; mesh . triangles = new int [ ] { 0 , 1 , 2 , 0 , 2 , 3 } ; return mesh ; }

设置Mesh的UV

UV介绍

UV包含在Mesh中,将模型拍平成多个面。
对于矩形面片,UV和mesh一致(只有一个面)。

设置地形MeshUV

    
mesh . uv = new Vector2 [ ] { new Vector3 ( 0 , 0 ) , new Vector3 ( 0 , 1 ) , new Vector3 ( 1 , 1 ) , new Vector3 ( 1 , 0 ) , } ;
对于创建的Mesh,必须设置UV才能正确的显示贴图,四个点规定了vu的形状,贴图会对应自动缩放,生成的效果图片较暗,缺少光照信息。
    
mesh . RecalculateNormals ( ) ;
计算光照法线后。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值