UnityGB를 사용하면 Unity 프로젝트에서 Game Boy ROM을 실행할 수 있습니다. C#로 작성되었으며 Mono 만 사용하여 Unity가 지원하는 모든 플랫폼으로 프로젝트를 내보낼 수 있습니다.
UnityGB는 Oculus Rift : Gameception의 Gameboy Emulator와 같은 CNET과 같은 여러 기사의 주요 주제가되었습니다.
UnityGB는 여전히 알파 버전에 있으며 많은 버그와 결함이 발생할 수 있습니다. 또한 코드는 완벽하지 않으며 많은 최적화가 필요합니다. 모든 것을 도와 환영합니다! 이 프로젝트에 자유롭게 기여하십시오.
또한 웹 사이트 Takohi.com 및 기타 Unity 자산의 다른 응용 프로그램을 살펴보십시오. ?
Unity의 도약 동작을 가진 재미있는 게임 보이 에뮬레이터 , Pierce Wolcott
Oculus Rift Gameboy Emulator in Unity , Shane O'Brien
UnityGB4BB10, BlackBerry 10의 게임 보이 에뮬레이터
Takohi의 공식 웹 데모
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이로드 된 후에 SetSize 메소드가 호출됩니다. 픽셀 (160x144, 변경되지 않아야 함)의 화면 크기가 얼마인지 알려 주므로 표시하는 방법을 초기화 할 수 있습니다.
메소드 세트 픽셀은 프레임이 업데이트 될 때마다 호출됩니다. 매개 변수로서 각 픽셀의 색상에 해당하는 색상 배열입니다. 배열의 크기는 너비 x 높이 입니다.
다음은 Uint 색상을 Unity 색상으로 변환하는 방법입니다.
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 [] data, int channels)를 사용하는 것입니다.
패키지에서는 이미 기본 audiooutput 클래스의 오디오 트로프를 생성하는 방법을 제공합니다. 사용하려면 해당 스크립트를 게임 객체에 첨부하고 오디오 소스 구성 요소를 추가하십시오.
Outputing Audio를 위해 자체 구현을 원한다면 인터페이스 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.
}
그런 다음 모노비 하이 우르 의 업데이트 방법 중에 에뮬레이터를 실행합니다. 또한이 방법을 사용하여 사용자의 입력을 관리하고 에뮬레이터로 보냅니다.
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를 게임 객체에 첨부하기 위해 게임 객체에 첨부하는 것을 잊지 마십시오.