我正在为我的游戏The Broken King,一个立体式roguelike,开发雾效。我不希望它看起来像一个透明的层,放在地板上。我希望人物在移动时实际上会扰乱它。渲染部分使用raymarching在我放置在每个房间上的盒子内。它读取摄像机的深度,以便墙壁和其他不透明几何体可以正确地切割雾效。还有一些3D动画噪声,风,方向光和一些基本的自阴影。光散射基于Beer-Lambert和Henyey-Greenstein,尽管大多数值仍然暴露供视觉调整。碰撞交互是更有趣的部分。 我在计算器中运行一个小的流体模拟,存储密度,水平速度和紊流在一个纹理中。玩家和选择的敌人发送其碰撞器大小和运动到模拟中。 不仅使用碰撞器的当前位置,我从前一个位置到当前位置扫描其踪迹。否则,快敌人和冲刺可以在一帧内移动足够远,以至于会留下痕迹。 使用扫描踪迹,雾气会在人物周围开启,向两边推动,稍微在人物前方积累。一旦他们离开,它会慢慢地关闭。 我决定将流体模拟保持在XZ平面,而不是模拟一个完整的3D流体。由于这是低地雾气,并且游戏有一个立体摄像机,这个差异不值得额外的GPU成本。 雾气本身仍然是以体积方式渲染的;只有运动数据是2D。可以注册大量敌人,但我限制了同一时间可以影响雾气的敌人数量,并优先考虑最相关的敌人。雾气体积也会在其房间没有被渲染很长时间后停止模拟,所以 dungeon的不活跃部分不会消耗GPU资源。 这是在Unity 2022.3中运行的,使用Built-in Render Pipeline和Cinemachine。交互不依赖于触发器或碰撞事件。它直接读取碰撞器,所以也可以与CharacterController,Rigidbody或通过Transform进行的移动一起工作。 我仍在调整雾气关闭的速度和不同敌人推动它的强度。