Siki_Unity_7-4_高自由度沙盘游戏地图生成_MineCraft_Uniblocks插件(可拓展)

Unity 7-4 高自由度沙盘游戏地图生成 MineCraft
(插件Uniblocks)

任务1&2&3&4 素材 && 课程演示 && 课程简介

使用插件Uniblocks Voxel Terrain v1.4.1 -- 专用于生成方块地图 (该插件目前在AssetStore中不可用)
  讲解博客:https://blog.csdn.net/qq_37125419/article/details/78339771
  官方地址:
    https://forum.unity.com/threads/uniblocks-cube-based-infinite-voxel-terrain-engine.226014/

课程内容:
  生成地形
  创建新的方块
  摆放/删除方块元素
  地图数据的保存/加载
  后续开发的扩展

任务5:创建工程 导入插件

将Uniblocks Voxel Terrain v1.4.1.unitypackage导入新建工程MineCraftMapGenerator


删除多余文件(高亮)
Standard Assets -- 角色控制
Uniblocks -- 地形生成
  UniblocksAssets -- DemoScene, Models, Meshes, Textures, Materials等
  UniblocksDocumentation -- 文档
  UniblocksObjects -- Prefabs: 比如blocks,Engine,Chunks等
  UniblocksScripts -- Scripts

打开Demo.unity
  

Uniblocks Dude -- 主角
Engine -- 游戏启动核心
SimpleSun -- 太阳光
selected block graphics -- 选中的方块
crosshair -- 十字准心

游戏操作:

空格:跳跃; WASD:行走

任务6:Uniblock中对方块生成的组织管理方式

对方块的管理方式:
  Engine引擎-->ChunkManager大块管理器  Chunk大块  VoxelInfo小块
  每一个Block是一个小块,多个小块构成一个Chunk大块
    小块不是单个游戏物体,Chunk才是
      -- 如果每个小块都是单独的游戏物体,都需要进行渲染:耗费性能
      https://blog.csdn.net/qq_30109815/article/details/53769393

Engine物体中有三个脚本
  Engine.cs -- 配置生成地图所需要的信息
  ChunkManager.cs -- 存放一个集合,管理所有的Chunk,Chunk负责各自内部的VoxelInfo小块
  ConnectionInitializer.cs -- 多人游戏

Voxel.cs -- 每种小块的共同属性
VoxelInfo.cs -- 一个大块下的小块们的信息(如位置等)
  详见任务19

任务7:Block、Voxel和VoxelInfo的区别与联系、禁用抗锯齿

Block是小块,没有对应类,但是有对应的Prefab(block0~block9)

每一个Block的prefab中都被添加了一个Voxel.cs的脚本 -- 确定了方块的种类
  Voxel:体素,体素是体积元素(Volume Pixel)的简称

当一个Block在Scene中被创建出来的时候,就多了一个VoxelInfo.cs的脚本,用于表示在Chunk中的位置

抗锯齿:
  Console中的警告:
  Uniblocks: Anti-aliasing is enabled. This may cause seam lines to appear between blocks. If you see lines between blocks, try disabling anti-aliasing, switching to deferred rendering path, or adding some texture padding in the engine settings.

我们会发现,在有的地方,方块之间会出现一条白线,这是渲染造成的问题
解决方法:Edit->Project Settings->Quality->Anti-Aliasing = Disabled; 关闭抗锯齿即可

任务8:最简单的地图生成方式

创建文件夹Scenes,创建简单的场景Simple

1. 在scene中创建Uniblocks->UniblocksObjects->_DROPTHISINTHESCENE->Engine

2. 创建空物体,添加脚本ChunkLoader.cs
  ChunkLoader的作用为 启用Engine(相当于开始发动的驾驶员)
  地形是围绕ChunkLoader的位置生成的(与y坐标无关)
  很多时候ChunkLoader游戏物体为角色本身,因为需要将围绕角色生成地形
    地形的高度不会超过48,因此可以将角色的高度调至48以上,表示生成时角色在地图上方

任务9:地图生成大小的设置 + Chunk的产生和销毁
&10:Chunk生成的变化高度和大小
&11:大块贴图、网格、碰撞器的设置
&12:数据保存和加载

在菜单栏Window中会发现两个新增的选项:
  UniBlocks-BlockEditor
  UniBlocks-EngineSettings

这两个选项分别对应UniblocksScripts->Editor中的两个脚本BlockEditor.cs和EngineSettings.cs

WorldName:与自动创建的Worlds文件夹下的TextWorld文件夹对应,
  每一个WorldName会对应一个文件夹,里面保存着世界的数据

Chunk相关:
ChunkSpawnDistance=8:地图大小,以ChunkLoader为中心分别朝四周扩展8个Chunk
  当ChunlLoader移动时,会保证四周都有8个Chunk(新生成chunk补上)
ChunkDespawnDistance=3:销毁已生成的远距离(超过该距离8+3=11)的Chunk--基于性能考虑

ChunkHeightRange=3:整个地图中最高和最低不超过3个chunk的高度 (每个高度为ChunkSizeRange)
  因此高度为48~-48之间变化
ChunkSideLength=16:每个Chunk管理16*16*16m的一个区域(高度不一定为16,但肯定不超过16)

贴图相关:
Uniblocks->UniblocksObjects->ChunkObjects->Chunk -- Prefab
  生成Chunk的时候,根据这个prefab来生成Chunk,Chunk中的小块blocks再通过Mesh进行渲染
  Mesh中有很多小格,需要给每个小格贴图--Chunk中的MeshRenderer.material=texture sheet指定贴图
  每个小格的贴图都是从texture sheet中取得的
      -- 贴图可以以其他方式显示,如正方形
    贴图的整体如图:
      
      贴图分成了 8*8 个小格,将所有小格的贴图存放在同一个贴图中 -- 性能优化(贴图越少性能越好)
      增加小贴图,直接修改psd文件在空白处增加即可

TextureUnit=0.125:由于贴图分成8*8个小格,0.125即1/8
TexturePadding=0:小格与小格之间的空隙,比如空隙为1个pixel,值就是1/512
  没有空隙的坏处是:由于美工裁剪的不精确,有可能出现把其他小格的部分也包括了,变成细缝

注意:Chunk是可以添加多个材质MeshRenderer.materials的,要求是这些材质的大小必须相同(便于裁剪成小格)

其他设置:

Generate Meshes: 是否生成Mesh网格
Generate Colliders: 是否生成碰撞体
Show Border Faces: 略,默认为false

事件有关:

Send Camera Look Events: 聚焦在Camera视野的中心 (十字准心 CrossHair)
Send Cursor Events: 聚焦在鼠标的位置

数据的保存和加载:

Save/ Load Voxel Data: 取消勾选时,重新加载场景的时候,会重新生成地图
  如果勾选,在加载场景的时候,则会先判断本地是否有地图数据,如果有则加载。
  -- 保存: 需要手动调用Engine中保存的方法;
  -- 加载: 如果勾选时,会自动在开始场景的时候进行加载

在DemoScene中会有自动保存功能
  

Multiplayer设置:

与地图同步有关,地图在Server端同步,Client从Server端得到数据

任务13:Block的有关设置(创建、修改、复制、删除)
&14&15&16:Block的Mesh、贴图、透明度和碰撞器设置

Window -> Uniblocks -> Block Editor

BlocksPath: 存储blocks的prefab的路径
  之前说Chunk是生成单位,每个block并不会生成对应的游戏物体 -- 性能优化
  那么这里的blocks的prefab是用来干什么的呢?
    用来保存每一种blocks的属性,并不是用来实例化的

empty:每一个chunk由长*宽*高个blocks组成,那些空的部分就是由empty blocks填充的
  比如一个chunk,除了表面显示的那部分blocks,下面的是dirt或其他blocks,上面的就是empty blocks了

创建:点击New block,修改属性即可
删除:直接删除在Project中的对应prefab即可
复制:直接修改需要复制的block的id值,按Apply,就能得到一个新的id的block,原来的block不变

block的属性:

id -- 每一种block的id是不同的,是identity

Mesh相关:
Custom mesh -- 默认的mesh是立方体,比如door和tall grass就是自定义的
Mesh -- 勾选了Custom Mesh后,需要指定自定义的mesh
Mesh Rotation -- 勾选了Custom Mesh后,可以选择Mesh Rotation,表示mesh的旋转 (None/ Back/ Right/ Left)
  比如door:如果mesh rotation=back,则门是创建在格子的另一边

贴图相关:
当勾选了CustomMesh后,贴图就会使用默认的贴图 -- 在创建模型时就处理好贴图;
若没有勾选CustomMesh,则可以在这里选择Texture属性
  Texture: 上面对texture sheet进行了讲解,它是一个 8*8的贴图,从左下角开始为 (0, 0)
    之前在EngineSettings中设定了TextureUnit=0.125,
    这里以坐标的方式指定贴图 (x, y)(横向为x轴,纵向为y轴),即可获取对应格子位置的贴图
  Define Side Texture: 每个立方体有六个面,如果六个面的Texture不同,则需要勾选
    比如grass:
      grass的四周是半dirt半grass的显示,上方为grass,下方为dirt
      所以 -- Top: (0,2); Bottom: (0,0); Right/ Left/ Forward/ Back: (0,1)

Material Index: 如果Chunk的MeshRenderer.material中有多个材质,则可以指定当前为第index个材质

透明度设置:

Transparency: Solid 不透明/ Semi Transparent 半透明/ Transparent 全透明
  leave/ grass/ door为半透明
  半透明和全透明的区别:
    全透明会使中间部分没有显示,而半透明会显示中间部分,如:
    
      左图为全透明,右图为半透明,很明显,右图显示的更密集,因为把中间部分的叶子也显示出来了
      上图为Scene视图,Game视图更加明显,也可以观察影子对比。

  对于Solid的方块而言,若六面都有其他方块包裹,则Chunk会将其mesh删除,不再渲染 -- 性能优化

碰撞器设置:

Collider: 可以选

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值