集成步骤
准备
- swift 4.1
- Xcode 9.3
- Unity 2018.1.1f1
开始集成
说明:
-
已经存在
swift和Objective-C的桥接头文件 -
使用了
cocoapods并且已经执行了pod install -
原生项目是竖屏,而
Unity3D需要横屏 -
Unity3D导出Xcode工程Player Settings的设置:
Orientation中Default Orientation改为Auto RotationSplash Image的Splash Screen和Logos均不勾选Other Settings中Target Device改为iPhone Only,Target SDK改为Device SDK,Target minimum iOS version改为 8.0,Architecture改为ARM64
-
在原生项目中新建
Unity文件夹,放在工程代码的同级目录即可,并进行下列操作- 下载 blitzagency的教程以及一些文件
- 把刚才下载的文件夹中的
Unity.xcconfig、UnityBridge.h、UnityUtils.h、UnityUtils.mm这4个文件拉进刚才创建的文件夹Unity中,拉的时候会提示创建桥接文件,选择不创建 - 修改
Unity.xcconfig文件的配置
// 如果使用了 `cocoapods` 需要引入 `cocoapods.xcconfig` 文件 #include "Pods/Target Support Files/Pods-XHStudent_ECoach/Pods-XHStudent_ECoach.debug.xcconfig" #include "Pods/Target Support Files/Pods-XHStudent_ECoach/Pods-XHStudent_ECoach.release.xcconfig" UNITY_SCRIPTING_BACKEND = il2cpp; GCC_PREFIX_HEADER = $(PRODUCT_NAME)/Unity/Classes/Prefix.pch; HEADER_SEARCH_PATHS = $(inherited) "$(PRODUCT_NAME)/Unity/Classes" "$(PRODUCT_NAME)/Unity/Classes/Unity" "$(PRODUCT_NAME)/Unity/Classes/Native" "$(PRODUCT_NAME)/Unity/Libraries" "$(PRODUCT_NAME)/Unity/Libraries/libil2cpp/include" ${PODS_HEADER_PATHS}; LIBRARY_SEARCH_PATHS = $(inherited) "$(PRODUCT_NAME)/Unity/Libraries" "$(PRODUCT_NAME)/Unity/Libraries/libil2cpp/include" ${PODS_LIBRARY_PATHS}; OTHER_CFLAGS = $(inherited) -DINIT_SCRIPTING_BACKEND=1 -fno-strict-overflow -DRUNTIME_IL2CPP=1; OTHER_LDFLAGS = $(inherited) -weak-lSystem -weak_framework CoreMotion -weak_framework GameKit -weak_framework iAd -framework AVFoundation -framework AudioToolbox -framework CFNetwork -framework CoreGraphics -framework CoreLocation -framework CoreMedia -framework CoreVideo -framework Foundation -framework MediaPlayer -framework MediaToolbox -framework Metal -framework OpenAL -framework OpenGLES -framework QuartzCore -framework SystemConfiguration -framework UIKit -liconv.2 -liPhone-lib -lil2cpp ${PODS_LIBRARIES}; SWIFT_OBJC_BRIDGING_HEADER = $(PRODUCT_NAME)/Bridge/XHStudent_ECoach-Bridging-Header.h; SWIFT_PRECOMPILE_BRIDGING_HEADER = YES;- 修改工程配置,使用
Unity.xcconfig点击PROJECT->Info->Configuration,将project设置为Unity.xcconfig,下面对应的target改为相应的cocoapods.xcconfig即可 - 修改buildSetting配置,路径和你unity的版本号
- 点击
target->Build Settings - 点击搜索
UNITY_IOS_EXPORT_PATH, 设置为你第一步中导出Xcode的位置, UNITY_RUNTIME_VERSION设置为对应的Unity(2018.1.1f1) 版本Enable bitcode,设置为NO
- 点击
build Phases中添加运行脚本echo "Syncing data from + $UNITY_IOS_EXPORT_PATH..." rm -rf "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data" cp -Rf "$UNITY_IOS_EXPORT_PATH/Data" "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data"- 将
Unity3D导出的文件夹Classes、Libraries放入Unity文件夹 - 增加
main.swift文件
custom_unity_init(CommandLine.argc, CommandLine.unsafeArgv)
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer.self,
capacity: Int(CommandLine.argc)),
nil,
NSStringFromClass(AppDelegate.self)
)
9. 修改导入的文件 1. 将 `main.mm` 中的 `main` 改为 `old_main` 2. 替换 `UnityAppController` 中的 `GetAppController` 方法
//注释此方法
//inline UnityAppController* GetAppController()
//{
// return (UnityAppController*)[UIApplication sharedApplication].delegate;
//}
//替换为此方法
NS_INLINE UnityAppController* GetAppController()
{
NSObject<UIApplicationDelegate>* delegate = [UIApplication sharedApplication].delegate;
UnityAppController* currentUnityController = (UnityAppController *)[delegate valueForKey:@"currentUnityController"];
return currentUnityController;
}
```
10. 修改原生项目
1. 注释 `@UIApplicationMain`,按图添加部分代码
集成错误及解决方式
-
集成了
ZBar点击target->Build Phases搜索EZCodeSCannerViewController.mm,在Compiler Flags中设置-fno-objc-arc修改EZCodeSCannerViewController.mm中的UITextAlignmentCenter为NSTextAlignmentCenter -
原生项目为竖屏,
Unity3D模块为横屏class UnityViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() appDelegate.blockRotation = true UnityGetGLView().frame = view.frame; view.addSubview(UnityGetGLView()) view.setNeedsLayout() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let value = UIInterfaceOrientation.landscapeLeft.rawValue UIDevice.current.setValue(value, forKey: "orientation") } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) appDelegate.blockRotation = false let value = UIInterfaceOrientation.portrait.rawValue UIDevice.current.setValue(value, forKey: "orientation") } override open var shouldAutorotate: Bool { return false } override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { return .landscapeLeft } } -
原生与
Unity3D交互 在UnityUtils扩展一个函数(两边的函数名必须一致,且不能使用系统预留关键字),然后在本地监听该能通知即可extern "C" void dismiss() { [[NSNotificationCenter defaultCenter] postNotificationName: @"dismiss" object:nil userInfo:nil]; }Unity则需要包含System.Runtime.InteropServices,//导出按钮以后将在xcode项目中生成这个按钮的注册, //这样就可以在xocde代码中实现这个按钮点击后的事件。 [DllImport("__Internal")] private static extern void _PressButton0 (); public static void ActivateButton0 () { if (Application.platform != RuntimePlatform.OSXEditor) { //点击按钮后调用xcode中的 _PressButton0 ()方法, //方法中的内容须要我们自己来添加 _PressButton0 (); } } -
单独的由
Unity导出的Xcode的工程无法构建版本 需要添加访问权限才可以<key>NSBluetoothPeripheralUsageDescription</key> <string>是否许允此App使用蓝牙?</string> <key>NSCalendarsUsageDescription</key> <string>是否允许此App使用日历?</string> <key>NSCameraUsageDescription</key> <string>我们需要通过您的相机扫描二维码等</string> <key>NSContactsUsageDescription</key> <string>是否允许此App访问你的通讯录?</string> <key>NSLocationWhenInUseUsageDescription</key> <string>我们需要通过您的地理位置信息获取您周边的驾校相关信息</string> <key>NSMicrophoneUsageDescription</key> <string>是否允许此App使用你的麦克风?</string> <key>NSPhotoLibraryUsageDescription</key> <string>我们需要通过你的相册获取二维码图片等</string> <key>NSSpeechRecognitionUsageDescription</key> <string>是否允许此App使用语音识别?</string> -
会创建一个默认的
window,此window会默认放在第一个 如果有使用到系统默认的window时let window = ((UIApplication.shared.delegate?.window)!)!
参考网址
www.aliyun.com/jiaocheng/3… blog.csdn.net/zhao18933/a… www.jianshu.com/p/dc68baad8… www.jianshu.com/p/e8217896d… blog.csdn.net/studying_io… www.jianshu.com/p/fd52e2cf2… www.jianshu.com/p/7624a5d56… blog.csdn.net/scboyhj__/a… www.jianshu.com/p/f938a712d… www.jianshu.com/p/5c773628c… www.jianshu.com/p/07b86dc7c… www.cocoachina.com/bbs/read.ph… blog.csdn.net/yidu_blog/a… www.cocoachina.com/bbs/read.ph… www.mamicode.com/info-detail… www.cnblogs.com/sjxjjx/p/62…
sudo gem install cocoapods