公司有个AR项目,对ios与u3d进行集成,需求如下,点击按钮进入Unity3D界面,并且能够返回,在网上找了一些方法,文章中会进行最简单的集成,最后会附上资料链接以及Demo。
1 . 新建一个文件夹 取名字为 iOS_Unity 里面存放两个文件夹 分别取名字为 ios 和 unity .
2. 打开U3D 选择新建(NEW) 工程名字取名字叫 nativeUnity 位置(location) 选择我们刚刚创建的IntegrateUnity文件夹下面的unity,然后点击Create project .
3. 打开U3D之后随便创建一个东西,然后点击左上方File-->BuildSetting,此时会弹出一个框,iPad. 怎么样随意建一个U3D工程,自己网上选择ios然后点击player Setting.设置如下:iphone就选择iPhone,iPad就选择iPad
4. 设置结束之后,然后点击Build , 选择位置是IntegrateUnity-->unity,取名字为 unity_ios ,成功导出,如图:
5. 在真机上运行 一下 刚刚导出来的 Xcode 工程,运行成功.()
6. 在 IntegrateUnity下面的ios里面新建一个Xcode工程取名字为nativeiOS我的是7.3Unity版本是5.3.4f1.
7. 下面开始进行集成:新建两个文件夹分别为Unity 和 FrameWorks.在我们从Unity里面导出来ios工程中找到Libraries、Classes和Data拖进工程,此时要注意 Libraries和Classes过程中Copy items if needed -->不选 Create groups--> 选 ; 在Data时 Copy items if needed --> 不选 ,Create folder references -->选。
8 . 下面进行删除操作( 不删除也可以,并不是真正意义上的删除 )
libraries删除操作:
Classes删除操作:
选择Native然后在最底部进行.h筛选 删除Native下面的所有.h文件,几千个文件慢慢的删除,防止Xcode卡死.
9. 新建PCH文件 然后把Classes里面的Prefix.pch文件里面的东西全部复制到刚刚所建立的pch文件中,然后在Targer->Build Settings中进行相关配置:
Enable Bitcode --> NO
Other Link Flags --> -weak_framework CoreMotion -weak-lSystem
对刚刚拖进来的Classes和Libraries的路径进行配置,看清路径是从Unity导出来的Xcode工程的:
最上面 + 进行添加 导入库设置10. 把Classes里面的main.mm 全部复制下来 放到main.m里面 并且把main.m修改为main.mm , 并且把修改为main.mm里面的第13行(也可能行号不对自己去找就一个名字是这个的)"UnityAppController" 修改成 "AppDelegate" 然后
11. 把Classes里面的UnityAppController.h 进行修改如图:此时报错是因为AppDelegate里面没有做修改,
修改成下图12 . 对AppDelegate进行如下代码:
此时会报错,pch文件加上一句话如下图:
14 .此时我们对工程进行Build一下: 会报错,我的报错如下:
在UnityAppController.h 上面加上@Class UnityViewControllerBase如图:
此时,在进行Build , 完美 、成功.
15. 到了最后的阶段了了,前期工作都已经做好下面就是进入到Unity3D界面:在ViewController.m里面创建一个Button,在这里就不进行截图了,点击触发方法如下: 导入AppDelegate.h文件:
16 . 进入到了U3d界面我们如何进行返回呢,如下图,在AppDelegate.m里面的ShowUnityWindow里面 写上如下方法:
17 . 此次进行真机运行 结果如下:
18 . 好了,到目前为止最简单的集成就这么实现了,下面附上参考的文章:
http://www.the-nerd.be/2015/11/13/integrate-unity-5-in-a-native-ios-app-with-xcode-7/
Demo连接 密码: 71ry
注: demo是最近才写的Xcode版本是8.3.2 Unity版本是5.3.4f1(未更新过),demo中的工程名字可能和文章中的名字稍微有点不一样但集成步骤是一样的。网盘中有两个文件一个是Demo下载下来真机运行就可以了, 另一个是Demo中使用的Unity工程(一起做项目的Unity工程师拿来给我测试用的我这里拿来做Demo了)导入Unity中按步骤集成即可。
网友评论
clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]
ld: library not found for -liPhone-lib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
然后加载的图片都失败 变成红色问号。请问这是什么原因? Unity版本是5.6.1p1,Xocode版本是9.0
clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]
ld: library not found for -liPhone-lib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
iOS端内部嵌入了两款AR的游戏,进入不同的场景使用 UnitySendMessage("Controller", "OpenSence",data);传递不同的参数,但是只有第一次启动他才能进入其中一个,当进入第二个发送新的消息时还是会显示第一个的游戏画面,iOS端Unity是无法关闭的,后来测试加入 UnityLoadApplication();
Profiler_InitProfiler();
切换偶尔是正常的,但有时候会显示错乱,麻烦看下
(void)showUnityWindow {
if (_didResignActive) {
UnityPause(false);
}
_didResignActive = NO;
UnityLoadApplication();
Profiler_InitProfiler();
self.window.hidden =YES;
self.unityWindow.hidden = NO;
[self.unityWindow makeKeyWindow];
}
(void)hideUnityWindow {
UnityPause(true);
_didResignActive = YES;
Profiler_UninitProfiler();
self.unityWindow.hidden = YES;
self.window.hidden = NO;
[self.window makeKeyWindow];
}
发送消息代码:
(void)wjBtnDidClicked {
[kAppDelegate showUnityWindow];
[self toUnityPageWithValue:@"wj"];
}
(void)scenesBtnDidClicked {
[kAppDelegate showUnityWindow];
[self toUnityPageWithValue:@"scenes"];
}
#pragma mark - 跳转到对应的Unity页面
(void)toUnityPageWithValue:(NSString *)value {
// TODO: 新增代码
//报错SendMessage: object Controller does not have receiver for function openSence! 说明UnitySendMessage传递的对象不具备相应的方法
const char *data = [value UTF8String];
/**
你那边需要打开场景的话 需要 传值给 OpenSence这个函数 通过ios给unity对象传值的方式 值有两个 "wj" 和 ”scenes“
"Controller" "openSence" "wj 或者 scenes"
*/
UnitySendMessage("Controller", "OpenSence",data);
}
#import "AppDelegate.h"
NS_INLINE UnityAppController*GetAppController()
{
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
UnityAppController *currentUnityController = (UnityAppController *)[app valueForKey:@"unityController"];
return currentUnityController;
}
这句一直报错。。找不到AppDelegate。。
{
NSObject<UIApplicationDelegate>* delegate = [UIApplication sharedApplication].delegate;
UnityAppController* currentUnityController = (UnityAppController *)[delegate valueForKey:@"unityController"];
return currentUnityController;
}