Mit UnityGB können Sie ein Game Boy -ROM in Ihrem Unity -Projekt betreiben. Es wurde in C# geschrieben und verwendet nur Mono, sodass Sie das Projekt auf eine von Unity unterstützte Plattform exportieren können.
UnityGB wurde zum Hauptthema mehrerer Artikel wie CNET und GameBoy Emulator bei The Oculus Rift: Gamecception.
UnityGB befindet sich noch in der Alpha -Version, es können viele Fehler und Störungen auftreten. Außerdem ist der Code bei weitem nicht perfekt und braucht viel Optimierung. Alle helfen, willkommen! Bitte zögern Sie nicht, zu diesem Projekt beizutragen.
Nehmen Sie sich auch etwas Zeit, um sich unsere anderen Bewerbungen auf unserer Website takohi.com und unseren anderen Einheitsgütern anzusehen. ?
Urkomischer Gameboy -Emulator mit Leap Motion in Unity , von Pierce Wolcott
Oculus Rift Gameboy Emulator in Einheit , von Shane O'Brien
UnityGB4BB10, Gameboy -Emulator für Blackberry 10
Offizielle Webdemo von Takohi
UnityGB kann auf verschiedene Weise funktionieren. Sie müssen Ihre eigene Implementierung zum Verwalten von Eingängen (Steuerelementen) und Ausgängen (Video und Ton) durchführen. Im Unity -Paket und in den Quellen finden Sie bereits eine klassische Szene, die das Video in einer klassischen Textur ausgibt, der Audio -Trog die OnaudioFilterRead -Methode und die JoyPad -Eingabe von der Tastatur.
Ein Beispiel für die Implementierung der Steuerelemente finden Sie in defaultemulatorManager.cs .
Wenn Sie eine Eingabe des Players in das Spiel emulieren möchten, müssen Sie nur die SetInput -Methode aus der Emulatorreferenz aufrufen:
void SetInput(Button button, bool pressed);
Die Taste ist eine Aufzählung mit diesen Werten:
public enum Button {Up, Down, Left, Right, A, B, Start, Select};
Wenn Sie beispielsweise den Start der Taste drücken möchten, wenn der Player auf die Space -Taste drückt:
if(Input.GetKeyDown(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, true);
else if(Input.GetKeyUp(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, false);
Ein Beispiel für die Implementierung des Videos finden Sie in defaultVideooutput.cs .
Um das Video aus dem Emulator oder mit anderen Worten auszugeben, um den Game Boy -Bildschirm anzuzeigen, müssen Sie Ihre eigene Klasse in der IVideOoutput -Schnittstelle implementieren.
Diese Schnittstelle hat nur zwei Methoden:
void SetSize(int w, int h);
void SetPixels(uint[] colors);
Die SetSize -Methode wird nach dem Laden des ROM aufgerufen. Es wird Ihnen erfahren, welche Größe der Bildschirm in Pixel (160x144, es sollte sich niemals ändern), damit Sie Ihren Weg zum Anzeigen initialisieren können.
Die Methoden -SetPixel werden jedes Mal aufgerufen, wenn der Frame aktualisiert wurde. Als Parameter, ein Array von Farben, die der Farbe jedes Pixels entsprechen. Die Größe des Arrays ist die Höhe der Breite x .
Hier ist eine Methode, um eine Uint -Farbe in eine Einheitsfarbe umzuwandeln:
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);
}
Ein Beispiel für die Implementierung des Audios finden Sie in defaultAdiooutput.cs .
Bei Einheit besteht die einzige Möglichkeit, Audio dynamisch zu erzeugen, indem die Methode OnaudioFilterRead (Float [] -Daten, int -Kanäle) eines Monobehaviour -Objekts verwendet wird.
In dem Paket bieten wir bereits eine Möglichkeit, den Audio -Trog in der DefaultAdioOutput -Klasse zu produzieren. Wenn Sie es verwenden möchten, fügen Sie dieses Skript einfach an ein Spielobjekt an und fügen Sie ihm eine AudioSource -Komponente hinzu.
Wenn Sie weiterhin eine eigene Implementierung für die Ausgabe von Audio vornehmen möchten, müssen Sie eine Klasse erstellen, die die Schnittstelle iaudiooutput implementiert.
Diese Schnittstelle hat drei Methoden:
int GetOutputSampleRate();
int GetSamplesAvailable();
void Play(byte[] data, int offset, int count);
Die Proben sind verschachtelt ( %0 = links, %1 = rechts). Dies bedeutet für jedes Beispiel: Daten [i] = linke Probe, Daten [i + 1] = Rechts Beispiel.
Ein Beispiel für die Verwaltung von Speicherdateien finden Sie in defaultSavememory.cs .
Um Speichern von Dateien zu verwalten, müssen Sie Ihre eigene Klasse erstellen, in der die Isavememory -Schnittstelle implementiert wird.
Diese Schnittstelle hat nur zwei Methoden:
void Save(string name, byte[] data);
byte[] Load(string name);
Die Speichermethode wird aufgerufen, wenn der Benutzer das Spiel stoppt, und die Lastmethode wird aufgerufen, wenn das Spiel geladen wird. Der Name Parameter ist der Name des derzeit gespielten Spiels.
Wenn die Speichermethode aufgerufen wird, müssen Sie weltweit einfach das als Parameter angegebene Byte -Array speichern, und dann das gleiche Byte -Array laden und zurückgeben, wenn die Lastmethode für dasselbe Spiel aufgerufen wird.
Ein Beispiel für die Verwendung des Emulators finden Sie in defaultemulatormanager.cs .
Der folgende Code ist eine einfache Möglichkeit, wie man UnityGB mit einem Monobehaviour -Skript initialisiert und durchführt.
Zunächst erstellen wir eine Instanz des Emulators und laden das ROM in der Startmethode .
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.
}
Dann machen wir den Emulator während der Update -Methode des Monobehaviour aus. Wir verwenden diese Methode auch, um Eingaben vom Benutzer zu verwalten und an den Emulator zu senden.
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();
}
Vergessen Sie nicht, das vorherige Monobehaviour an ein Spielobjekt anzuhängen, um es zum Laufen zu bringen.