Small_tailqwq-Chill_Env_Sync icon

Chill Env Sync

实时天气同步插件,可以根据真实世界的天气情况自动调整游戏内的环境效果,或基于现实时间模拟昼夜循环。

Last updated 20 hours ago
Total downloads 4
Total rating 1 
Categories Mods
Dependency string Small_tailqwq-Chill_Env_Sync-1.5.3
Dependants 0 other packages depend on this package

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2304 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2304

README

Chill Env Sync(实时天气同步插件)

License: MIT .NET Framework 4.7.2 BepInEx

一个用于游戏 《放松时光:与你共享Lo-Fi故事》 的实时天气同步 BepInEx 插件,可以根据真实世界的天气情况自动调整游戏内的环境效果,或基于现实时间模拟昼夜循环。


Chill with You

「放松时光:与你共享Lo-Fi故事」是一个与喜欢写故事的女孩聪音一起工作的有声小说游戏。您可以自定义艺术家的原创乐曲、环境音和风景,以营造一个专注于工作的环境。在与聪音的关系加深的过程中,您可能会发现与她之间的特别联系。


English Version

所有代码均由 AI 编写,人工仅作反编译和排错处理。 这是我第一次用 AI 为 Unity 游戏做 MOD,有问题请反馈,虽然反馈了我也是再去找 AI 修就是了🫥


关联我写的第二个土豆 mod:iGPUSaviorMod
关联 BILIBILI 视频:时间、天气与土豆 (<-- 评价为:纯引流,啥干货没有)

✨ 主要功能

  • 🌤️ 实时天气同步:通过心知天气 API 获取真实天气数据,自动调整游戏内环境
  • 🌍 多城市支持:支持任意城市的天气查询(拼音或中文)
  • 🌓 昼夜循环:根据配置的日出日落时间自动切换白天/黄昏/夜晚场景
  • 🔓 解锁所有环境:自动解锁所有环境和装饰品
    • 此选项不会影响存档,仅在当前游戏会话中生效
    • 可选配置项
      • UnlockAllEnvironments:是否解锁所有环境
      • UnlockAllDecorations: 是否解锁所有装饰品
      • UnlockPurchasableItems:是否解锁所有游戏币解锁内容
  • ⌨️ 快捷键操作
    • F7 - 强制刷新天气
      • 忽略缓存,强制从心知天气 API 获取最新的实时天气数据。
      • 重置 API 慢钟计时器。
    • F8 - 显示当前状态
      • 在日志中输出一条信息,没啥用
    • F9 - 手动触发同步
      • 使用当前已有的天气缓存和实时的本地时间,强制重新计算并应用游戏环境

⚠️ 本项目可能有

  • 💽外挂嫌疑:本插件会默认修改游戏中的环境和装饰品解锁状态,但是不会写入存档如果你打算自己解锁,还请自己调整配置文件(详见下文)
  • 💥莫名冲突:如果未来游戏更新或者 Mod 大井喷,本插件很可能与其他插件发生冲突。因为我也知道我和 AI 配合写得很烂,届时还请别抱太大修复希望
  • 💸仅供学习:本插件采用了 MIT许可证,法律上来说你可以想干啥干啥,但是请不要直接拿 DLL 去卖
  • 🧷外部链接:本插件使用了第三方天气 API 服务,使用时请注意隐私和数据安全。且该第三方数据服务提供范围请以实际为准
  • 😵‍💫粗制滥造:本插件完全由 AI 编写,可能存在各种问题和漏洞,请谨慎使用。我完全不懂 C#,那你叫我怎么办嘛
  • 🧱区域限定:获取天气功能、UI 显示天气数据等功能可能只在部分地区部分语言环境下可用,对此深感歉意。
  • 🤖智械危机:使用本插件可能会加速AI统治世界的进程,后果自负。(<---这段不是我自己写的)

🎮 支持的环境类型

基础环境(互斥)

注:游戏逻辑上只能同时存在一个开启,但是实际上可以强开多个。感觉除了平滑切换场景能用上外感觉没啥必要提这一嘴

  • ☀️ 白天 (Day)
  • 🌅 黄昏 (Sunset)
  • 🌙 夜晚 (Night)
  • ☁️ 多云 (Cloudy)

降水效果

注:下列为游戏内效果,具体现实天气对应逻辑请看下文“使用方法”部分

  • 🌧️ 小雨 (LightRain)
  • 🌧️ 大雨 (HeavyRain)
  • ⛈️ 雷雨 (ThunderRain)
  • ❄️ 雪 (Snow)

风景效果

开启彩蛋功能后,系统可能会随机或者在满足特定条件后主动开启某些风景效果。

声音效果

开启彩蛋功能后,系统可能会在满足特定条件后主动开启某些声音效果。

TODO

🗒️ 本项目的未来计划和待办清单

  • [x] 基础功能优化
  • [x] 根据季节、天气等因素展示B类风景
  • [x] 根据季节、时间等因素展示C类风景
  • [x] 根据时间、季节等因素自动触发背景音乐
  • [x] 代码重构,拆分为多个子模块,方便后续 AI 维护
  • [x] 应付将来的游戏更新(成功活到了 ver1.1)
  • [ ] 永远都修不够的 BUG
  • [ ] 抽空在土豆模式中对 todo、note 等功能进行优化

📦 安装方法

前置要求

安装步骤

⚠️ 重要:必须按顺序安装!
⚠️ 重要:请在发布/releases界面下载 dll 文件

  1. 确保已正确安装 BepInEx 框架
  2. 先启动一次游戏,让 BepInEx 完成初始化
    • 游戏启动后,等待加载到主界面
    • 看到 BepInEx 控制台窗口出现
    • 确认 BepInEx/plugins/ 文件夹已创建
    • 退出游戏
  3. 将下载好的 RealTimeWeatherMod.dll 放入 BepInEx/plugins/ 目录
  4. 再次启动游戏,插件将自动加载
  5. 编辑配置文件(位于 BepInEx/config/chillwithyou.envsync.cfg
  6. 游戏中按 F7 可以刷新配置

常见问题

  • 如果 mod 无法正常工作,请确保先让 BepInEx 初始化完成后再安装 mod!
  • 如果找不到 *.dll,说明你下载的是源码(Source code),而不是发布产物(releases)

⚙️ 配置说明

首次运行后,配置文件将生成在 BepInEx/config/chillwithyou.envsync.cfg

配置项说明

[Automation]
## 启用季节性彩蛋与环境音效自动托管
EnableSeasonalEasterEggs = true


[Debug]
## 是否开启调试模式 | 非调试请勿动
EnableDebugMode = false
## 模拟天气代码
SimulatedCode = 13
## 模拟温度
SimulatedTemp = 13
## 模拟天气描述
SimulatedText = DebugWeather

[Internal]

## 上次同步日期 | 非调试请勿动
LastSunSyncDate = 2025-12-02

[TimeConfig]
## 日出时间(格式:HH:mm) | 5.1.2版本不用手动修改
Sunrise = 06:30
## 日落时间(格式:HH:mm) | 5.1.2版本不用手动修改
Sunset = 18:30

[UI]
## 是否在游戏日期栏显示实时天气和温度
ShowWeatherOnDate = true


[Unlock]
## 是否自动解锁所有环境场景 | 可能包含某些未实装的场景,谨慎开启
UnlockAllEnvironments = true
## 是否自动解锁所有装饰品 | 可能包含某些未实装的饰品,谨慎开启
UnlockAllDecorations = true
## 解锁游戏币购买内容 | 可能大幅缩短游戏寿命,谨慎开启
UnlockPurchasableItems = false


[WeatherAPI]
## 是否启用天气 API 同步 | 不开启大部分功能无法使用
EnableWeatherSync = false
## 心知天气 API Key | v5.1.2版本后,留空可直接使用内置密钥
SeniverseKey = 
## 城市名称(拼音或中文,如:beijing、上海,ip 表示自动定位)
Location = beijing


[WeatherSync]
## 天气API刷新间隔(分钟) | 非调试请勿动
RefreshMinutes = 30

获取心知天气 API Key

💡 新版本内置密钥,留空也可用天气服务。自己申请也可用,看个人喜好

  1. 访问 心知天气开发者平台
  2. 注册账号并登录,转到 控制台 - 产品管理 - 免费版(如果你是试用版或者其他版本,请选择对应版本)
  3. 在产品管理中找到 私钥,复制该密钥
  4. 将该私钥填入配置文件的 SeniverseKey 字段,无需添加引号等特殊符号
  5. 设置 EnableWeatherSync = true 启用天气同步
  6. 可按需配置刷新时间,避免API调用过于频繁
  7. 如有不懂之处,可以参阅 issues。

🚀 使用方法

基础使用(默认开启)

插件默认会根据配置的日出日落时间自动切换环境:

  • 日出后到日落前 1 小时:白天
  • 日落前 30 分钟到日落后 30 分钟:黄昏
  • 其他时间:夜晚

天气同步模式(需开启)

  1. 按照上述方法配置好 API Key

  2. 插件将每隔指定时间(默认 30 分钟)自动获取天气并更新环境

  3. 环境映射规则:

环境 正常天气 恶劣天气
☀️ 白天(Day) 日出 → 日落前30分钟
🌅 黄昏(Sunset) 日落前30分钟 → 日落后30分钟
☁️ 多云(Cloudy) 日出 → 日落后30分钟
🌙 夜晚(Night) 日落后30分钟 → 日出 日落后30分钟 → 日出

💡 恶劣天气时,白天和黄昏时段统一显示为多云环境,黄昏效果会被跳过。夜晚环境不受天气影响,始终在日落后 30 分钟准时切入。

  1. 恶劣天气名单:
4, 7, 8, 9 (多云/阴天)
11, 12, 14-20 (中雨及以上, 雷暴, 冻雨)
23-25 (中雪及以上)
26-31 (沙尘/雾)
34-36 (风暴)
  1. 天气映射规则:
游戏效果代码 对应 API 天气 ID (参考) 逻辑说明
Snow 20-25 (雪/雨夹雪/暴雪) 所有的雪类,统统下雪。
ThunderRain 11, 12, 16, 17, 18 (雷/暴雨) 雷阵雨、暴雨、特大暴雨,上强度。
HeavyRain 10, 14, 15 (阵雨/中雨/大雨) 普通的下雨,量比较大。
LightRain 13, 19 (小雨/冻雨) 淅淅沥沥的小雨。
OFF (关闭) 0-9, 26-39 (晴/多云/阴/雾/风) 关键点:如果是阴天或多云,必须强制关闭所有雨雪效果!

快捷键功能

  • F7:立即强制刷新天气(跳过缓存)
    • 核心目的:
      • 忽略缓存,强制从心知天气 API 获取最新的实时天气数据。
    • 重置 API 慢钟计时器。
      • 触发行为:
    1. 清空计时器:重置下次自动请求 API 的倒计时。
    2. 强制联网:无视 CacheExpiry(60分钟缓存期),直接向 api.seniverse.com 发起 HTTP 请求。
    3. 数据更新:如果请求成功,会用新的天气数据覆盖内存中的 _cachedWeather。
    4. 自动应用:拿到新数据后,会自动调用 ApplyEnvironment 来更新游戏场景。
    • 适用场景:
      • 你觉得天气变了(比如窗外刚下雨了),但游戏里还是晴天(因为还在缓存期内)。
      • 调试 API 连接是否正常。
      • 修改了配置文件中的 Location(城市)后,想立即生效。
  • F8:在日志中显示当前环境状态
    • 打印一条日志
  • F9:手动触发一次天气同步
    • 核心目的:
      • 不联网,使用当前已有的天气缓存和实时的本地时间,强制重新计算并应用游戏环境。
      • 关键点:它会绕过“防抖动”检查(即 if (Current == Target) return),强制执行一次完整的环境切换流程(关灯 -> 开灯 -> 服务同步)。
    • 触发行为:
    1. 读取缓存:直接读取内存中的 _cachedWeather(如果没缓存,只算时间)。

    2. 重算时间:根据当前秒数 (DateTime.Now),重新计算是白天、黄昏还是夜晚。

    3. 暴力执行:

      • 调用 ForceActivateEnvironment。

      • 强制模拟点击 MainIcon(即使它看起来是亮着的)。

      • 强制调用 WindowViewService.ChangeWeatherAndTime。

      • 强制写入 SaveDataManager。

    • 适用场景:
      • 修复错位:比如游戏 UI 显示是“雨天”,但画面上雨停了;或者声音还在响,但图标灭了。按 F9 可以“踢”一下游戏,让它回正。
      • 日落/日出测试:当你觉得时间到了(比如17:30),但游戏没切黄昏(可能是快钟还没跳),按 F9 可以立即触发时间判断。
      • 无网状态:断网时,F7 会失败,但 F9 可以用来刷新本地时间逻辑(白天/夜晚切换)。

🔧 技术细节

  • 框架:BepInEx 5.x
  • 目标框架:.NET Framework 4.7.2
  • 使用技术/工具
    • Harmony 补丁(用于游戏功能注入)
    • Unity 协程(用于异步网络请求)
    • 反射(用于访问游戏内部系统)
    • dnSPY
    • 各种大语言模型

📝 版本历史

注:版本号为 AI 自己写的,不关我的事,我也不知道为啥它刷版本号为什么这么随意

v5.1.3-最后的两月

  • 修复了由于游戏修正单词导致的 UI 层显示内容无法正确 hook 问题
  • 修复了由于游戏更新时间调整方法导致时间切换不生效问题
  • 修复了由于上面一堆报错导致热键不生效的问题
  • 添加了对于“转换心情”中需要通过货币解锁内容物的解锁支持
    • 注:此配置项默认关闭,开启此配置项可能导致游戏寿命大幅缩短
      • 开启此配置项不支持热修改,请确保修改时游戏处于关闭状态或修改后重启游戏
      • 此配置项不影响存档,你依旧可以在关闭解锁功能后重启手动兑换道具
  • 此版本开发时间约 4小时,部分情景可能未作细致测试,如果遇到 bug,请通过 GitHub 进行反馈。

v5.1.2-老坛酸菜版(?

  • 内置了一个 KEY,当发现 KEY 异常调用时,不排除强行重置行为
  • 修复了可能导致 UI 控件无法交互的问题
  • 修复了背景音乐在彩蛋模式激活后无法关闭的问题
  • 修复了天气开关被错误统计到脏目录的问题

b5.1.1

  • 添加了一个改写上午/下午的功能,现在是凌晨、清晨、上午、中午、下午、傍晚、晚上了

b5.0.1-煮饭时间到

  • 没啥变化,只是把风景啥的的枚举类丢给 Gemini 让他写上去了,这 B 这都要刷一个版本号,我服了
  • 此版本应该是游戏本体下一次更新前的定稿版本了,除非有 bug 需要修复,暂时想不到新功能了。你有好的想法也可以提出来。

v5.0.0

  • 什么?版本直接跳到 v5 了?你都干了些什么口牙!
  • 独立组件:新建一个 SceneryAutomationSystem 类(继承 MonoBehaviour),挂载在 Runner 上,这样它有自己的 Update 循环,不干扰原本的天气同步逻辑
  • 规则驱动:Gemini 它把“做饭声音”、“空调声音”、“樱花”、“烟花”等抽象成了 SceneryRule。这样以后我想加新彩蛋,只需要在列表里加一行配置,不用改核心代码
  • 用户防打架机制 (脏标记):这是核心。通过 Hook 游戏的点击事件,一旦用户手动点过某个开关,系统就把这个开关拉入“黑名单”,本局游戏不再自动接管。(<---这不是偷懒吗?)
  • 注:彩蛋功能的触发机制举例起来比较麻烦,有能力者可以把代码丢给 AI 或者自行分析,目前只使用了部分参数进行判断,后续游戏更新后可能会根据情况进行优化。

v4.5.0

  • 添加了一个在主界面左上角日期后显示天气和温度的功能
  • 添加了一个可选配置项 ShowWeatherOnDate,用于控制是否在日期后追加显示天气和温度
  • 此功能需要引用 Unity.TextMeshPro.dll

v4.4.1-更好的天空

  • 守护了部分人的白天或者是黄昏
  • 将小雨、小雪、阵雨、阵雪这种非恶劣天气从恶劣天气名单中移除

v4.4.0

  • 守护了这片夜空
  • 重构了环境、风景推导逻辑,现在晚上永远只会是晚上,白天恶劣天气可能会是多云,也可能是白天和黄昏,谁知道呢

v4.3.1

  • 说是优化了 v4.3.0 出现问题的原因
  • 捏吗你不能修复的时候一并优化吗?

v4.3.0

  • 修复了一个在多云状态下按 F9 会导致所有环境被错误关闭的问题

v4.2.3-V4.2.4

  • 还是没修好,Gemini 出去

v4.2.2

  • 发现了一个在多云状态下按 F9 会导致所有环境被错误关闭的问题
  • 然后这 Gemini 没修好

v4.2.1

  • 添加了一个调试模式,开始尝试调整调整天气 ID 查看对应天气切换效果(什么?你现在才开始测试?!)
  • 让 Gemini 别刷版本号了

v4.2.0

  • 修复了一个按 F7 没反应的问题,加了个输出说是

v3.7.0-v4.1.0-外地AI刷版本号来了

  • 优化 F9 按键逻辑,优化日志提示
  • 修复偶发日志卡死的状态,即使不影响使用
  • 修复之前和AI沟通的错误:它一直以为黄昏要提前1小时切换,实际上是30分钟
  • 优化切换逻辑(真是优化?)

缓存逻辑是这样的:

  • 数据存储:有一个静态变量 _cachedWeather 存在内存里。
  • 有效期:60 分钟 (TimeSpan.FromMinutes(60)).
  • 快钟 (30 秒一次):
    • 只读缓存。如果缓存里有数据,直接拿来用,不发网络请求(不费流量)。
    • 它会利用缓存里的“晴/雨”状态,重新结合“当前每一秒的时间”来判断是否该日落了。
    • 注:本来想让 AI 写定时器的,但是 AI 说不如这个,我不懂所以听他的
  • 慢钟 (30 分钟一次):
    • 强制更新。即使缓存没过期(60 分钟),只要到了用户设定的刷新间隔(默认 30 分钟),就会尝试发起新的 API 请求来刷新数据。

v3.6.0-不想开挂?满足你

  • 增加解锁所有环境和装饰品可选配置项

v3.5.0-估摸着能跑版

  • 优化按钮逻辑,采用模拟点击 MainIcon 方式
  • 修复环境切换可能不生效的问题
  • 改进代码结构和日志输出

v3.4.x

  • 修复部分天气效果无法关闭的问题
  • 优化环境互斥逻辑

v3.3.0 及更早版本

  • 分析源码、分析环境开关逻辑、分析景色开关逻辑
  • 初始版本开发
  • 谁能想到用了3个不同厂商的不同AI写了一天才写出来,我累死了

详细更新日志请查看 Git 提交记录

🐛 已知问题

  • 首次加载可能需要等待 15 秒后才会进行第一次环境同步(这玩意应该不算问题吧?男人不能说太快,所以我加了点延迟?
  • F9 可能导致部分按钮 UI 异常,但是不影响游戏内容,修复优先级低

🤝 贡献

欢迎提交 Issue 和 Pull Request!

关于反馈

如需反馈问题,请先确保问题“可复现”,并开启调试日志(BepInEx/config/BepInEx.cfg 中将 Logging.Console 设置为 true)。
这时,游戏启动时会在控制台输出详细日志,有助于定位问题。

📄 许可证

本项目采用 MIT 许可证 开源。

⚠️ 重要声明

  • ✅ 可以自由使用、修改和分发
  • ✅ 可以用于个人学习和研究
  • 使用本软件产生的任何后果由使用者自行承担

详见 LICENSE 文件。

👨‍💻 作者

🙏 致谢

  • BepInEx 团队
  • Harmony 补丁库
  • Duvet
  • 心知天气 API 服务
  • Google Gemini3Pro
  • Github Copilot
  • Claude Sonnet and Ops 4.5
  • OpenAI ChatGPT5.1
  • Github Copilot

免责声明: 本插件仅供学习交流使用,请勿用于商业用途。使用本插件产生的任何问题与作者无关。
本项目为粉丝自制 (Fan-made),与游戏开发商及发行商无关。 游戏《Chill with You - Lo-Fi Story》及其相关素材、商标的版权均归原作者所有。

即使生活一团糟,但也要心存希望