可使用类似于绘制高度贴图和纹理的方式在地形上绘制树。然而,树是从表面生长的3D对象实体。Unity使用优化(比如针对远处树的公告牌)来保持良好的渲染性能。这意味着可以实现茂密森林(拥有数以千计的树),而仍然保持可接受的帧率。
工具栏上的PaintTrees按钮可用于绘制树:
地形最初没有可用的树原型。为了开始在地形上绘制,需要添加树原型。单击EditTrees按钮,然后选择AddTree。在此处,可从项目中选择树资源,并将其添加为__树预制件__以便与画笔结合使用:
如果所导入的树预制件支持BendFactor__,__AddTree窗口将显示用于调整风响应性的BendFactor属性。SpeedTreeModeler创建的树没有__BendFactor__;只有TreeEditor创建的树才有。请参阅下文关于__让树在风中弯曲__的部分。
配置Settings中的设置(如下文所述)后,可以按照与绘制纹理或高度贴图相同的方法在地形上绘制树。若要从区域中移除树,请在绘制时按住Shift键。若要仅移除当前选定的树类型,请在绘制时按住Control键。
选择要放置的树之后,可调整其设置以便自定义树的位置和特征。
创建树时,将锚点定位在树的基部(树破土而出的位置)。性能取决于树模型的多边形数,因此请确保在平台上进行测试,并在必要时创建更简单的树。另外,对于TreeEditor树,每个网格都正好有两种材质:一种用于树体,另一种用于树叶。
用TreeEditor创建的树必须使用__自然/软遮挡树叶(Nature/SoftOcclusionLeaves)__和__自然/软遮挡树皮(Nature/SoftOcclusionBark)__着色器。要使用这些着色器,必须将树放在名为Ambient-Occlusion的特定文件夹中,否则树无法正确渲染。将模型放入此文件夹并将其重新导入时,Unity会使用一种专为树设计的方式计算软__环境光遮挡__。
如果在单独的3D建模应用程序中更改导入的树资源,则需要单击Editor中的Refresh按钮来查看地形上更新后的树:
注意:在3D建模程序中导入并改变SpeedTree模型后,再将其重新导出(扩展名为.fbx或.obj),可能会丢失SpeedTree模型附带的自然风动画功能。
然后,选择AddComponent>Physics>CapsuleCollider来添加碰撞体。单击预制件名称旁的<以返回到场景。
还必须在TerrainCollider组件中启用EnableTreeColliders。
具有BendFactor的基于地形树通过弯曲和摇摆(根据风区的Turbulence和Main属性值),对风区做出反应。Turbulence设置用于控制树叶的飘动。减小该值可使飘动特效流畅。Main值用于控制风的主要作用力。要创建风区,请选择GameObject>3DObject>WindZone。
如果风区的Mode为Directional__,则其相对于树的位置无关紧要。树将向风区方向摇摆。然而,如果风区的Mode__为Spherical__,则其Radius__必须与树的半径重叠。这样会产生多方向的阵风,风力从中心到边缘衰减。
在默认设置下,诸如阔叶树(Broadleaf)预制件(在StandardAssetsEnvironment包中提供)之类的树可以平稳而逼真地摆动。但是,如果您使用自己的树预制件,可能需要调整WindZone属性值。如果树预制件的树干彻底弯向一侧,请尝试减小Main值。或者,如果树预制件的树枝过度弯曲或伸展,请减小Turbulence值。
ForTreeEditorTrees,Unity’sLODsystemusesa2Dto3Dtransitionzonetoseamlesslyblend2Dbillboardswith3DTreemodels.Thispreventsanysuddenpoppingof2Dand3DTrees,whichisvitalinVR.NotethatbillboardTreesdon’treceivelocallightingsuchasPointLightsandSpotLights.Theyworkwithdirectionallights,butlightingonthebillboardsonlyupdateswhenyourotatetheCamera.