精华内容
下载资源
问答
  • unity与原生iOS项目的整合(一) uniity版本更换iOS需要做的几项重复操作(二) unityiOS原生交互的代码(三) 在unity切换到ios分支的时候,主要看othersetting里面的设定,我打包出在iphoneX真机正常运行的设定...

    最近公司开始准备弄ios了,这里准备记录一下过程,首先来几个比较写的详细到位的博客
    unity与原生iOS项目的整合(一)
    uniity版本更换iOS需要做的几项重复操作(二)
    unity与iOS原生交互的代码(三)
    Unity3D与iOS的交互
    2019最新 iOS Native项目集成Unity3D
    原生iOS嵌入Unity导出的Xcode工程

    这里的unity版本是2018.3 然后XCode版本是11.3.1,自测到Unity2019.1为止,unity出包的ios程序结构都不变,对于ios开发人员来说不需要其他的方法,2019.2之后结构改变了,对于整合到XCode中有些不一样 但是目前的unity版本是2019.3.1f1 ios那边依然是可以放进去做正常运行的
    在unity切换到ios分支的时候,主要看othersetting里面的设定,我打包出在iphoneX真机正常运行的设定如下图所示,红框里面是修改需要谨慎的地方。

    在这里插入图片描述

    在这里插入图片描述

    在windowsPC机上出来的unity工程发给ios开发机,然后当然遇到了一点错误,总的来说按照上面的设置unity打出来的ios工程是没有任何问题的。

    • xcode第一次打开unity的build出来的ios工程的时候,要等xcode对里面的每个文件链接完才能执行在真机创建app的命令,虽然说一般没有链接完直接运行也没什么影响,但是如果工程里面有某些第三方文件的时候,没链接直接运行会导致说某些文件找不到的报错。
    • MapFileParser.sh: Permission denied,其实在unix系统里面MapFileParser.sh这个脚本文件没有赋予权限,需要ios工程师通过cmd命令或者其它方式去赋予这个文件权限。

    tips:
    unity打出来的包分为在真机和在模拟的,真机的包在模拟器运行会出错,模拟器的包在真机运行会出错。
    在othersettings里面的这个地方可以进行更改。在这里插入图片描述
    参考链接:

    Unity3D打包后iOS如何使用模拟器


    交互

    参考链接
    Unity3D与iOS的交互

    unity主动传值给ios的方法和上面的文章是一样的。
    有些特别的地方写一下

    • 返回值没写对没关系 方法名对就可以了
     [DllImport("__Internal")]
     	//这里返回值即使和函数声明不一致,在ios也能找到对应的函数,但是在webgl里面和外界交互写错返回值就会出错了
        private static extern string outputAppendString(string str1, string str2);
    
    • 生成的.m文件在xcode里面改内容是可以正常执行更改后的内容的,不是只能在unity里面的.m里面改好代码
    • 如果在xcode里面的.m里面用c的方式去申请装载字符串的内存,返回字符串给unity后,要进行一下内存的释放,不然会报错。参考链接:Unity 调用oc报错:malloc: *** error for object 0x1ecc0eb0: pointer being freed was not allocated下面的代码是能够正常返回字符串给unity的.m里面的c语言的写法
    • .h和.m文件不一定要在unity里面写好,这点很重要。 因为.h和.m里面本身主要是ios的逻辑,每次在unity里面进行更改的话,都需要重新建xcode工程重新编译耗时耗力,以后就在放好unity打包好的ios工程之后,只需要在xcode里面改了.h和.m文件直接重新运行就可以了
    #import <Foundation/Foundation.h>
    
    char* outputAppendString (char *str1, char *str2)
    {
      NSString *string1 = [[NSString alloc] initWithUTF8String:str1];
      NSString *string2 = [[NSString alloc] initWithUTF8String:str2];
      NSLog(@"###%@", [NSString stringWithFormat:@"%@ %@", string1, string2]);
        
        NSString *sl = @"from ios 1234";
        //内存释放
        char* ret;
        ret = (char*) malloc([sl length] + 1);
        memcpy(ret,[sl UTF8String],([sl length] + 1));
        
        return ret;
    }
    

    ios主动传值给unity的使用方式也是和文章是一样的
    要注意的就是使用UnitySendMessage的时候 参数只能是字符串形式
    要注意就是UnitySendMessage的第二个参数方法名字不能是静态类型的方法不然不起作用


    最后
    发现Strip Engine Code没什么影响,只是勾选后会剔除一些用不到的代码,强制保留的都在Asset下新建的link.xml里面保存了,所以勾选后节省了大约1M的包大小

    展开全文
  • 1 :在U3D中生成iOS文件,注意: bundle identifier :用户名,要与后面的对接上 Version:版本号,后面要用到 TargetSDK:设备或模拟器 2 :生成一个X-code程序,然后新建一个oc项目 将U3D生成的项目内的文件: ...

    1 :在U3D中生成iOS文件,注意:


    bundle identifier :用户名,要与后面的对接上
    Version:版本号,后面要用到
    TargetSDK:设备或模拟器

    2 :生成一个X-code程序,然后新建一个oc项目
    将U3D生成的项目内的文件:
    将Classes,Libraries,MapFileParser.sh拖入到项目(选中Copy items if needed, 选中Create groups)
    将Data拖入到项目(选中Copy items if needed, 选中Create folder references)

    3 :修改bit code为no
    Build Settings - > Enable Bitcode

    4 : 添加frameworks



    5 :添加Header Search Paths 和 Library Search Paths

    6 :other C Flags - >  -DINIT_SCRIPTING_BACKEND=1


    7 : 添加User-Defind(UNITY_RUNTIME_VERSION)版本号与工程版本一致


    Add User-Defined Setting添加以上信息

    8 :删除main.Storyboard,同时改变plist文件中的Main storyboard file base name,将Main删除,在AppDelegate.m初始化window进行使用
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    9 :将main.mm文件内容复制到main.m中,同时删除.mm文件,将.m文件修改为.mm
    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"

    #include "RegisterMonoModules.h"
    #include "RegisterFeatures.h"
    #include <csignal>

    // Hack to work around iOS SDK 4.3 linker problem
    // we need at least one __TEXT, __const section entry in main application .o files
    // to get this section emitted at right time and so avoid LC_ENCRYPTION_INFO size miscalculation
    static const int constsection = 0;

    void UnityInitTrampoline();

    // WARNING: this MUST be c decl (NSString ctor will be called after +load, so we cant really change its value)
    //const char* AppControllerClassName = "UnityAppController";
    const char* AppControllerClassName = "AppDelegate";

    int main(int argc, char* argv[])
    {
        @autoreleasepool
        {
            UnityInitTrampoline();
            UnityParseCommandLine(argc, argv);
            
            RegisterMonoModules();
            NSLog(@"-> registered mono modules %p\n", &constsection);
            RegisterFeatures();
            
            // iOS terminates open sockets when an application enters background mode.
            // The next write to any of such socket causes SIGPIPE signal being raised,
            // even if the request has been done from scripting side. This disables the
            // signal and allows Mono to throw a proper C# exception.
            std::signal(SIGPIPE, SIG_IGN);
            
    //        UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String:AppControllerClassName]);
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

        }
        
    //    return 0;
    }

    #if TARGET_IPHONE_SIMULATOR && TARGET_TVOS_SIMULATOR

    #include <pthread.h>

    extern "C" int pthread_cond_init$UNIX2003(pthread_cond_t *cond, const pthread_condattr_t *attr)
    { return pthread_cond_init(cond, attr); }
    extern "C" int pthread_cond_destroy$UNIX2003(pthread_cond_t *cond)
    { return pthread_cond_destroy(cond); }
    extern "C" int pthread_cond_wait$UNIX2003(pthread_cond_t *cond, pthread_mutex_t *mutex)
    { return pthread_cond_wait(cond, mutex); }
    extern "C" int pthread_cond_timedwait$UNIX2003(pthread_cond_t *cond, pthread_mutex_t *mutex,
                                                   const struct timespec *abstime)
    { return pthread_cond_timedwait(cond, mutex, abstime); }

    #endif // TARGET_IPHONE_SIMULATOR && TARGET_TVOS_SIMULATOR

    10 : 添加Run Script,点➕添加(注意文件路径)


    11 :修改UnityAppController.h文件
    #import "AppDelegate.h"
    inline UnityAppController*    GetAppController()
    {
    //    return (UnityAppController*)[UIApplication sharedApplication].delegate;
        return (UnityAppController*)[[UIApplication sharedApplication] valueForKeyPath:@"delegate.unityController"];
    //    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    //    return delegate.unityController;
    }
    12 :修改AppDelegate.h文件中
    #import <UIKit/UIKit.h>
    #import "UnityAppController.h"

    @interface AppDelegate : UIResponder <UIApplicationDelegate>

    @property (strong, nonatomic) UIWindow *window;

    @property (strong, nonatomic) UIWindow *unityWindow;

    @property (strong, nonatomic) UnityAppController *unityController;

    - (void)showUnityWindow;
    - (void)hideUnityWindow;

    @end

    13 : 修改AppDelegate.m文件

    #import "AppDelegate.h"
    #import "ViewController.h"

    @interface AppDelegate ()

    @end

    @implementation AppDelegate

    - (UIWindow *)unityWindow {
        return UnityGetMainWindow();
    }

    - (void)showUnityWindow {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
        button.frame = CGRectMake(0, 0, 155, 85);
        button.backgroundColor = [UIColor redColor];
        [button setTitle:@"back" forState:UIControlStateNormal];
        [button addTarget:self action:@selector(hideUnityWindow) forControlEvents:UIControlEventTouchUpInside];
        [self.unityWindow addSubview:button];
        
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
        
        [self.unityWindow makeKeyAndVisible];
    }

    - (void)hideUnityWindow {
        
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
        
        [self.window makeKeyAndVisible];
    }

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.window.backgroundColor = [UIColor whiteColor];
        
        ViewController *vc = [[ViewController alloc] init];
        self.window.rootViewController = vc;
        
        self.unityController = [[UnityAppController alloc] init];
        [self.unityController application:application didFinishLaunchingWithOptions:launchOptions];
        
        
        [self.window makeKeyAndVisible];
        
        return YES;
    }

    - (void)applicationWillResignActive:(UIApplication *)application {
        [self.unityController applicationWillResignActive:application];
    }

    - (void)applicationDidEnterBackground:(UIApplication *)application {
        [self.unityController applicationDidEnterBackground:application];
    }

    - (void)applicationWillEnterForeground:(UIApplication *)application {
        [self.unityController applicationWillEnterForeground:application];
    }

    - (void)applicationDidBecomeActive:(UIApplication *)application {
        [self.unityController applicationDidBecomeActive:application];
    }

    - (void)applicationWillTerminate:(UIApplication *)application {
        [self.unityController applicationWillTerminate:application];
    }
    14 :修改pch文件,将原pch文件复制到新文件中,同时添加路径


    展开全文
  • Unity做东西是快,但是有些功能是需要额外开发的,比如 IAP (In App ...还好unity提供了灵活的扩展功能,允许嵌入原生代码来做一些unity未实现的功能。 这几天折腾IAP,碰到很多问题,现在终于调通了,记下来备忘。
  • Unity项目嵌入原生IOS项目

    千次阅读 2019-10-18 09:52:37
    1.把unity导出的ios工程嵌入IOS原生工程 2.把IOS工程嵌入unity导出的IOS原生工程 两种方式各有优劣,下面来分析下 1.unity导出工程包含几个类库,脚本,需要修改一部分配置,如果ios原生工程是个空项目或者就几个...

    前言

    现在的需求是合并IOS工程和unity3d工程需要。
    目前的方案有两种:
    1.把unity导出的ios工程嵌入IOS原生工程
    2.把IOS工程嵌入unity导出的IOS原生工程

    两种方式各有优劣,下面来分析下
    1.unity导出工程包含几个类库,脚本,需要修改一部分配置,
    如果ios原生工程是个空项目或者就几个简单页面,那么毫无疑问,是把原生的ios工程导入unity工程,这个非常简单,给修改main.mm的启动,再添加一个ViewController页面跳转到Unity即可。
    如果IOS工程也很复杂,比如需要导入地图,聊天,支付等一系列SDK,那么就代表原生工程也需要配置很多东西,这种情况下,建议把unity工程嵌入到ios原生工程,因为unity导出工程是有一个模板的,我们照着改参数相对来说没有想象中那么复杂(其实也很复杂,坑我两天时间),所以接下来呢,我就详细阐述一下unity工程嵌入IOS原生工程的步骤。

    1.准备工作

    1.准备一个unity工程(建议先用空工程测试),导出ios工程,Target SDK,选择Device SDK,真机调试(模拟器也没问题,而且比真机好跑通,但建议最终以真机为准),导出后先在xcode试运行,确保没有编译错误。
    unity工程
    2.准备一个IOS原生工程(建议先用空工程测试),自己学习下ios的基本知识,添加一个按钮,要写ios跳转unity场景的点击事件,然后先试运行,确保没有错误。
    ios工程

    2.合并类库

    1.拷贝unity工程文件到ios原生工程
    打开unity导出工程目录,选择Class,Libraries文件夹和MapFileParser.sh文件,拖拽到ios原生工程中。选择:Copy Items if needed和Create groups
    在这里插入图片描述
    选择Data文件夹,拖拽到ios原生工程,选择:Copy Items if needed和Create folder refrences
    在这里插入图片描述
    导入完成后,工程目录如下图:
    在这里插入图片描述
    3.添加Framework
    根据unity导出工程的Framework,以此添加到ios原生工程
    快捷方式:直接拖拽复制,然后选中它们再勾选下Target Membership
    添加libiconv.2.dylib动态库引用,没有.dylib文件,直接添加.tbd也行
    添加完后的结构
    在这里插入图片描述

    3.合并main文件

    1.移动main.mm文件,到ios工程文件夹下,复制main.m内容到main.mm下,然后删除main.m文件。
    合并main.mm后

    4.修改Build Phases

    1.添加一个Run Script
    2.点击+号,选择New Run Script Phase
    3.粘贴MapFileParse.sh的路径(根据unity导出工程)

    在这里插入图片描述

    5.修改Build Setting

    1.修改Build Options->Enable Bitcode:NO

    Bitcode
    2.修改Linking->Other Linker Flags
    Other Link Flags
    3.修改头文件引用和库引用(让ios能够找到unity的文件)
    Search Paths->Header Search Paths
    Search Paths->Library Search Paths
    Head Search Paths
    Library Search Paths
    4.修改C和C++标记
    Apple LLVM9.0 - Custom Compiler Flags-> Other C Flags
    Apple LLVM9.0 - Custom Compiler Flags-> Other C++ Flags
    Other C Flags
    Other C++ Flags
    5.添加Prefix.pch文件的引用,如果ios原工程也有这个文件,需要合并。
    Apple LLVM9.0 - Language->Precompile Prefix Header:Yes
    Apple LLVM9.0 - Language->Prefix Header:Classes/Prefix.pch
    Prefix.pch

    7.修改(搜索objc即可找到)
    Apple LLVM9.0 - Preprocessing->Enable Strict Checking of objc_msgSend Calls:No
    objc_msgSend
    8.添加User-Defined,点击Build Setting的+号,选择Add User Defined Setting
    User-Defind->GCC_THUMB_SUPPORT:NO
    User-Defind->GCC_USE_INDIRECT_FUNCTION_CALLS:NO
    User-Defind->UNITY_RUNTIME_VERSION:2018.4.10f0
    User-Defind->UNITY_SCRIPTING_BACKEND:il2cpp
    User-Defined

    6.注意事项

    以上参数仅供参考,最终修改为什么值,要根据你的unity导出的xcode工程来定,因为每个人xcode版本和unity版本以及项目都不一样,不要太死板。我也是比对着参数找过来的。

    7.可选修改

    有几个参数,需要根据你的实际情况修改(如果上面的参数改完后,编译没有问题,就不用改了)
    1.修改真机和模拟器的平台:

    • Architectures->Supported Platforms:iphoneos*
      真机和模拟器选择
      2.修改C和C++语言的版本:
    • C Language Dialect -> C99[-std=c99]*
    • C++ Language Dialect ->C++11[-std=c++11]*
      C和C++的Dialect

    到此为止,应该能编译成功了。
    如果还有错误,不管是25个还是170个都不用慌,继续往下看错误修改

    8.错误修改

    1.DeviceSetting.mm文件内错误
    解决方案:方法添加一个return 0;
    DeviceSettings.mm语法修改
    2.Underfined Symbols for architecture arm64:
    “xxxxx”,refrenced from:DynamicLibEngineAPI.o
    错误展示01
    错误展示02
    解决方案:打开Build Phases,搜索DynamicLibEngineAPI,然后选择-号删除
    删除DynamicLibEngineAPI.mm编译源引用
    3.dyld:Library not loaded:@executable_path/lib/libiPhone-lib.a
    Reason:image not found
    解决方案:Build Phases找那个添加Copy Files,然后添加libiPhone-lib.a

    添加libiPhone-lib.a的强引用

    9.修改AppDelegate

    与其说修改,不如所示直接替换

    AppDelegate.h

    //
    //  AppDelegate.h
    //
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    @property (strong, nonatomic) UIWindow *unityWindow;
    
    - (void)showUnityWindow;
    - (void)hideUnityWindow;
    
    @end
    

    AppDelegate.m

    //
    //  AppDelegate.m
    //
    
    #import "AppDelegate.h"
    #import "ViewController.h"
    #import "UnityController.h"
    
    @interface AppDelegate ()
    @property(nonatomic,strong)UnityAppController *unityController;
    @end
    
    @implementation AppDelegate
    
    //unity 交互unity
    -(UIWindow *)unityWindow{
        return  UnityGetMainWindow();
    }
    
    -(void)showUnityWindow{
        [self.unityWindow makeKeyAndVisible];
    }
    
    -(void)hideUnityWindow{
        [self.window makeKeyAndVisible];
    }
    
    -(void)addUnityView{
        [self.window addSubview:self.unityController.unityView];
    }
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        //unity viewcontroller
        _unityController = [[UnityAppController alloc] init];
        [_unityController application:application didFinishLaunchingWithOptions:launchOptions];
        
        //ios window
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.window.backgroundColor = [UIColor whiteColor];
        
        //ios viewcontroller
        ViewController *viewController = [[ViewController alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
        
        self.window.rootViewController = nav;
        [self.window makeKeyAndVisible];
        
        return YES;
    }
    
    - (void)applicationWillResignActive:(UIApplication *)application {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
        
        [_unityController applicationWillResignActive:application];
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
        
        [_unityController applicationDidEnterBackground:application];
    }
    
    - (void)applicationWillEnterForeground:(UIApplication *)application {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
        
        [_unityController applicationWillEnterForeground:application];
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        
        [_unityController applicationDidBecomeActive:application];
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        
        [_unityController applicationWillTerminate:application];
    }
    @end
    

    10.添加UnityAppController

    UnityController是UnityAppController的子类,我们添加UnityController的目的是为了避免修改UnityAppController,而是直接去扩展,每次合并工程,直接拷贝过来即可。
    UnityController.h

    //
    //  UnityController.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

    //
    //  UnityController.mm
    //  UnityDemo
    //
    
    #import "UnityController.h"
    #import "UnityAppController.h"
    #import "UnityAppController+ViewHandling.h"
    #import "UnityAppController+Rendering.h"
    
    #import "DisplayManager.h"
    #import "UnityView.h"
    
    #include "RegisterMonoModules.h"
    #include "RegisterFeatures.h"
    #include <mach/mach_time.h>
    #include <csignal>
    
    @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 UnityInitTrampoline();
    
    //void initMain(int argc, char* argv[])
    
    void initMain(int argc, char* argv[]) {
    #if UNITY_USES_DYNAMIC_PLAYER_LIB
        SetAllUnityFunctionsForDynamicPlayerLib();
    #endif
        
        UnityInitStartupTime();
        @autoreleasepool
        {
            UnityInitTrampoline();
            UnityInitRuntime(argc, argv);
            
            RegisterMonoModules();
            NSLog(@"-> registered mono modules %p\n", &constsection);
            RegisterFeatures();
            
            // iOS terminates open sockets when an application enters background mode.
            // The next write to any of such socket causes SIGPIPE signal being raised,
            // even if the request has been done from scripting side. This disables the
            // signal and allows Mono to throw a proper C# exception.
            std::signal(SIGPIPE, SIG_IGN);
            
        }
    }
    
    - (void)initUnity {
        
        if (!self.isInitUnity) {
            
            initMain(0,NULL);
            
            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
    

    11.从IOS跳转到Unity

    给oc的页面添加一个点击事件,这个需要一点IOS的基础,请自行百度吧
    我这里,给ViewController.xib添加了一个按钮,并绑定了点击事件如下
    ViewController页面的点击事件

    - (IBAction)OnButtonClick:(id)sender {
        NSLog(@"Open Unity Cick");
        
        //进入unity场景为小窗口
        //UIView* _view = [(AppDelegate *)[UIApplication sharedApplication].delegate unityWindow].rootViewController.view;
        //_view.frame = CGRectMake(0, 0, 200, 300);
        //[self.view addSubview:_view];
        
        //弹出unity场景为全屏幕
        [(AppDelegate *)[UIApplication sharedApplication].delegate showUnityWindow];
        UnityPause(false);
    }
    

    最后全部搞定,运行成功

    效果图

    希望这篇文章能够对你有所帮助—passion

    展开全文
  • Unity页面嵌入iOS

    2017-10-31 15:16:59
    UnityiOS的结合 1 目的2 步骤 五 运行六 参考 一 运行环境 Unity 5.2.0f3  Xcode 7.0.1 二 Unity部分 2.1 目的 创建一个简单的Unity应用,其中只有一个Cube,以便后续在ios应用的原生...


    一 运行环境

    Unity 5.2.0f3 
    Xcode 7.0.1

    二 Unity部分

    2.1 目的

    创建一个简单的Unity应用,其中只有一个Cube,以便后续在ios应用的原生页面里放置Button, 点击Button旋转Cube
    
    • 1
    • 2

    2.2 步骤

    1. 在桌面/Users/admin/Desktop创建工程UnityProject (Ps: admin 是我的Mac名)

    2. 在生成的UnityProject->Assets中添加文件夹命名为Scripts,再在Scripts中添加move.js脚本

    3. 创建一个Cube,将move.js脚本绑定在Cube上

    4. 然后在生成的UnityProject->Assets中添加文件夹Plugins,接着在Plugins中添加文件夹iOS,然后在iOS中添加MyAppController.mm文件

    5. 配置Unity中的iOS选项: 
      Edit->Project Setting->Player 进入Setting for iOS 
      这里写图片描述

      Allowed Orientation for Auto Rotation: 勾掉Potrait, Potrait Upside Down(使本应用只支持横屏) 
      Auto Graphic API: 去掉勾,然后选择OpenGLES2 
      Scripting Backend: IL2CPP 
      Target Device: iPad only 
      Target iOS Version: 8.0

    6. 导出Unity生成的iOS Project 
      File->Build Settings 选择iOS,然后Build And Run。路径为/Users/admin/Desktop/UnityExportIOSProject

    这里写图片描述

    三 原生iOS应用部分

    1. Create a new Xcode project->Single View Application, 命名为MyProject, 放在桌面

    2. Project->MyProject->Info, 将iOS Deployment Target设置为8.0

    3. Target->MyProject->General, Device Orientaion 取消Portrait和Upside Down前面的勾

    4. 保存

    四 Unity和iOS的结合

    4.1 目的

    目前我们的桌面上总共有三个文件夹:
    
    • 1
    • 2

    这里写图片描述

    第一个是Unity工程,第二个是Unity导出的iOS工程,第三个就是我们自己的原生工程,接下来我们就会将UnityExportIOSProject整合到MyProject中
    
    • 1
    • 2

    4.2 步骤

    1. 将UnityExportIOSProject中的文件夹Classes和Libraries拖动到MyProject中,不要勾选Copy items if needed

      这里写图片描述

    2. Project->MyProject->Build Setting 
      在Header search paths 添加: 
      ${SOURCE_ROOT}/../UnityExoprtIOSProject/Classes

      ${SOURCE_ROOT}/../UnityExportIOSProject/Libraries/libil2cpp/include

      ${SOURCE_ROOT}/../UnityExportIOSProject/Libraries/bdwgc/include

      ${SOURCE_ROOT}/../UnityExportIOSProject/Classes/Native

      在Library Search Paths 添加: 
      ${SOURCE_ROOT}/../UnityExportIOSProject/Libraries

      ${SOURCE_ROOT}/../UnityExportIOSProject/Libraries/Plugins/iOS

    3. 将Classes中的main.mm文件的内容全部拷贝到Supporting Files中的main.m中,然后删除Classes中的main.mm文件,再将Supporting Files中的main.m文件重命名为main.mm

    4. 在Supporting Files文件夹中创建新的PCH文件,命名为PrefixHeader,如下图所示勾选上Target,将Classes中的Prefix.pch文件的内容全部拷贝到Supporting Files中的PrefixHeader.pch中。 
      这里写图片描述

    5. Project->MyProject->Build Setting 
      设置Precompile Prefix Header: YES 
      并在Prefix Header中添加: 
      ${SOURCE_ROOT}/MyProject/PrefixHeader.pch

    6. Target->MyProject->Build Phases 
      点击如下图所示左上角的“+”号,选择New Run Script Phase

    这里写图片描述
    往其中添加:

    这里写图片描述 
    7. Target->MyProject->Build Phases->Link Binary With Libraries,添加如下

    这里写图片描述 
    8. Project->MyProject->Build Setting 
    在Other Linker Flags添加 
    -lc++ 
    -weak_framework 
    CoreMotion 
    -weak-lSystem

    在Other C Flags添加 
    -mno-thumb 
    -DINIT_SCRIPTING_BACKEND=1

    设置 C Language Dialekt:C99[-std=c99] 
    设置 C++ Language Dialekt : C++ 11[-std=c++11] 
    设置 C++ Standard Library : libc++ (LLVM C++ standard Library with C++11 support) 
    设置 Enable Modules (C and Objective-C) : YES 
    设置 Enable Bitcode : NO 
    9. Project->MyProject->Build Setting 
    点击如下图的“+”号,选择4个Add User-Defined Setting

    这里写图片描述

    设置key值:GCC_THUMB_SUPPORT,设置Value值:NO 
    设置key值:GCC_USE_INDIRECT_FUNCTION_CALLS,设置Value值:NO 
    设置key值:UNITY_RUNTIME_VERSION,设置Value值:5.2.0f3 
    设置key值:UNITY_SCRIPTING_BACKEND,设置Value值: il2cpp 
    10. 选择Info.plist 
    添加key值:Unity_LoadingActivityIndicatorStyle,设置Value值:-1 
    11. 新建一个CubeSceneViewController类,将CubeSceneViewController.m文件重命名为CubeSceneViewController.mm 
    在main.storyboard中如下图设置:

    这里写图片描述

    12.在CubeSceneViewController.h中添加

    #import "UI/UnityView.h"
    #import "UI/UnityViewControllerBase.h"
    #include "UnityAppController+ViewHandling.h"
    
    • 1
    • 2
    • 3
    • 4

    在CubeSceneViewController.mm的viewDidLoad中添加

    GetAppController().unityView.frame = self.unityView.frame;
    
        // This adds the UnityView finally
        [self.unityView addSubview:(UIView*)GetAppController().unityView];
        [self.unityView setNeedsLayout];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    并在CubeSceneViewController.mm添加:

    - (IBAction)leftBtnClicked:(id)sender {
    
        UnitySendMessage("Cube","MoveLeft","");
    }
    - (IBAction)rightBtnClicked:(id)sender {
        UnitySendMessage("Cube","MoveRight","");
    }
    - (IBAction)upBtnClicked:(id)sender {
        UnitySendMessage("Cube","MoveUp","");
    }
    - (IBAction)downBtnClicked:(id)sender {
        UnitySendMessage("Cube","MoveDown","");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    五 运行

    首页: 
    这里写图片描述
    向左转: 
    这里写图片描述
    向上转: 
    这里写图片描述

    六 参考

    http://www.the-nerd.be/2014/09/08/sandbox-unity-app-in-existing-ios-app/ 
    http://www.makethegame.net/unity/add-unity3d-to-native-ios-app-with-unity-5-and-vuforia-4-x/

    1. http://blog.csdn.net/pyn740/article/details/49364631

    2. http://www.arvrschool.com/read.php?tid=687

    3.http://blog.csdn.net/dingxiaowei2013/article/details/52693421

    4.http://blog.csdn.net/dylan_lwb_/article/details/51452470

    展开全文
  • Unity做东西是快,但是有些功能是需要...还好unity提供了灵活的扩展功能,允许嵌入原生代码来做一些unity未实现的功能。 这几天折腾IAP,碰到很多问题,现在终于调通了,记下来备忘。 首先要提到两个链接: ...
  • UnityiOS平台交互和原生插件开发

    千次阅读 2018-02-27 11:24:21
    比如iOS平台上我们要从一个应用唤起另一个应用,在我们的游戏中打开一个网页,或者是直接嵌入一个iOS原生的界面(也就是现在接SDK的时候要做的事情)。 很多兄弟在刚接触的时候一头雾水,不知道从哪里...
  • Auto Graphics API取消勾选就好了直接点- 把Metal 删除掉
  • 前边unity3d打包iOS工程的方法在此就不做赘述,其他帖子基本可以解决,本帖直接上干货。 1、在打包好的iOS工程中,找到UnityAppController.m文件(在classes文件夹下),因为我们需要3d物体和控件同屏,所以要首先...
  • 承接ARKit案例开发/宣传Demo开发/游戏开发 QQ:2118590660 ... Unity 项目与iOS项目 合并 嵌入 交互 传值 教学视频 蛮牛地址: http://edu.manew.com/course/434       使用版本: Unity...
  • Unity(2017版本)嵌入现有iOS工程

    千次阅读 2017-10-20 16:24:26
    1、将Unity项目下面的四个文件复制到iOS项目根目录下: 2、在自己iOS项目里面引用这个几个文件,右键分别选择Classes 和 Libraries 、MapFileParser.sh 拖入项目,在Options里面勾选  “Create groups”,不要选...
  • 要实现游戏SDK的接入,首先要解决的是Unity3D与原生IOS代码之间的相互调用问题。Unity使用C#作为开发语言,而IOS采用Objective-C作为开发语言,如何让C#调用OC代码,或者让OC调用C#代码。所幸OC和C#都支持直接嵌入C/...
  • unity导成xcode项目再嵌入ios原生的xcode项目中,要求iOS原生项目是竖屏的,调unity的时候unity界面以及cardboard观看的时候是横屏的,现在出现的问题是导入成功之后两个约束互相冲突,并且cardboard因没转屏而...
  • unity嵌入网页:uWebKit使用记录

    千次阅读 2015-04-20 13:54:15
    uWebKit支持ios 1.关于WebTexture: 要求:带有meshcollider才可以对网页进行点击拖拽的操作,在显示网页的面片上添加WebTexture脚本(组件)。 修改:同时显示多个网页,修改脚本中的webviewname View = UWKCore....
  • 最近老板让在unity项目里实现分享与内购功能,还要ios和android两个平台都做。这下彻底瞎了,我连unity都不会啊。。。。。。 为了提高工作效率,以免日后忘了如何操作,就把工作内容记录下来,供以后参考。 1、...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
热门标签
关键字:

unity嵌入ios