Unity调用原生Android与IOS

发布于 2022-08-01


Unity调用IOS原生方法

IOS Project目录介绍

  • NativeiOSApp:原生iOS Xcode工程
  • UnityIOSBuild:Unity打包出的xcode工程
image-20220810150541487

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.xcodeprojIOSProject/UnityIOSBuild/Unity-iPhone.xcodeproj到第二步中创建的workspace中 (File/Add Files to "both")
image-20220810151749410

2.添加UnityFramework.framework

通过这一步,我们以framework的形式将Unity添加到NativeiOSApp中。

  • 选择NativeiOSApp target

  • 在 "General/Frameworks, Libraries, and Embedded Content" 点击+

  • 添加Unity-iPhone/UnityFramework.framework

    image-20220810152243981
  • 在"Build Phase/Link Binary With Libraries"中,删除 UnityFramework.framework (选中点击 _)

image-20220810152535952

3.设置 UnityCallIOS.h

NativeiOSAPP 需要实现UnityCalls.h中定义的 UnityCallsProtocol:

  • 找到并选中文件 Unity-iPhone/Libraries/Plugins/iOS/NativeCallProxy.h
  • 勾选 UnityFramework 在 Target Membership栏,并设置为public
image-20220810153119416

4.设置 Data 文件夹 为 UnityFramework

默认情况下,Data文件夹是Unity-iPhone的一部分,我们改变它,使所有东西都封装在一个单一的框架文件中。

  • Target Membership中勾选 UnityFramework
image-20220810153446365
  • (可选)如果想使用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.
    
    image-20220810153647545

实现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原生的方法。

image-20220810154650396

实现了 OnAvatarClicked接口

image-20220810154739200

运行

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

image-20220810155000120

Unity调用Android原生方法

Unity中配置

  • PlayerSetting->Ohter Settings -> Configuration section choose targeted architectures
selectArchitectures
  • Build Settings 窗口 勾选 Export Project
exportProject

Android Project目录介绍

  • NativeAndroidApp:原生安卓工程
  • UnityAndroidBuild:Unity打包出的安卓公测
image-20220810170721017

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"
      }
      
      image-20220810171518301
  • 打开 build.gradle(Module: NativeAndroidApp.app)文件

    • 在dependencies{ 下添加一下内容

      implementation project(':unityLibrary')
      implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
      
      image-20220810171823402
    • 在android{defaultConfig{ndk{ 中,根据第一步中unity配置情况添加内容,具体文档可以查看official android documentation. image-20220810172336173

  • 将导出的Unity项目根目录下的gradle.properties文件的内容复制到本地应用程序根目录下的gradle.properties文件。注意:如果你更新了Unity项目并重新导出,确保导出的项目中gradle.properties文件的内容没有改变。如果有的话--重复这个步骤。

    exportedASProject
gradlePropertiesApp
  • 点击 "Sync Now "来进行项目同步,因为Gradle文件已经被修改。

  • 成功后,可以看到 unityLibrary

    image-20220810172741535

实现IUnityCallAndroid接口

在Unity工程的IUnityCallAndroid.java中定义了OnAvatarClicked接口

image-20220810173216854

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

image-20220810173621239

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

image-20220810173703769

并在MainUnityActivity.java中初始化unityLibrary中的UnityCallAndroid

此处MainUnityActivity是原生Android进入Unity游戏时切换的Activity

image-20220810174029621

运行

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

image-20220810174359585
image-20220810174212860