zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    Android内存管理之道
    What a C programmer should know about memory
    Android Bitmap缓存池使用详解
    android 5.0主题风格研究
    最受欢迎的5个Android ORM框架
    目前具体实现 material design 有什么途径?
    计算机的数学要求(?转)
    机器智能公司一览图 | 36氪
    Android中Context
    从源码的角度深入分析Scroller
  • 原文地址:https://www.cnblogs.com/U-tansuo/p/u3d_as_FrameWork.html
Copyright © 2011-2022 走看看