Unity调用Android、IOS

Unity调用IOS原生方法

IOS Project目录介绍

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

unity ios内购 真机初始化不成功_iOS

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")

unity ios内购 真机初始化不成功_iOS_02

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 (选中点击 _)

unity ios内购 真机初始化不成功_iOS_03

3.设置 UnityCallIOS.h

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

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

unity ios内购 真机初始化不成功_Android_04

4.设置 Data 文件夹 为 UnityFramework

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

  • Target Membership中勾选 UnityFramework

unity ios内购 真机初始化不成功_Android_05

  • (可选)如果想使用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.

unity ios内购 真机初始化不成功_xcode_06

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

unity ios内购 真机初始化不成功_iOS_07

实现了 OnAvatarClicked接口

unity ios内购 真机初始化不成功_iOS_08

运行

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

unity ios内购 真机初始化不成功_xcode_09

Unity调用Android原生方法

Unity中配置

  • PlayerSetting->Ohter Settings -> Configuration section choose targeted architectures

unity ios内购 真机初始化不成功_Android_10

  • Build Settings 窗口 勾选 Export Project

unity ios内购 真机初始化不成功_xcode_11

Android Project目录介绍

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

unity ios内购 真机初始化不成功_Android_12

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"
}

unity ios内购 真机初始化不成功_Android_13

  • 打开 build.gradle(Module: NativeAndroidApp.app)文件
  • 在dependencies{ 下添加一下内容
implementation project(':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])

unity ios内购 真机初始化不成功_Android_14

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

unity ios内购 真机初始化不成功_iOS_15

  • 点击 "Sync Now "来进行项目同步,因为Gradle文件已经被修改。
  • 成功后,可以看到 unityLibrary

实现IUnityCallAndroid接口

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

unity ios内购 真机初始化不成功_iOS_16

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

unity ios内购 真机初始化不成功_iOS_17

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

unity ios内购 真机初始化不成功_iOS_18

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

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

unity ios内购 真机初始化不成功_Android_19

运行

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

unity ios内购 真机初始化不成功_xcode_20

unity ios内购 真机初始化不成功_xcode_21