Unity中创建带随机生成Mesh的Prefab对象的最佳实现方式
Unity动态生成随机Mesh的Prefab挂载方案
问题背景
- 正在学习quill18出品的Unity六边形文明类游戏开发教程,临近完成全系列学习时,尝试自主实现随机Mesh生成功能,不再仅使用从Blender导入的现成网格资源
- 目前已完成相关代码编写,可随机生成带单峰的山地六边形地块,生成效果可参考对应附图
- 教程采用的实现逻辑是为每个地块生成对应Prefab的克隆,已知该方案是复杂项目开发的通用最佳实践,但目前不清楚如何将随机生成的Mesh挂载到Unity Prefab对象上
核心疑问
- 如何创建搭载随机生成Mesh的Prefab对象?
- 如果该需求无法直接实现,符合Unity开发规范的最佳实践方案是什么?
回答
首先明确:你无法把每次结果都不固定的随机生成Mesh直接存成静态Prefab资源。Prefab是存在项目磁盘上的固定模板资源,本身不支持每次克隆时自动随机变化的逻辑,就算把某一次随机生成的Mesh硬存进Prefab,所有克隆出来的地块都会长一样,完全失去随机生成的意义。
符合Unity开发规范、且完全适配你当前教程工作流的最佳实践如下,不需要改动原有Prefab克隆的核心逻辑:
- 制作基础地块Prefab模板
先搭建通用地块Prefab结构,挂载所有地块共有的固定组件:MeshFilter、MeshRenderer、地块碰撞体、地块业务逻辑脚本,提前给MeshRenderer配好通用材质,不需要给MeshFilter提前指定固定网格资源。这个Prefab的作用和你之前用Blender导入网格做的地块Prefab完全一致,只是去掉了固定网格的配置。 - 把随机Mesh生成逻辑嵌入实例化流程
不需要在编辑模式下提前存Mesh资源,在你每次调用Instantiate()克隆地块Prefab、拿到新生成的地块实例后,直接调用你已经写好的随机Mesh生成方法,把返回的Mesh对象赋值给当前实例的MeshFilter.mesh属性即可。
核心代码参考:// 原有地块生成逻辑位置 HexCell newCell = Instantiate(hexCellPrefab, spawnPosition, Quaternion.identity); // 调用你已完成的单峰山地随机Mesh生成逻辑 Mesh generatedMountainMesh = HexMeshGenerator.GenerateRandomPeakMesh(); // 给当前地块实例赋值动态生成的Mesh newCell.GetComponent<MeshFilter>().mesh = generatedMountainMesh; - 处理细节避免踩坑
不要给MeshFilter.sharedMesh属性赋值,会直接修改Prefab模板的配置,导致后续所有克隆的地块都被污染;大量生成动态Mesh时,记得给销毁地块对应的Mesh调用Destroy()回收,避免内存泄漏;如果有性能要求,可以搭配对象池复用生成过的同规格Mesh,减少重复生成顶点、三角面的计算开销。
如果你有编辑模式下批量生成固定随机Mesh资源的需求,可以写Editor工具脚本,生成Mesh后调用AssetDatabase.CreateAsset()把Mesh存成项目内的.asset资源,再手动挂载到Prefab上即可,但这种方案不适用每个地块随机差异化的需求。
内容的提问来源于stack exchange,提问作者Andrej
相关产品推荐
相关产品推荐

