DIY Emulator Teil 2.1: Plugin-Emulator-Framework
in Unity
Nachdem wir in diesem Artikel ein grafisches Grundgerüst aufgesetzt haben, wird nun hier das Grundgerüst für die Emulatoren selbst aufgesetzt.Die Applikation soll mehrere Emulatoren unterstützen können und mit "Plugins" aufgerüstet werden können. Um die Dinge zu vereinfachen, wird "immer" ein Emulator laufen, es gibt keinen spezifischen Hintergrund für die Applikation selbst. Jegliche Grafik bis auf das UI wird durch einen "Emulator" dargestellt. Das heisst, dass, während KEIN Emulator geladen ist, ein "Platzhalter-Emulator" läuft, welcher eine beliebige Grafikausgabe machen kann und auch nicht wirklich ein Emulator ist. Er hat nur die selbe Basisklasse wie ein Emulator.
Dazu gibt es mehrere Scripts:
- Ein EmuCreator-Script, welches den Emulator auswählt, erstellt und initialisiert. Dieses wird an das GameObject mit dem EmuGraphicsAdapter (das Script aus dem vorigen Artikel) angehängt.
- Eine Emulator-Basis von welcher alle Emulator-Klassen abgeleitet sind.
- Eine abgeleitete Emulator-Klasse zu Testzwecken und später als Platzhalter-Emulator.
EmuCreator.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(EmuGraphicsAdapter))] public class EmuCreator : MonoBehaviour { protected EmuGraphicsAdapter gfx; protected EmulatorBase m_emulator=null; // Start is called before the first frame update void Start() { Debug.Log("EmuCreator started."); gfx = gameObject.GetComponent<EmuGraphicsAdapter>(); // create an emulator just for testing. createEmulator(new Placeholder_Emulator(gameObject)); } // Update is called once per frame void Update() { if (m_emulator!=null) m_emulator.Update(); } // create an emulator and initialize it. void createEmulator(EmulatorBase emu) { m_emulator = emu; gfx.setEmuScreenSize(emu.getDisplayWidth(), emu.getDisplayHeight()); } }
- gfx ist die Referenz auf die Graphik-Komponente, welche im vorigen Artikel erstellt wurde.
- m_emulator ist die Instanz des aktuell laufenden Emulators.
Mit createEmulator(emulator) wird m_emulator gesetzt und dann die Bildschirmgrösse auf das Emulatordisplay angepasst.
Mehr braucht es hier gerade nicht. In Start wird der Platzhalter-Emulator gestartet, welcher im übernächsten Script beschrieben wird. Doch dafür brauchen wir erst die EmulatorBase-Klasse, welche als Basis für alle unsere Emulator-Plugins dienen wird.
EmulatorBase.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EmulatorBase { protected GameObject gameObject; protected EmuGraphicsAdapter gfx; // Change those values and...go. ;) protected int disp_width = 20; protected int disp_height = 20; public int getDisplayWidth() { return disp_width; } public int getDisplayHeight() { return disp_height; } public EmulatorBase(GameObject g) { Debug.Log("EBASE Constructor"); gameObject = g; gfx = g.GetComponent(); } // Update is called once per frame public virtual void Update() { } }
- gfx ist nochmal/wieder die Referenz auf die Graphik-Komponente, welche im vorigen Artikel erstellt wurde.
- gameObject ist das gameObject welches vom EmuCreator übergeben wird, also das gameObject, in welchem der EmuCreator als Komponente registriert ist.
- disp_width und disp_height ist die native Grösse des Displays (in Pixeln) des jeweiligen Systems. Stelle diese Werte im Konstruktor ein.
Dieser Platzhalter-"Emulator" setzt einfach einen Pixel. Später folgt noch ein schöner Grafikeffekt. ;)
Placeholder_Emulator.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Placeholder_Emulator : EmulatorBase { public Placeholder_Emulator(GameObject g) : base(g) { Debug.Log("EPlaceholder_Constructor"); disp_height = 50; disp_width = 50; } public override void Update() { gfx.MarkPixelToChange(19, 19, Color.white); } }
Somit können nun verschiedenste Systeme über dieselbe Schnittstelle mit Unity "kommunizieren".
Ich hoffe, das hilft bei deiner Gesundung. :)
Das komplette Projekt befindet sich in diesem Git-Repository, im JUMPEE-Verzeichnis.
Weiter gehts mit ein bisschen Auflockerung: Ein Grafik-Effekt (ohne Shader - wenn mir das jemand in Shadern machen könnte, also das Display, das wär was.)
Keine Kommentare:
Kommentar veröffentlichen