You all know I have a soft spot in my heart for XNA. Since it first came out and let me create games for my XBox 360, I've been a fanboy of it. You also know that I'm a fanboy of gaming engines, like Unity3D.
So when I saw the two mixed in this proof of concept, a example of running XNA inside of Unity3D (let alone that the Platformer Sample was used), well...
I had a theory that it would be straightforward to get XNA games running in Unity3D so I decided to give it a go.
This is a proof of concept showing the Platformer XNA sample running inside Unity3D. Zero code changes have been made to the original game code. Using a mixture of new code and some code from MonoXNA I’ve implemented XNA emulation by having a game object with a script attached run an XNA game performing updates and drawing.
Implemented so far:
- Basic game loop and GameTime calculation.
- ContentManager loads Texture2Ds, SoundEffects and Songs, each wrapping the relevant Unity3D object.
- SpriteBatch Draw implemented using a draw queue, specifically created for the purpose. Currently supports colour tinting, source rectangles, and sprite effect flip modes.
- SpriteBatch DrawString has limited support, rendering the text in the correct position and with the correct colour.
- Support for playing Songs through MediaPlayer and playing SoundEffects
- KeyboardStates emulated for a limited set of keys which are mapped from their XNA values to Unity3D KeyCodes.
- Zero code changes to the game needed to run Platformer sample
Known issues, immediate areas for improvement:
- SpriteFont is not supported, all DrawStrings render with the default GUI Label font.
- Frame rate is currently vsync’d at 60 frames per second. When vsync is disabled GameTime is not calculated correctly.
- Windows Media Audio (.wma) is not supported by Unity3D, so I’ve converted the sample audio files to Ogg Vorbis (.ogg).
- Keyboard input is currently limited to a small set of keys, more mappings between XNA Keys and Unity3D KeyCodes need creating.
- Mouse, gamepad and touch input are not currently implemented.
If you're interested in seeing how it's done, check out the source on Github here.
If you just want to see it work, via the Unity3D Web Player, check it out here.