UnityGB allows you to run a Game Boy ROM inside your Unity project. It has been written in C# and is only using Mono allowing you to export the project to any platform supported by Unity.
UnityGB became the main subject of several articles like CNET, Gameboy emulator on the Oculus Rift: Gameception.
UnityGB is still in alpha version, many bugs and glitches can occur. Also, the code is far from being perfect and needs a lot of optimization. Any and all help welcome! Please feel free to contribute to this project.
Please also take some time to take a look at our other applications on our website Takohi.com and our other Unity assets. ؟
محاكي Gameboy المضحك مع Motion Leap in Unity ، بقلم بيرس وولكوت
Oculus Rift Gameboy Emulator in Unity ، بقلم شين أوبراين
UnityGB4BB10 ، Gameboy Emulator for Blackberry 10
تجريبي رسمي على شبكة الإنترنت ، بقلم تاكوهي
يمكن أن تعمل UnityGB بعدة طرق. ما عليك فعله هو جعل تطبيقك الخاص حول كيفية إدارة المدخلات (عناصر التحكم) والمخرجات (الفيديو والصوت). في حزمة الوحدة والمصادر ، ستجد بالفعل مشهدًا كلاسيكيًا يخرج الفيديو في نسيج كلاسيكي ، وصوت ، وهو طريقة 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 .
من أجل إخراج الفيديو من المحاكي أو بعبارة أخرى ، لعرض شاشة Game Boy ، سيتعين عليك جعل الفصل الخاص بك ينفذ واجهة IvideOoutput .
تحتوي هذه الواجهة على طريقتين فقط:
void SetSize(int w, int h);
void SetPixels(uint[] colors);
سيتم استدعاء طريقة setSize بعد تحميل ROM. سيخبرك ما هو حجم الشاشة بالبكسل (160 × 144 ، يجب أن يتغير أبدًا) حتى تتمكن من تهيئة طريقك إلى العرض.
سيتم استدعاء الطريقة 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 .
مع الوحدة ، فإن الطريقة الوحيدة لإنتاج الصوت ديناميكيًا هي استخدام طريقة onaudiofilterread (بيانات تعويم [] ، القنوات) من كائن monobehaviour .
في الحزمة ، نقدم بالفعل وسيلة لإنتاج صوتي فئة DefaultAudioOutput . إذا كنت ترغب في استخدامه ، فما عليك سوى إرفاق هذا البرنامج النصي إلى كائن لعبة وأضفه مكونًا صوتيًا .
إذا كنت لا تزال ترغب في إجراء تطبيقك الخاص لإخراج الصوت ، فسيتعين عليك إنشاء فئة تنفذ الواجهة IaudioOutput .
This interface has three methods:
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 .
الكود أدناه هو طريقة بسيطة توضح كيفية تهيئة وجعل تشغيل UnityGB مع البرنامج النصي monobehaviour .
أولاً ، نقوم بإنشاء مثيل للمحاكي وتحميل 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 السابق بكائن لعبة لجعله يعمل.