伪随机与随机数种子

因为计算机中的随机是伪随机(体现在多次生成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 ( ) ;
计算光照法线后。
Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐