ios原生项目内嵌u3d工程

本文一反常态,目标是把u3d工程以framewWork形式 内嵌原生IOS项目

1、xcode中新建Cocoa Touch FrameWork。取名u3dFrameWork

2、把u3d导出的xcode中,Class、Library 拷贝到u3dFrameWork 中 采用

 方式引入

从library中移除掉libil2cpp

3 以下头文件移动到public 

4、Build Phases 下头文件引用中 移除RegisterMonoModules.h   compile sources 中移除main.mm 和RegisterMonoModules.cpp  

5、配置修改

  1. Build Settings -> Header Search Paths: $(inherited) "$(SRCROOT)/Classes" "$(SRCROOT)" $(SRCROOT)/Classes/Native $(SRCROOT)/Libraries/bdwgc/include $(SRCROOT)/Libraries/libil2cpp/include
  2. Build Settings -> Library Search Paths: $(inherited) "$(SRCROOT)" "$(SRCROOT)/Libraries"
  3. Build Settings -> Prefix Header: Classes/Prefix.pch
  4. Build Settings -> Mismatched Return Type: Yes
  5. Build Settings -> Enable C++ Exceptions: Yes
  6. Build Settings -> Other Linker Flags: $(inherited) -weak_framework CoreMotion -weak-lSystem
  7. Build Settings -> Mach-O Type: Static Library
  8. Build Settings ->Other C Flags -> $(inherited) -DINIT_SCRIPTING_BACKEND=1 -fno-strict-overflow -DRUNTIME_IL2CPP=1
  9. Build Settings -> Build Avtive Achitecture Only: No

6 u3dFramework.h添加文件引用

  #import <u3dFramework/UnityAppController.h>

  #import <u3dFramework/UnityController.h>

  #import <u3dFramework/RenderPluginDelegate.h>

  #import <u3dFramework/UnityInterface.h>

  #import <u3dFramework/UnityRendering.h>

  #import <u3dFramework/RegisterFeatures.h>

  #import <u3dFramework/UnityForwardDecls.h>

  #import <u3dFramework/LifeCycleListener.h>

7、

 

新建UnityController.h****************************

#import <Foundation/Foundation.h>

#import "UnityAppController.h"

@interface UnityController:UnityAppController

@property (nonatomic, readonly, weak) UIView *playView;  /* 展示Unity的view */

 

+ (instancetype)instance;

 

- (void)initUnity;

 

- (void)pauseUnity;

 

- (void)startUnity;

 

- (BOOL)isPaused;

 

@end

 

新建UnityController.mm************************

#import "UnityController.h"

#import "UnityAppController.h"

#import "DisplayManager.h"

#import "UnityView.h"

 

#import "UnityAppController+ViewHandling.h"

#import "UnityAppController+Rendering.h"

@interface UnityController()

@property (nonatomic, assign) BOOL isInitUnity;

@end

 

@implementation UnityController

 

+ (instancetype)instance {

    return (UnityController *)[[UIApplication sharedApplication] valueForKeyPath:@"delegate.unityController"];

}

 

- (instancetype)init

{

    self = [super init];

    if (self) {

        self.isInitUnity = NO;

        // 注册Unity的事件

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

    }

    return self;

}

- (UIView *)playView {

    return self.unityView;

}

 

static const int constsection = 0;

 

- (void)initUnity {

    

    if (!self.isInitUnity) {

        if ([UIDevice currentDevice].generatesDeviceOrientationNotifications == NO)

            [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

        

        UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath] UTF8String]);

        [self selectRenderingAPI];

        [UnityRenderingView InitializeForAPI: self.renderingAPI];

        _window = nil;

        _unityView      = [self createUnityView];

        

        

        [DisplayManager Initialize];

        _mainDisplay    = [DisplayManager Instance].mainDisplay;

        [_mainDisplay createWithWindow: _window andView: _unityView];

        [super applicationDidBecomeActive:[UIApplication sharedApplication]];

        self.isInitUnity = YES;

    }

}

- (void)pauseUnity {

    //[self applicationWillResignActive:[UIApplication sharedApplication]];

    UnityPause(1);

}

 

- (void)startUnity {

    

    //[self applicationDidBecomeActive:[UIApplication sharedApplication]];

    UnityPause(0);

}

- (BOOL)isPaused {

    if (UnityIsPaused() == 1) {

        return YES;

    }

    else {

        return NO;

    }

}

 

- (void)appWillEnterForeground:(NSNotification *)notification {

    [self applicationWillEnterForeground:[UIApplication sharedApplication]];

}

 

- (void)appDidBecomeActive:(NSNotification *)notification {

    if (nil == self.unityView) {

        return;

    }

    [self applicationDidBecomeActive:[UIApplication sharedApplication]];

}

 

- (void)appWillResignActive:(NSNotification *)notification {

    [self applicationWillResignActive:[UIApplication sharedApplication]];

}

 

- (void)appWillTerminate:(NSNotification *)notification {

    [self applicationWillTerminate:[UIApplication sharedApplication]];

}

 

- (void)appDidReceiveMemoryWarning:(NSNotification *)notification {

    [self applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];

}

@end

UnityAppController.h做如下修改******************************

inline UnityAppController* GetAppController()

{

    return (UnityAppController *)[[UIApplication sharedApplication] valueForKeyPath:@"delegate.unityController"];

}

二 新建ios原生工程

新建sdk文件夹。将上歩FrameWork和Libraries放入sdk中。Libraries中保留libiPhone-lib.a  libil2cpp.a  libil2cpp   引入sdk文件夹

拷贝u3d工程中Data文件夹 引入工程

Build Settings -> Header Search Paths:$(PROJECT_DIR)/sdk/Libraries/libil2cpp/include

Build Settings -> Library Search Paths: $(inherited) $(PROJECT_DIR)/sdk/Libraries

Build Settings -> Other Linker Flags:-force_load "$(PROJECT_DIR)/sdk/u3dFramework.framework/u3dFramework"

 

  

 AppDelegate.m做如下修改

#import "AppDelegate.h"

#import <u3dFramework/u3dFramework.h>

@interface AppDelegate ()

    @property(strong,nonatomic) UnityController *unityController;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    if (_unityController == nil)

        _unityController = [[UnityController alloc] init];

    return YES;

}

 

ViewController.m做如下操作******************************

#import "ViewController.h"

#import <u3dFramework/u3dFramework.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    button.frame = CGRectMake(60, 60, 80, 40);

    [button setTitle:@"开启Unity" forState:UIControlStateNormal];

    [self.view addSubview:button];

    [button addTarget:self action:@selector(clickHandler:) forControlEvents:UIControlEventTouchUpInside];

    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    button1.frame = CGRectMake(160, 60, 80, 40);

    [button1 setTitle:@"暂停Unity" forState:UIControlStateNormal];

    [self.view addSubview:button1];

    [button1 addTarget:self action:@selector(clickHandler1:) forControlEvents:UIControlEventTouchUpInside];

    // 供Unity显示的View

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 150, 300, 300)];

    [view setBackgroundColor:[UIColor grayColor]];

    [view setTag:22];

    [self.view addSubview:view];

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

- (void) clickHandler:(id)sender

{

    [[UnityController instance] initUnity];

    [UnityController instance].playView.frame = [self.view viewWithTag:22].bounds;

    [[self.view viewWithTag:22] addSubview:[UnityController instance].playView];

}

- (void) clickHandler1:(id)sender

{

    if ([[UnityController instance] isPaused]) {

        [[UnityController instance] startUnity];

    }

    else {

        [[UnityController instance] pauseUnity];

    }

}

@end

 

 

 

 

 

 

posted @ 2019-03-22 13:15  U_探索  阅读(681)  评论(0编辑  收藏  举报