天气
场景的天气不是一堆特效参数。项目的雾有它自己的单位,太阳有作者给它的亮度,所以天气表达成场景已有设定的倍率—— 太阳降到四分之一、雾厚五倍、画面灰一点——再加几个在哪里都含义相同的量:雨下多大、地面多湿。同一个预设于是适配任何项目。
给某个实体加一个 Weather 组件。
| 字段 | 作用 |
|---|---|
preset |
场景所处的天气:晴、薄雾、阴天、雨、暴风雨。 |
target |
正在转向的天气;无则为 None。 |
progress |
这次转变走了多远(0–1)。游戏会推进它;在编辑器里设置它可以预览转到一半。 |
duration |
一次转变用多少秒。 |
sequence |
自己循环经过的预设,逗号分隔——clear,mist,rain,clear。为空则不动。 |
hold |
序列里每种天气停留多少秒再开始下一次转变。 |
drive |
天气驱动什么:灯光、雾、雨、调色、曝光、反射、声音。 |
soundSource |
一个带循环 AudioSource 的实体——雨声。下雨时天气会抬起它的 playing,并把音量设为创作时的音量乘以雨的大小。 |
转变带缓动,开始和结束都平缓,完成的转变落在目标上并清空自己。
Details 面板把五种内建天气显示为按钮(项目自己的预设 id 仍然有效,显示为自定义),把向下一种天气的过渡显示为可拖动的进度,还有循环、它驱动的内容,以及它此刻对画面做了什么的读数——主光的缩放、雾的缩放、潮湿和降雨。雨和雾通过 Post Process Volume 进入画面,面板里会这样说明。
天气改变什么
Section titled “天气改变什么”- 灯光。 方向光被缩放(并着色),环境光被缩放,依据的是它们创作时的强度——天气缩放的是你的数字,而不是它自己上一次的结果——
天气被拿走或关掉
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 });