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.
Edit: This post has had some overwhelming support, so thanks for all the tweets and mentions. I have made the full source code available on GitHub and I think it provides a great starting point if you have a finished 2D XNA game which you want to port to Unity3D and you’re prepared to spend a few weeks (instead of months) on it. However as a proof of concept it has achieved my original goal, I’m afraid I can offer no support to XNA projects wishing to port to Unity3D.