跳转到内容

天气

场景的天气不是一堆特效参数。项目的雾有它自己的单位,太阳有作者给它的亮度,所以天气表达成场景已有设定的倍率—— 太阳降到四分之一、雾厚五倍、画面灰一点——再加几个在哪里都含义相同的量:雨下多大、地面多湿。同一个预设于是适配任何项目。

给某个实体加一个 Weather 组件。

字段 作用
preset 场景所处的天气:晴、薄雾、阴天、雨、暴风雨。
target 正在转向的天气;无则为 None。
progress 这次转变走了多远(0–1)。游戏会推进它;在编辑器里设置它可以预览转到一半。
duration 一次转变用多少秒。
sequence 自己循环经过的预设,逗号分隔——clear,mist,rain,clear。为空则不动。
hold 序列里每种天气停留多少秒再开始下一次转变。
drive 天气驱动什么:灯光、雾、雨、调色、曝光、反射、声音。
soundSource 一个带循环 AudioSource 的实体——雨声。下雨时天气会抬起它的 playing,并把音量设为创作时的音量乘以雨的大小。

转变带缓动,开始和结束都平缓,完成的转变落在目标上并清空自己。

Details 面板把五种内建天气显示为按钮(项目自己的预设 id 仍然有效,显示为自定义),把向下一种天气的过渡显示为可拖动的进度,还有循环、它驱动的内容,以及它此刻对画面做了什么的读数——主光的缩放、雾的缩放、潮湿和降雨。雨和雾通过 Post Process Volume 进入画面,面板里会这样说明。

  • 灯光。 方向光被缩放(并着色),环境光被缩放,依据的是它们创作时的强度——天气缩放的是你的数字,而不是它自己上一次的结果—— 天气被拿走或关掉 Lights 时它们会被还原。只在游戏运行时:编辑器里灯光不动,所以预览天气不会改动你要保存的场景。
  • 阴影。 随着天空阴下来,方向光的阴影变得更软(光源宽 shadowSoftness 个太阳)、更淡(创作的深浅乘以 shadowStrength), 就像阴天的影子融进地面。
  • 雾。 Height Fog 的密度、太阳辉光和它带的体积光被缩放,天空雾霾被提高,颜色向天气的颜色移动。
  • 雨。 场景没有 Rain 效果时天气会带来一个,强度按预设;Rain 和屏幕空间反射还会得到天气留下的湿度和水坑。场景自己创作了雨, 天气只能把它提高。
  • 反射。 烘焙的反射探针显示的是它烘焙时的天空,所以下雨的街道会映出晴天的街道。环境光带有 reflectionScale 和 reflectionSaturation 就是为此:探针显示的内容乘以前者、按后者褪色,天气会把两者调低。
  • 天空。 Sky Atmosphere 特效把预设的 overcast 当作云量和雾霾:云变厚并连成一片,后面的太阳、月亮和星星被同一份透射率遮住。
  • 调色与曝光。 Colour Grade 的饱和度和对比度被缩放,Auto Exposure 的补偿被提高。

这些效果在场景的体积混合之后才施加,所以在同一场雨里,雾设得薄的场景仍然比雾设得厚的场景薄。

import { registerWeatherPreset } from 'esengine';
// 预设只写它要改的;其余保持中性。
const sandstorm = registerWeatherPreset('sandstorm', {
sun: 0.5, fogDensity: 10, fogTint: [0.82, 0.62, 0.38], fogTintAmount: 0.85,
saturation: 0.8, exposure: 0.4,
});

自定义预设在 sequence 里按名字使用,在 preset 和 target 里按 registerWeatherPreset 返回的 id 使用。 重新注册内置名字就是重新调它。

组件就是数据:写入 target 和 progress: 0,系统会做剩下的事。

world.insert(weatherEntity, Weather, { target: WEATHER_RAIN, progress: 0, duration: 10 });