RepoMusicPlayer
游戏内音乐播放器:支持 mp3/ogg/wav/flac 本地与直链,仅主机安装即可通过语音通道广播给全房间。REPO Music Player(游戏内实时播放器)
在 R.E.P.O. 里放你自己的音乐:本地文件、自建服务器文件、或者免费电台的 http(s) 直链。热键切歌、屏幕提示、音量实时调整。
---
先说清楚:没有账号登录 / 推荐列表
本模组不包含任何音乐平台的账号登录、推荐列表拉取、版权曲库播放。
原因不是技术上做不到,而是这类功能需要:
- 平台私有接口 + 登录态(Cookie / Token);
- 音频地址往往带签名、有时限、且多为加密/DRM 流;
- 绕过这些属于规避服务方的访问控制,违反其用户协议。
所以这里只做你有权播放的音源:你自己的文件,或你自己服务器/公开免费电台的直链。
想听自己的歌单:用客户端把已购买/已下载的歌曲导出成 mp3/ogg,放进
music文件夹即可,体验和在线播放器一样。
---
安装
BepInEx/plugins/RepoMusicPlayer/RepoMusicPlayer.dll
依赖 BepInEx 5.4.21+。首次启动会生成:
BepInEx/config/RepoMusicPlayer/
├─ playlist.txt ← 播放列表
└─ music/ ← 直接丢音频文件进来也能自动识别
---
播放列表格式
playlist.txt,每行一个音源,# 开头为注释:
# 相对路径(相对 music 文件夹)
song.mp3
album/track02.ogg
# 绝对路径
D:\\Music\\playlist\\01.wav
# http(s) 直链(自建服务器 / 免费电台)
https://example.com/radio.mp3
- 支持格式:mp3 / ogg / wav / flac;
playlist.txt为空时,自动扫描music/下的音频文件;- 播放中改完列表按 F5 重载。
---
广播给所有玩家(仅主机装)
REPO 没有通用的音频广播接口,唯一能“别人不装插件也听得到”的通道就是游戏自己的 Photon Voice 语音。本模组的做法是:
- 主机开始播放时,取主机自己的
PlayerVoiceChat.recorder; - 把它从「麦克风」切换成 AudioClip 源,指向当前歌曲并循环;
TransmitEnabled = true,走原有的语音编码 → 网络 → 对方的语音播放器;- 停止/切歌/暂停时恢复成麦克风。
所以只有主机需要装,客机什么都不用装。
必须知道的代价(这是语音通道的物理限制,不是实现偷懒):
| 限制 | 说明 |
|---|---|
| 音质 | 走 Opus 语音编码,是“语音级”音质,不是音乐级 |
| 距离衰减 | 和正常语音一样受距离/墙体影响,离得远听不清;对方关掉语音或调低语音音量也听不到 |
| 占用麦克风 | 广播期间主机的麦克风被音乐占用,说话传不出去(切歌/暂停即恢复) |
| 依赖语音系统 | 房间禁用语音、或主机没有可用录音设备时,广播不可用,会自动退回仅本地播放 |
配置:
| 配置 | 默认 | 说明 |
|---|---|---|
4. 广播 / 广播给所有玩家 |
开 | 关掉就只在自己客户端播放 |
4. 广播 / 仅房主可广播 |
开 | 防止多个客户端同时抢占语音通道 |
如果你要的是“高保真、无视距离的全员广播”,那需要自建音频流(Opus 分片 + 网络同步),客机也必须装插件——那属于另一套方案,可以再单独做。
---
FLAC 支持
.flac 由插件自带的纯 C# 解码器处理(不依赖 ffmpeg / 第三方库),本地文件和 https://…/track.flac 直链都可以:
- 支持 CONSTANT / VERBATIM / FIXED(0-4) / LPC(1-32) 子帧、Rice / Rice2 残余、独立声道与 left-side / right-side / mid-side;
- 支持 8/12/16/20/24/32 bit、多种采样率、块大小编码;
- 解码在后台线程进行,不会卡主线程;解码完成后直接生成
AudioClip播放; - 超过约 6000 万采样点(≈ 10 分钟立体声)会跳过并提示,避免内存爆掉;
- 不校验 CRC、不处理罕见扩展(比如带 ID3v2 的 flac 会自动跳过标签)。
首次播放 flac 会有 1~3 秒解码时间(取决于文件长度),Toast 会显示“解码 FLAC…”。
热键
| 热键 | 功能 |
|---|---|
F9 |
下一首 |
F7 |
上一首 |
F8 |
暂停 / 继续(没在播放时开始播放) |
F10 |
音量 +5% |
F6 |
音量 -5% |
F5 |
重载播放列表并切歌 |
热键可在 BepInEx/config/xingKong.RepoMusicPlayer.cfg 里改,也支持 None 关闭。
配置
| 配置 | 默认 | 说明 |
|---|---|---|
1. 通用 / 启用 |
开 | 总开关 |
2. 播放 / 音量 |
0.6 | 0~1,热键实时调整并保存 |
2. 播放 / 随机播放 |
关 | 下一首随机 |
2. 播放 / 循环播放 |
开 | 播完自动下一首 |
2. 播放 / 常驻显示状态 |
关 | 屏幕上方一直显示曲名/状态/音量 |
---
行为说明与限制
- 本地播放:只在你自己的客户端出声,不会同步给队友,也不进游戏的语音/音效混音器;
- 音频通过
UnityWebRequestMultimedia加载,本地文件与直链一致;一首播完才切下一首,长播客会整段载入内存; - 游戏切到后台、或菜单触发
AudioListener.pause时,音乐可能一起被暂停,这是引擎行为; - 电台直链若需要特定的 ICY/分块协议,Unity 的 MP3 解码不一定支持,建议先用短文件验证;
.m4a/ DRM 加密流 Unity 无法解码,会提示“无法解码该音频”;.flac已由内置解码器支持。
---
从源码构建
dotnet build RepoMusicPlayer.csproj -c Release -p:RepoDir="D:\\steam\\steamapps\\common\\REPO"
