美文网首页unity优化有意思游戏开发
史上最全unity与xcode集成教程

史上最全unity与xcode集成教程

作者: MUYO_echo | 来源:发表于2017-01-21 15:26 被阅读8105次

    unity版本:unity 5.4.3f1 

    xcode版本:xcode 8

    一、导出unity项目

    1.File->Build Settings->ios->Switch platform 切换为iOS平台,

    2.player Settings.....(这个地方设置错误会导致导入ios工程之后出现200+错误)

    3.File->Build Settings->Build(保存为xcode文件)

    --------我是分割线------------

    二、合并unity项目(2种方式,一是把你的工程集成到unity项目,二是把unity项目集成至你的工程)

    (一),将原工程集成至unity工程

    1,将原工程直接拖拽到Unity生成的工程里,在Unity的工程上进行开发。

    2,将原工程的main.m文件、AppDelegate.h和AppDelegate.m文件删除,若有pch文件,也可与Unity工程中的Pch文件合并后删除(删除相关文件前请先备份,合并后请检查pch路径是否正确)。

    3,此时程序的主函数入口为Classes/main.mm,AppDelegate为Classes/UnityAppController.mm,程序的pch文件为Classes/Prefix.pch。将原工程的相应代码拷贝到相对应的文件中即可。

    4,因为现在程序的入口在Unity工程端,所以原工程的主界面需在Unity工程运行后(如下图,“showGameUI”方法调用之后)再添加到keyWindow上即可。

    (二),将unity项目集成至原工程

    1,将unity与iOS工程放置与同一根目录,将Unity工程中的`Classes`、`Data`和`Libraries`、‘MapFileParser.sh’文件夹复制到自己的工程根目录。

    2,添加文件,Data 选择Create folder references,Classes和Libraries 选择Create groups。

    3,在Build settings中设置Pch文件(如工程已有pch文件,请将两个pch文件合并)。我的做法是,复制unity  Classes中Pch文件中的代码添加至自己的Pch文件中,删除classes中的Pch文件

    4.复制Classes中的main.mm文件中的代码,删除你的main.m中的代码,粘贴过去,删除main.mm,修改main.m为main.mm;

    5,在Build Phases新建运行脚本语句Run Script

    rm -rf "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data"

    cp -Rf "$PROJECT_DIR/Data" "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data"

    6.在Build settings中设置Header Search Paths 

    $(SRCROOT)/Libraries/libil2cpp/include

    $(SRCROOT)/Libraries/bdwgc/include

    $(SRCROOT)/Classes/Native

    "$(SRCROOT)/Classes"

    7,在Build settings中设置Other C Flags

    -mno-thumb

    -DINIT_SCRIPTING_BACKEND=1

    8,在Build Phases中导入以下库(这里具体请查看导出的ios工程里面的库,千万不要重复导入)

    9,在Build Phases中将所有.mm文件(除了CameraCapture.mm,MetalHelper.mm,DisplayManager.mm文件)打上MRC标签。

    10.编译真机运行(此时运行项目进入unity界面)

    -------------------我是分割线----------------

    三、在iOS工程中打开unity项目 ,(我们项目的入口为main.mm,main函数之后调用UnityAppController.mm,也就是以前项目的AppDelegate.m文件不调用,可以删除)

    1.修改工程启动方式,由先启动unity视图,修改为先启动我们的ViewController

    我们加入了一个myPageEnable变量,表示我们的myPage是否被启动过,如果启动做,就不再重复执行,注释掉startUnity: 改为myPageEnable:如下图。(此时,运行项目会进入我们自己的界面)

    我用单利保存了当前的application 和当前的self,(用于以后点击按钮进入unity)

    这样,我们就实现工程直接先启动我们的视图,其实总结一下很简单,把APP的rootViewController修改成我们的,并且停用原有Unity的相同功能代码。

    2.在iOS中打开unity界面

    首先,unity一旦被打开,我们是不需要彻底关闭掉的,当从unity返回我们的View 时,将unity view暂停到后台,并把window的rootviewcontroller设置为我们的rootViewController

    我们已经知道,启动Unity的函数是

    - (void)startUnity:(UIApplication *)application,所以重新调用这个函数即可

    在我们的控制器里面点击按钮(redpacketButton是红包按钮)打开unity:

    注意一点,startUnity方法只能使用一次。多次调用同样会导致应用Crash,并报错:“should not be reached at domain.c”,所以我们用restartUnity(这个方法写在UnityAppController.mm中)

    3.关闭unity界面(这里有两种方法,一,调用unity中的back函数。二,我们自己写退出按钮)

    值得注意的是:在extern "C"中,不能用OC的self和self.window获取到appController和window,必须使用UnityAppController对象提供的方法GetAppController()和UnityGetGLView()来获取。

    3.1, 调用unity中的back函数(这个函数应和unity开发人员沟通,统一命名),调用方法:

    extern "C"  void back(){

    //你的代码

    }

    3.2 自己写退出按钮

    Unity View启动时在页面中初始化一个我们实现写好的关闭按钮的UIView,按钮点击事件方法和上面一样

    -------------------我是分割线----------------


    四。Unity与iOS传值


    4.1 iOS发消息给unity

    // 添加这句代码,它负责向Unity传递参数;(具体参数和unity开发人员协商)

    extern void UnitySendMessage(const char *, const char *, const char *);

    IOS调用Unity函数需要用到UnitySendMessage方法,方法中有三个参数

    UnitySendMessage("gameobject", "Method",msg);

    参数一为unity脚本挂载的gameobject(可以理解为具体的unity中某个对象或者物体)

    参数二为unity脚本中要调用的方法名

    参数三为传递的数据,注意:传递的数据只能是char *类型

    4.2 unity向iOS 传值,这个我没有用到,大家可以google  网上案例很多。

    结语

    最近公司开发AR红包,写出这个博客给大家作为参考。因为是初步接触unity,自己也翻越了很多资料,如果有错误,希望大家指正。后期会不断更新补全集成中遇到的各种问题。

    有疑问可以给我发邮件(或者QQ),看到了必定回复:1020351736@qq.com 

    QQ群号:129018636

    相关文章

      网友评论

      • swj沈:简主你好ld: warning: arm64 function not 4-byte aligned: ltmp0 from /Users/~~/Desktop/FinalDemo/Libraries/libiPhone-lib.a(unwind_test_arm64.o)
        ld: warning: arm64 function not 4-byte aligned: _unwind_tester from /Users/~~/Desktop/FinalDemo/Libraries/libiPhone-lib.a(unwind_test_arm64.o)
        Undefined symbols for architecture arm64:
        "_MTAudioProcessingTapGetSourceAudio", referenced from:
        AVFoundationVideoPlayback::PlayerPriv::ProcessAudioTap(opaqueMTAudioProcessingTap const*, long, unsigned int, AudioBufferList*, long*, unsigned int*) in libiPhone-lib.a(AVFoundationVideoPlayback.o)
        "_MTAudioProcessingTapCreate", referenced from:
        -[AVFoundationMediaLoader ConfigureAudioOutput] in libiPhone-lib.a(AVFoundationVideoPlayback.o)
        "_MTAudioProcessingTapGetStorage", referenced from:
        -[AVFoundationMediaLoader ConfigureAudioOutput] in libiPhone-lib.a(AVFoundationVideoPlayback.o)
        AVFoundationVideoPlayback::PlayerPriv::PrepareAudioTap(opaqueMTAudioProcessingTap const*, long, AudioStreamBasicDescription const*) in libiPhone-lib.a(AVFoundationVideoPlayback.o)
        AVFoundationVideoPlayback::PlayerPriv::ProcessAudioTap(opaqueMTAudioProcessingTap const*, long, unsigned int, AudioBufferList*, long*, unsigned int*) in libiPhone-lib.a(AVFoundationVideoPlayback.o)
        AVFoundationVideoPlayback::PlayerPriv::FinalizeAudioTap(opaqueMTAudioProcessingTap const*) in libiPhone-lib.a(AVFoundationVideoPlayback.o)
        -[AVFoundationMediaLoader StopOutput] in libiPhone-lib.a(AVFoundationVideoPlayback.o)
        ld: symbol(s) not found for architecture arm64
        clang: error: linker command failed with exit code 1 (use -v to see invocation)
      • 取个并不帅气的昵称:写Header Search Paths需谨慎,别直接粘贴,还是看一下自己的路径。
      • 浪里小青龙:请教一下, 我的 unity 有用到 shareREC, 导出的 iOS 项目摄像头可以用, 但是导入到原生项目中, 原生界面为第一启动页面, 背景是一片黑的, 界面显示正常. 设置 unity 为第一启动时, 摄像头是正常的. 请问有没有遇到这方面的问题呢
      • 6f5fdca1b0ae:三、在iOS工程中打开unity项目 ,(我们项目的入口为main.mm,main函数之后调用UnityAppController.mm,也就是以前项目的AppDelegate.m文件不调用,可以删除)

        我对这个标题有疑问,我们现在的xcode工程里的.m文件做了不少操作,如果appdelegate.m删除了,那里面的操作都要放到UnityAppController.mm中吗?
        MUYO_echo:@Anna_c598 是的,是的,最好是封装一下,方便调用
      • 3e8eb14bdf82:我也给你转了两块钱
        MUYO_echo:@binbins 感谢:smile:
      • 雪山飞狐_91ae:楼主你打了马赛克的地方我不知道该怎么写:joy:
        随意_M:不会写+1
      • A777727:Apple Mach-O Linker (ld) Error 一直都是这个错误 用EasryAR导出,跑通,然后到原生项目就疯了
      • 小浣熊的梦想:将原生工程集成到unity有没有demo
      • 小浣熊的梦想:我将iOS原生工程直接拖进unity后,一直报错pods文件找不到怎么办
      • Redpower:一路操作下来,最终报了200个错。。。有办法解决吗?
        ec7cd2a58305:楼上的各位有没有解决啊
        人和旧事:@May一座城 怎么样了 解决了吗 可以分享一下吗
        A777727:怎么样了 我也是200多个错误,崩溃了
      • 悖论13:楼主 我想问下 都打上mrc的标签的作用是什么
        人和旧事:疯狂报错
        悖论13:@MUYO_echo 嗷嗷原来如此,因为我只会集成,但是并不知道调试的每个步骤的意思。。
        MUYO_echo:@悖论_9d72 因为在c++文件中是手动管理内存的
      • 悖论13:给你两块钱
        MUYO_echo:@悖论_9d72 非常感谢
      • Metoo丶淡然:两种方法都没有试通,是我的悟性不够么= =!
        悖论13:这个作者匹配的路径是他的路径你要自己匹配你自己的路径包括脚本,不要一直复制
        Metoo丶淡然:@MUYO_echo 先谢谢你了,确实提供了不错的思路
        MUYO_echo:@Metoo丶淡然 其中的坑很多的,我也是做了好多次才成功的
      • 青鱼谷雨:很详细,谢谢分享
        6054a4da381e:我们也要做AR,这篇博客太及时了。
        MUYO_echo:@青鱼谷雨 多谢支持
      • 何康老鬼:班长,可以的
        MUYO_echo:@刘小二哥 :smile:谢谢支持
      • 就是lpc:不错,写的很棒哦。大神
      • 简约时光:666,真帅

      本文标题:史上最全unity与xcode集成教程

      本文链接:https://www.haomeiwen.com/subject/xwngbttx.html