UnityGB允许您在Unity项目中运行游戏男孩ROM。它是用C#编写的,仅使用单声道允许您将项目导出到由Unity支持的任何平台中。
Unitygb成为了几篇文章的主要主题,例如CNET,Oculus Rift:Gamection上的GameBoy Myulator。
UnityGB仍在Alpha版本中,许多错误和故障可能会发生。同样,该代码远非完美,需要大量优化。所有人都欢迎!请随时为这个项目做出贡献。
请花一些时间在我们的网站takohi.com和其他Unity资产上查看我们的其他应用程序。 ?
Pierce Wolcott的搞笑Gameboy模拟器与Leap Motion in Unity进行
Shane O'Brien的Oculus Rift Gameboy模拟器
Unitygb4bb10,黑莓的Gameboy仿真器10
官方网络演示,高霍人
UnityGB可以通过多种方式工作。您要做的是对如何管理输入(控件)和输出(视频和声音)进行自己的实现。在Unity软件包和来源中,您已经找到了一个经典的场景,以经典的质感,音频槽OnaudiofilterRead方法和键盘的JoyPad输入来输出视频。
可以在defaultemulatormanager.cs中找到如何实现控件的一个示例。
当您想模拟玩家的输入到游戏中时,您只需从模拟器参考调用setInput方法:
void SetInput(Button button, bool pressed);
按钮是具有这些值的枚举:
public enum Button {Up, Down, Left, Right, A, B, Start, Select};
例如,如果您想按下播放器时按钮启动,请按照空格按钮:
if(Input.GetKeyDown(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, true);
else if(Input.GetKeyUp(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, false);
可以在DefaultVideoOutput.cs中找到如何实现视频的示例。
为了从模拟器或换句话说,要显示游戏男孩屏幕,您将必须自己制作自己的类以实现IvideoOutput接口。
该界面只有两种方法:
void SetSize(int w, int h);
void SetPixels(uint[] colors);
加载ROM后,将调用设置方法。它会告诉您像素中屏幕的大小是什么(160x144,它永远不会更改),以便您可以初始化显示方式。
每次更新帧时,方法setPixels都会被调用。作为参数,与每个像素的颜色相对应的颜色数组。阵列的大小将是宽度x高度。
这是一种将UINT颜色转换为统一颜色的方法:
private Color UIntToColor(uint color)
{
byte a = (byte)(color >> 24);
byte r = (byte)(color >> 16);
byte g = (byte)(color >> 8);
byte b = (byte)(color >> 0);
return new Color(r / 255f, g / 255f, b / 255f, a / 255f);
}
可以在defaultaudiooutput.cs中找到如何实现音频的示例。
通过Unity,动态产生音频的唯一方法是使用Monobehaviour对象的方法使用方法OnaudiofilterRead(float []数据,int通道)。
在软件包中,我们已经提供了一种产生音频槽的方法。如果要使用它,只需将该脚本连接到游戏对象并将其添加到AudioSource组件中即可。
如果您仍然想进行自己的实现来输出音频,则必须制作一个实现接口IaudioOutput的类。
该接口具有三种方法:
int GetOutputSampleRate();
int GetSamplesAvailable();
void Play(byte[] data, int offset, int count);
样品交错(%0 =左,%1 =右)。这意味着每个样本:数据[i] =左样品,数据[i + 1] =右样本。
可以在defaultsavememory.cs中找到如何管理保存文件的示例。
为了管理保存文件,您将必须将自己的类实现ISAVEMEMORY接口。
该界面只有两种方法:
void Save(string name, byte[] data);
byte[] Load(string name);
当用户停止游戏时,将调用保存方法,并且加载游戏时调用负载方法。名称参数是当前玩游戏的名称。
在全球范围内,当调用保存方法时,您只需要存储以参数为参数的字节数组的某个位置,然后在调用同一游戏的加载方法时加载并返回相同的字节数组。
可以在defaultemulatormanager.cs中找到如何使用模拟器的示例。
下面的代码是一种简单的方法,显示如何使用Monobehaviour脚本初始化和制作运行UnityGB。
首先,我们创建一个模拟器实例,然后将ROM加载到开始方法中。
void Start()
{
// Load emulator
IVideoOutput drawable = ...; // Reference to your IVideoOutput implementation.
IAudioOutput audio = ...; // Reference to your IAudioOutput implementation.
ISaveMemory saveMemory = ...; // Reference to your ISaveMemory implementation.
Emulator = new Emulator(drawable, audio, saveMemory); // Instantiate emulator.
byte[] rom = ...; // Load ROM binary.
Emulator.LoadRom(www.bytes); // Load ROM into emulator.
}
然后,我们使模拟器在Monobehaviour的更新方法中运行。我们还使用此方法来管理用户的输入并将其发送到模拟器。
void Update()
{
// Input
if(Input.GetKeyDown(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, true);
else if(Input.GetKeyUp(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, false);
...
// Run
Emulator.RunNextStep();
}
不要忘记将以前的Monobehaviour附加到游戏对象上以使其运行。