可使用类似于绘制高度贴图和纹理的方式在地形上绘制树。然而,树是从表面生长的 3D 对象实体。Unity 使用优化(比如针对远处树的公告牌)来保持良好的渲染性能。这意味着可以实现茂密森林(拥有数以千计的树),而仍然保持可接受的帧率。
工具栏上的 Paint Trees 按钮可用于绘制树:
地形最初没有可用的树原型。为了开始在地形上绘制,需要添加树原型。单击 Edit Trees 按钮,然后选择 Add Tree。在此处,可从项目中选择树资源,并将其添加为__树预制件__ 以便与画笔结合使用:
为便于进行原型设计,SpeedTree 在 Asset Store 上的免费 SpeedTrees 包 中提供了四种 SpeedTree 模型。或者,您也可以创建自己的树。
如果所导入的树预制件支持 Bend Factor__,__Add Tree 窗口将显示用于调整风响应性的 Bend Factor 属性。SpeedTree Modeler 创建的树没有 __Bend Factor__;只有 Tree Editor 创建的树才有。请参阅下文关于__让树在风中弯曲__的部分。
配置 Settings 中的设置(如下文所述)后,可以按照与绘制纹理或高度贴图相同的方法在地形上绘制树。若要从区域中移除树,请在绘制时按住 Shift 键。若要仅移除当前选定的树类型,请在绘制时按住 Control 键。
选择要放置的树之后,可调整其设置以便自定义树的位置和特征。
属性: | 功能: |
---|---|
Mass Place Trees | 创建一批整体覆盖的树,但不绘制在整个地形上。批量放置树后,仍然可以使用绘制功能来添加或移除树,从而创建更密集或更稀疏的区域。 |
Brush Size | 控制可添加树的区域的大小。 |
Tree Density | Tree Density 控制 Brush Size 定义的区域中绘制的树平均数量。 |
Tree Height | 使用滑动条来控制树的最小高度和最大高度。将滑动条向左拖动绘制矮树,向右拖动绘制高树。如果取消选中 Random,可以将所有新树的确切高度比例指定为 0.01 到 2 的范围内。 |
Lock Width to Height | 默认情况下,树宽度与其高度锁定,因此始终会均匀缩放树。然而,可以禁用 Lock Width to Height 选项,然后单独指定宽度。 |
Tree Width | 如果树宽度未与其高度锁定,则可以使用滑动条来控制树的最小宽度和最大宽度。将滑动条向左拖动绘制细树,向右拖动绘制粗树。如果取消选中 Random,可以将所有新树的确切宽度比例指定为 0.01 到 2 的范围内。 |
Random Tree Rotation | 如果为树配置 LOD 组,请使用 Random Tree Rotation 设置来帮助创建随机自然的森林效果,而不是人工种植的完全相同的树。如果要以相同的固定旋转来放置树,请取消选中此选项。 |
Color Variation | 应用于树的随机着色量。仅在着色器读取 _TreeInstanceColor 属性时有效。例如,用 Tree Editor 创建的所有树的着色器将读取 _TreeInstanceColor 属性。 |
Tree Lightmap Static | 启用此复选框可向 Unity 指示该游戏对象的位置是固定的并将参与全局光照计算。如果未将游戏对象标记为 Lightmap Static,则仍可使用光照探针为该对象提供光照。 |
可通过两种方法来新建树模型。可以使用 IDV, Inc. 提供的 SpeedTree Modeler 来创建具有高级视觉效果(例如,平滑的 LOD 过渡、快速公告牌以及自然风动画)的树。有关更多详细信息,请参阅 SpeedTree Modeler 文档。或者,也可以使用 Unity 的 Tree Editor 来创建树模型。
在内部,地形引擎通过确定树预制件的根游戏对象上是否存在 LOD 组来区分这两种类型的模型。SpeedTree 预制件具有 LODGroup 组件,但 Tree Editor 预制件没有该组件。
创建树时,将锚点定位在树的基部(树破土而出的位置)。性能取决于树模型的多边形数,因此请确保在平台上进行测试,并在必要时创建更简单的树。另外,对于 Tree Editor 树,每个网格都正好有两种材质:一种用于树体,另一种用于树叶。
用 Tree Editor 创建的树必须使用__自然/软遮挡树叶 (Nature/Soft Occlusion Leaves)__ 和__自然/软遮挡树皮 (Nature/Soft Occlusion Bark)__ 着色器。要使用这些着色器,必须将树放在名为 Ambient-Occlusion 的特定文件夹中,否则树无法正确渲染。将模型放入此文件夹并将其重新导入时,Unity 会使用一种专为树设计的方式计算软__环境光遮挡__。
如果在单独的 3D 建模应用程序中更改导入的树资源,则需要单击 Editor 中的 Refresh 按钮来查看地形上更新后的树:
注意:在 3D 建模程序中导入并改变 SpeedTree 模型后,再将其重新导出(扩展名为 .fbx
或 .obj
),可能会丢失 SpeedTree 模型附带的自然风动画功能。
可以将胶囊碰撞体 (Capsule Collider) 添加到新的树资源。首先,将预制件从 Assets 文件夹拖动到场景中,从而实例化场景中的树。然后,使用菜单 Component > Physics > Capsule Collider 来添加碰撞体。下一步,可以执行以下操作之一:
覆盖原始预制件:单击 Inspector 窗口中的 Tree 游戏对象上的 Apply 按钮:
新建预制件:将 Tree 游戏对象拖入 Assets 文件夹。
如果新建预制件,请确保将带有碰撞体的树添加到地形,而不是添加原始的游戏对象。还必须在地形的 Terrain Collider 组件中启用 Create Tree Colliders 设置。
本节仅适用于 Unity 的 Tree Editor 创建的树(具有 __Bend Factor__)。
要让树对风做出反应,首先选择 GameObject > 3D Object > Wind Zone 来创建 Wind Zone。
为了确保将树设置为可以弯曲,请选择__地形__,单击 Inspector 中的 Place Trees 按钮,然后选择 Edit Trees > Edit Tree。如果尚未将 Bend Factor 设置为 1,请进行此设置。
在默认设置下,树的移动非常剧烈。为了修复此问题,请更改每个树类型的 Bend Factor。如果希望一些树类型比其他树类型具有更大的弯曲度,此设置会很有用。若要更改整个 Wind Zone 中的弯曲效果,请直接配置 Wind Zone 组件中的值。为了减少树叶的飘动效果,请将风的湍流度下调到 0.1–0.3 左右,然后一切就会变得更平稳。如果不希望树始终吹向一边,而是希望有一些变化,请将 Main 值减小到与湍流度的值相同。
对于 Tree Editor 树,Unity 的 LOD 系统使用 2D 到 3D 过渡区将 2D 公告牌与 3D 树模型进行无缝混合。这样可以防止 2D 和 3D 树显得过于突兀,这一点在 VR 中至关重要。
对于 SpeedTree 树,请参阅 LOD 和 LOD 组 (LOD Group) 文档以了解关于配置 LOD 组件的更多信息。
2019–01–29 页面已修订并进行了编辑审查
在 2018.3 版中添加了新设置和 SpeedTree 功能
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.