UnityGB te permite ejecutar una ROM de Game Boy dentro de tu proyecto de Unity. Se ha escrito en C# y solo está utilizando mono, lo que le permite exportar el proyecto a cualquier plataforma compatible con Unity.
UnityGB se convirtió en el tema principal de varios artículos como CNET, Gameboy Emulator en Oculus Rift: Gameception.
UnityGB todavía está en la versión alfa, pueden ocurrir muchos errores y problemas técnicos. Además, el código está lejos de ser perfecto y necesita mucha optimización. ¡Todos y cada uno de los ayudantes bienvenidos! No dude en contribuir a este proyecto.
También tome un tiempo para echar un vistazo a nuestras otras aplicaciones en nuestro sitio web Takohi.com y nuestros otros activos de la unidad. ?
Hilarante emulador de Gameboy con Leap Motion in Unity , de Pierce Wolcott
Oculus Rift Gameboy Emulator en Unity , de Shane O'Brien
UnityGB4BB10, Gameboy Emulator para BlackBerry 10
Demostración web oficial , de Takohi
UnityGB puede funcionar de varias maneras. Lo que tiene que hacer es hacer su propia implementación sobre cómo administrar las entradas (controles) y salidas (video y sonido). En el paquete Unity y las fuentes, ya encontrará una escena clásica que genera el video en una textura clásica, el canal de audio el método Onaudiofilterread y la entrada de Joypad del teclado.
Se puede encontrar un ejemplo de cómo implementar los controles en defaultemulatormanager.cs .
Cuando desee emular una entrada del jugador al juego, solo debe llamar al método SetInput desde la referencia del emulador:
void SetInput(Button button, bool pressed);
El botón es un enumio con estos valores:
public enum Button {Up, Down, Left, Right, A, B, Start, Select};
Por ejemplo, si desea presionar el botón, inicie cuando el reproductor presione el botón de espacio:
if(Input.GetKeyDown(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, true);
else if(Input.GetKeyUp(KeyCode.Space))
Emulator.SetInput(EmulatorBase.Button.Start, false);
Un ejemplo de cómo implementar el video se puede encontrar en defaultvideoutput.cs .
Para emitir el video del emulador o en otras palabras, para mostrar la pantalla Game Boy, tendrá que hacer que su propia clase implemente la interfaz Ivideoutput .
Esta interfaz tiene solo dos métodos:
void SetSize(int w, int h);
void SetPixels(uint[] colors);
El método SetSize se llamará después de cargar la ROM. Le dirá cuál es el tamaño de la pantalla en píxeles (160x144, nunca debería cambiar) para que pueda inicializar su camino para mostrar.
El método setPixels se llamará cada vez que se actualice el marco. Como parámetro, una matriz de colores que corresponde al color de cada píxel. El tamaño de la matriz será de ancho x altura .
Aquí hay un método para convertir un color UINT en un color de unidad:
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);
}
Un ejemplo de cómo implementar el audio se puede encontrar en defaultaudioutput.cs .
Con Unity, la única forma de producir dinámicamente audio es mediante el método de onudiofilterread (float [] datos, intanales int) desde un objeto monobehaviour .
En el paquete, ya proporcionamos una forma de producir el canal de audio la clase de Audio OoTput . Si desea usarlo, simplemente adjunte ese script a un objeto de juego y agréguelo un componente AudioSource .
Si aún desea hacer su propia implementación para producir audio, deberá hacer una clase que implementa la interfaz IAUDIOOTPUT .
Esta interfaz tiene tres métodos:
int GetOutputSampleRate();
int GetSamplesAvailable();
void Play(byte[] data, int offset, int count);
Las muestras están entrelazadas ( %0 = izquierda, %1 = derecha). Esto significa para cada muestra: datos [i] = muestra izquierda, datos [i + 1] = muestra derecha.
Se puede encontrar un ejemplo de cómo administrar archivos Guardar en DefaultSavememory.cs .
Para administrar los archivos Guardar, deberá hacer que su propia clase implementa la interfaz ISAVEMEMORY .
Esta interfaz tiene solo dos métodos:
void Save(string name, byte[] data);
byte[] Load(string name);
El método de guardado se llama cuando el usuario detiene el juego, y el método de carga se llama cuando se carga el juego. El parámetro del nombre es el nombre del juego que se juega actualmente.
A nivel mundial, cuando se llama al método Guardar , simplemente tiene que almacenar en algún lugar la matriz de bytes dada como parámetro, luego cargar y devolver esta misma matriz de bytes cuando se solicita el método de carga para el mismo juego.
Un ejemplo de cómo usar el emulador se puede encontrar en defaultemulatormanager.cs .
El siguiente código es una forma simple que muestra cómo inicializar y hacer que ejecute unitygb con un script monobehaviour .
Primero, creamos una instancia del emulador y cargamos la ROM en el método de inicio .
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.
}
Luego hacemos que el emulador se ejecute durante el método de actualización del monobehaviour . También utilizamos este método para administrar las entradas del usuario y enviarlas al emulador.
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();
}
No olvides adjuntar el monobehaviour anterior a un objeto de juego para que se ejecute.