Unity调用原生Android与IOS
发布于 2022-08-01
Unity调用IOS原生方法
IOS Project目录介绍
- NativeiOSApp:原生iOS Xcode工程
- UnityIOSBuild:Unity打包出的xcode工程

IOS原生接入Unity步骤
1.创建Xcode workspace
Xcode workspace允许同时进行多个项目的工作,并结合各个产品。
- 在
IOSProject/NativeiOSApp
目录打开NativeiOSApp.xcodeproj
- 创建 workspace 并保存到
IOSProject
目录,例如命名为 both.xcworkspace. (File/New/Workspace) - 关闭
NativeiOSApp.xcodeproj
工程,所有的后续工作都将在刚刚创建的both.xcworkspace
中完成 - 添加
IOSProject/NativeiOSApp/NativeiOSApp.xcodeproj
和IOSProject/UnityIOSBuild/Unity-iPhone.xcodeproj
到第二步中创建的workspace中 (File/Add Files to "both")

2.添加UnityFramework.framework
通过这一步,我们以framework的形式将Unity添加到NativeiOSApp中。
-
选择NativeiOSApp target
-
在 "General/Frameworks, Libraries, and Embedded Content" 点击
+
-
添加Unity-iPhone/UnityFramework.framework
-
在"Build Phase/Link Binary With Libraries"中,删除 UnityFramework.framework (选中点击
_
)

3.设置 UnityCallIOS.h
NativeiOSAPP 需要实现UnityCalls.h中定义的 UnityCallsProtocol:
- 找到并选中文件
Unity-iPhone/Libraries/Plugins/iOS/NativeCallProxy.h
- 勾选 UnityFramework 在
Target Membership
栏,并设置为public

4.设置 Data 文件夹 为 UnityFramework
默认情况下,Data文件夹是Unity-iPhone的一部分,我们改变它,使所有东西都封装在一个单一的框架文件中。
- 在
Target Membership
中勾选 UnityFramework

-
(可选)如果想使用Unity-iPhone sheme,则需要通过从Unity-iPhone/MainApp/main.mm中调用,将UnityFramework指向数据所在的新位置。
[ufw setDataBundleId: "com.unity3d.framework"]; // On Demand Resources are not supported in this case. To make them work instead of the calls above // you need to copy Data folder to your native application (With script at Build Phases) and // skip a calls above since by default Data folder expected to be in mainBundle.
实现NativeCallProxy.h中的接口
在Unity-iPhone/Libraries/Plugins/iOS/NativeCallProxy.h文件中,定义了一个点击头像的接口 OnAvatarClicked
#import <Foundation/Foundation.h>
@protocol UnityCallsProtocol
@required
- (void) OnAvatarClicked;
//其他接口 函数
@end
__attribute__ ((visibility("default")))
@interface UnityCallIOSLibAPI : NSObject
// 在UnityFrameworkLoad之后的任何时候调用它来设置实现UnityCallsProtocol方法的对象
+(void) registerAPIforUnityCalls:(id<UnityCallsProtocol>) aProtocol;
@end
在Unity-iPhone/Libraries/Plugins/iOS/NativeCallProxy.mm中的 OnAvatarClicked函数是Unity通过反射调用IOS的,所以,在NativeiOSApp中只要实现NativeCallProxy.h的接口,并在UnityFrameworkLoad之后的任何时候调用它来设置实现UnityCallsProtocol方法的对象,即可完成Unity调用IOS原生的方法。

实现了 OnAvatarClicked接口

运行
当我点击了Unity中左上角 Avatar按钮,原生IOS做出了回应

Unity调用Android原生方法
Unity中配置
- PlayerSetting->Ohter Settings -> Configuration section choose targeted architectures

- Build Settings 窗口 勾选
Export Project

Android Project目录介绍
- NativeAndroidApp:原生安卓工程
- UnityAndroidBuild:Unity打包出的安卓公测

Android原生接入Unity步骤
1.在NativeAndroidApp中添加Unity Library模块
执行以下操作,将导出的androidBuild/unityLibrary模块添加到Android Studio的NativeAndroidApp Gradle项目中。
-
用Android Studio打开 NativeAndroidApp
-
打开 settings.gradle 文件
-
在主应用程序模块之后添加一个新项目,指向unityLibrary模块。
include ':unityLibrary' project(':unityLibrary').projectDir=new File('..\\UnityProject\\androidBuild\\unityLibrary')
-
并在dependencyResolutionManagement{repositories{块中添加以下内容
flatDir { dirs "${project(':unityLibrary').projectDir}/libs" }
-
-
打开 build.gradle(Module: NativeAndroidApp.app)文件
-
在dependencies{ 下添加一下内容
implementation project(':unityLibrary') implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
-
在android{defaultConfig{ndk{ 中,根据第一步中unity配置情况添加内容,具体文档可以查看official android documentation.
-
-
将导出的Unity项目根目录下的gradle.properties文件的内容复制到本地应用程序根目录下的gradle.properties文件。注意:如果你更新了Unity项目并重新导出,确保导出的项目中gradle.properties文件的内容没有改变。如果有的话--重复这个步骤。

-
点击 "Sync Now "来进行项目同步,因为Gradle文件已经被修改。
-
成功后,可以看到 unityLibrary
实现IUnityCallAndroid接口
在Unity工程的IUnityCallAndroid.java
中定义了OnAvatarClicked
接口

并创建了单例UnityCallAndroid.java
,供Unity调用,只要原生Android实现IUnityCallAndroid.java接口,并在对于的Activity中初始化即可

所以,创建文件(例如:MyUnityCallAndroid.java),实现接口

并在MainUnityActivity.java中初始化unityLibrary中的UnityCallAndroid
此处MainUnityActivity是原生Android进入Unity游戏时切换的Activity

运行
当我点击了Unity中左上角 Avatar按钮,原生Android做出了回应

