UNES
是一个在 Unity
环境中运行 Nintendo Entertainment System
任天堂红白机游戏 *.nes
文件的模拟器插件,该项目基于 Emulator.NES 实现,通过 Unity
实现跨平台。
-
- 2.1. Resources 加载
- 2.2. FileStream 加载
-
- 3.1. Filter Mode
- 3.2. Logic Thread
- 3.3. Input Config
- 1.在场景中新建或选择一个
GameObject
并添加UNESBehaviour
组件。 - 2.新建一个
RenderTexture
用于渲染游戏画面。 - 3.使用任何你想要的方式在游戏中显示
RenderTexture
文件。 - 4.使用默认的输入方式或者按需实现自定义输入。
- 5.按需实现
*.nes
文件的加载获取byte[]
格式数据。 - 6.调用
UNESBehaviour.Boot(byte[] romData)
接口启动游戏。
如果需要使用 Resources.Load()
接口来加载ROM文件,则需要注意将 .nes
扩展名更改为 .bytes
,然后使用如下方式加载:
var bytes = Resources.Load<TextAsset>(romPath).bytes;
UNES.BootRom(bytes);
如果使用加载原始文件字节流的方式,直接调用 UNESBehaviour.Boot(byte[] romData)
接口即可。
游戏画面渲染的过滤模式:
模式 | 描述 |
---|---|
Point | 纹理像素近距离变得块状。 |
Bilinear | 双线性双线性滤波-将纹理样本平均。 |
Trilinear | 三线性三线性过滤-对纹理样本进行平均,并在mipmap级别之间进行混合。 |
详细解释可参考 FilterMode
如果打开 Logic Thread
选项,则 CPU
和 PPU
部分的模拟计算会由子线程执行,Unity 主线程只负责读取状态数据刷新游戏画面,可显著提高帧数。
自定义原生按键所对应的键盘物理按键。
默认配置操控方式:
原生按键 | 操作按键 |
---|---|
Start | Num1 |
Select | Num2 |
Up | Up Arrow |
Down | Down Arrow |
Left | Left Arrow |
Right | Right Arrow |
A | A |
B | S |
以任何方式获取原始ROM文件的字节数组格式以供模拟器启动:
public void Boot(byte[] romData);
模拟器本身只提供当前运行状态的数据,而不提供数据文件的持久化实现。需要自行实现存档数据的保存。
public byte[] GetSaveData();
以任何方式获取存档文件数据以供模拟器恢复游戏进度:
public void LoadSaveData(byte[] saveData);
NES 存在众多 Mapper 扩展格式,本项目实现的中已经实现部分,理论上可以支持大部分常见游戏。
0 | NROM |
1 | MMC1 |
2 | UxROM |
3 | CNROM |
4 | MMC3 |
7 | AxROM |
9 | MMC2 (Mike Tyson's Punch-Out!!) |
10 | MMC4 |
11 | Color Dreams |
66 | GxROM |
71 | Camerica |
79 | NINA-003-006 |
94 | Senjou no Ookami |
140 | Jaleco |
155 | MMC1A |
180 | Crazy Climber |
206 | DxROM |
- 未实现音频
APU
模拟。 - 仅实现 Unity 基础输入系统和纯键盘操作方式。
- 未实现全部 Mapper。
- PPU 模拟部分性能较低,在中低端移动设备上帧数不稳定。