I’m trying to bring a Unity scene into our existing iOS application. I exported the Xcode project and modified the UnityAppController to keep it from taking over the app flow. Then on a button press I try to initialize the Unity stuff. Here’s what I have:
ViewController
-(IBAction)clikedStart:(id)sender
{
_controller = [UnityController instance];
[_controller startUnity];
}
UnityController
+(UnityController*)instance
{
static UnityController* instance = nil;
if(instance == nil)
{
UnityInitTrampoline();
RegisterMonoModules();
instance = [[UnityController alloc] init];
[instance setUpDisplay];
}
return instance;
}
-(void)setUpDisplay
{
if ([UIDevice currentDevice].generatesDeviceOrientationNotifications == NO)
[[UIDevice currentDevice]beginGeneratingDeviceOrientationNotifications];
[DisplayManager Initialize];
_mainDisplay = [[[DisplayManager Instance] mainDisplay] createView:YES showRightAway:NO];
_window = _mainDisplay->window;
[KeyboardDelegate Initialize];
[self createViewHierarchy];
UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath]UTF8String]);
}
-(void)startUnity
{
printf_console("-> Start Unity
");
UnityInitApplicationGraphics();
// we make sure that first level gets correct display list and orientation
[[DisplayManager Instance] updateDisplayListInUnity];
[self updateOrientationFromController:[SplashScreenController Instance]];
UnityLoadApplication();
Profiler_InitProfiler();
[self showGameUI];
[self createDisplayLink];
}
-(void)resumeUnity
{
printf_console("-> Resume Unity
");
if(_unityAppReady)
{
if(_didResignActive)
UnityPause(false);
}
else
{
[self performSelector:@selector(startUnity) withObject:nil afterDelay:0];
}
[GetController().unityView recreateGLESSurfaceIfNeeded];
_didResignActive = false;
}
-(void)pauseUnity
{
printf_console("-> Pause Unity
");
if(_unityAppReady)
{
UnityPause(true);
extern void UnityStopVideoIfPlaying();
UnityStopVideoIfPlaying();
// Force player to do one more frame, so scripts get a chance to render custom screen for
// minimized app in task manager.
UnityForcedPlayerLoop();
[self repaintDisplayLink];
}
_didResignActive = true;
}
-(void)stopUnity
{
printf_console("-> Stop Unity
");
Profiler_UninitProfiler();
UnityCleanup();
}
-(void)dealloc
{
extern void SensorsCleanup();
SensorsCleanup();
[self releaseViewHierarchy];
[super dealloc];
}
But it’s crashing down in UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath]UTF8String]);
with this stack
#0 0x00b9488c in std::_Rb_tree<int, std::pair<int const, Object::RTTI>, std::_Select1st<std::pair<int const, Object::RTTI> >, std::less<int>, stl_allocator<std::pair<int const, Object::RTTI>, (MemLabelIdentifier)1, 16> >::_M_begin() [inlined] at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/c++/4.2.1/bits/stl_tree.h:476
#1 0x00b9488c in std::_Rb_tree<int, std::pair<int const, Object::RTTI>, std::_Select1st<std::pair<int const, Object::RTTI> >, std::less<int>, stl_allocator<std::pair<int const, Object::RTTI>, (MemLabelIdentifier)1, 16> >::find(int const&) [inlined] at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/c++/4.2.1/bits/stl_tree.h:1373
#2 0x00b94874 in std::map<int, Object::RTTI, std::less<int>, stl_allocator<std::pair<int const, Object::RTTI>, (MemLabelIdentifier)1, 16> >::find(int const&) [inlined] at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/c++/4.2.1/bits/stl_map.h:542
#3 0x00b94874 in Object::ClassIDToRTTI(int) at /Applications/buildAgent/work/d63dfc6385190b60/Runtime/BaseClasses/BaseObject.cpp:828
#4 0x00b9b88c in Unity::GameObject::RegisterClass() at /Applications/buildAgent/work/d63dfc6385190b60/Runtime/BaseClasses/GameObject.cpp:1374
#5 0x00b94f48 in Object::InitializeAllClasses() at /Applications/buildAgent/work/d63dfc6385190b60/Runtime/BaseClasses/BaseObject.cpp:903
#6 0x00cda400 in InitializeEngineNoGraphics() at /Applications/buildAgent/work/d63dfc6385190b60/Runtime/Misc/SaveAndLoadHelper.cpp:210
#7 0x00ccb594 in PlayerInitEngineNoGraphics(std::string const&, std::string const&) at /Applications/buildAgent/work/d63dfc6385190b60/Runtime/Misc/Player.cpp:711
#8 0x00ac6170 in UnityInitApplicationNoGraphics at /Applications/buildAgent/work/d63dfc6385190b60/PlatformDependent/iPhonePlayer/LibEntryPoint.mm:188
Specifically on this line of the assembly 0xbc288c: ldr r3, [r1]
Has anyone else managed to do this successfully? What am I missing?