集成 SDK
目前暂时只支持手动集成的方式.
后续会添加 Package Manager
的自动集成方式.
手动集成
- 每次替换新版本请删除再替换
Packages/com.seayoo.omnisdk
. - 不要主动删除 OmniSDK 所包含的 meta 文件.
获取 SDK 版本
请从 版本更新说明 下载 SDK 的最新版本。
下载并解压后,将 com.seayoo.omnisdk
文件夹拷贝到 Unity 项目的 Packages
目录下
Android
Setup
- Unity 2018
- Unity 2019 or later
利用 Unity 自带的 Android 项目构建机制, 在 Assets/Plugins/Android/
可以添加模版文件,最终会自动合并到工程内。
Unity Plugin 模板文件 | Android 工程目标文件 |
---|---|
AndroidManifest.xml | AndroidManifest.xml |
mainTemplate.gradle | build.gradle |
gradleTemplate.properties | gradle.properties |
- 下方文件的
highlight
为 OmniSDK 添加的差异化内容,也可自行拷贝至自定义的模版
AndroidManifest.xml
这段代码按照 Android 接入文档 的指南进行了以下配置:
application
的android:name
属性值被设为com.kingsoft.shiyou.omnisdk.api.OmniApplication
。activity
的android:name
属性值被设为com.seayoo.sdk.OmniSDKMainActivity
。这是 Unity SDK 默认提供的 Activity。如需进行改动,请参见 Android GameActivity 接入 获取详细信息。
为了适应 Android 12 的新需求,我们进行了以下设定:
activity
的android:exported
的值必须明确设为true
或false
。这是为了适配 Android 12(目标API等级为31或更高)的新规定,其中要求android:exported
必须被明确声明。有关此变更的更多信息,请查阅 Android 开发文档。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.seayoo.omnisdkunity" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<application android:name="com.kingsoft.shiyou.omnisdk.api.OmniApplication" android:theme="@style/UnityThemeSelector" android:icon="@mipmap/app_icon" android:label="@string/app_name">
<activity android:label="@string/app_name" android:screenOrientation="reverseLandscape" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="false" android:name="com.seayoo.sdk.OmniSDKMainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<meta-data android:name="unity.build-id" android:value="29ff3e62-55a3-445e-a6c9-e2a318be78a1" />
<meta-data android:name="unity.splash-mode" android:value="0" />
<meta-data android:name="unity.splash-enable" android:value="True" />
</application>
<uses-feature android:glEsVersion="0x00020000" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>
gradleTemplate.properties
根据 Android 集成文档 的要求,开启了 AndroidX
和 enableJetifier
配置。
org.gradle.jvmargs=-Xmx4096M
android.useAndroidX=true
android.enableJetifier=true
mainTemplate.gradle
mainTemplate.gradle 可以通过 File -> Build Settings -> Player Settings -> Publishing Settings -> Build -> Custom Gradle Template
生成
依据 Android 集成文档 配置了 OmniSDK 的 Gradle 依赖,如需修改 build.gradle
请仔细阅读 Android 集成文档。
Android Gradle 插件(com.android.tools.build:gradle
)版本请依据 Android Gradle 插件版本说明 进行配置。
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {**ARTIFACTORYREPOSITORY**
mavenCentral()
google()
jcenter()
apply from: ("${rootProject.rootDir}/kssyOmniBuildscriptRepositories.gradle")
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
apply from: ("${rootProject.rootDir}/kssyOmniBuildscriptDependencies.gradle")
**BUILD_SCRIPT_DEPS**}
}
allprojects {
repositories {**ARTIFACTORYREPOSITORY**
mavenCentral()
google()
jcenter()
flatDir {
dirs 'libs'
}
}
}
apply from: ("${rootProject.rootDir}/kssyOmniChannelsRoot.gradle")
apply plugin: 'com.android.application'
**APPLY_PLUGINS**
apply from: ("${rootProject.rootDir}/kssyOmniPlugin.gradle")
apply from: ("${rootProject.rootDir}/kssyOmniChannelsApp.gradle")
apply from: ("${rootProject.rootDir}/kssyOmniChannels.gradle")
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
applicationId '**APPLICATIONID**'
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**]
}**SIGN**
buildTypes {
debug {
minifyEnabled **MINIFY_DEBUG**
useProguard **PROGUARD_DEBUG**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
jniDebuggable true
}
release {
minifyEnabled **MINIFY_RELEASE**
useProguard **PROGUARD_RELEASE**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD****SIGNCONFIG**
}
}**PACKAGING_OPTIONS****SPLITS**
**BUILT_APK_LOCATION**
bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = true
}
}
}**SPLITS_VERSION_CODE****REPOSITORIES****SOURCE_BUILD_SETUP**
利用 Unity 自带的 Android 项目构建机制 ,你可以在 Assets/Plugins/Android/
手动添加相应的模板文件。此外,你也可以通过 Player Settings -> Publishing Settings 的 Build 选项来勾选相应的模板,这将自动在 Assets/Plugins/Android/
目录下生成对应的模板文件。
这些模板会在 Unity 构建完成后自动合并到项目中。当你需要接入 OmniSDK 时,需要对下列模板进行一些配置:
Unity Plugin 模板文件 | Android 工程目标文件 |
---|---|
baseProjectTemplate.gradle | /build.gradle |
gradleTemplate.properties | /gradle.properties |
LauncherManifest.xml | /launcher/AndroidManifest.xml |
launcherTemplate.gradle | /launcher/build.gradle |
AndroidManifest.xml | /unityLibrary/AndroidManifest.xml |
mainTemplate.gradle | /unityLibrary/build.gradle |
- 下方文件的
highlight
为 OmniSDK 添加的差异化内容,也可自行拷贝至自定义的模版
baseProjectTemplate.gradle
依据 Android 集成文档 配置了 OmniSDK 的 Gradle 依赖,如需修改 /build.gradle
请仔细阅读 Android 集成文档。
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
allprojects {
buildscript {
repositories {**ARTIFACTORYREPOSITORY**
google()
jcenter()
apply from: ("${rootProject.rootDir}/kssyOmniBuildscriptRepositories.gradle")
}
dependencies {
// If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
// See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
// See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
classpath 'com.android.tools.build:gradle:4.2.2'
apply from: ("${rootProject.rootDir}/kssyOmniBuildscriptDependencies.gradle")
**BUILD_SCRIPT_DEPS**
}
}
repositories {**ARTIFACTORYREPOSITORY**
google()
jcenter()
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply from: ("${rootProject.rootDir}/kssyOmniChannelsRoot.gradle")
gradleTemplate.properties
根据 Android 集成文档 的要求,开启了 AndroidX
和 enableJetifier
配置。
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
android.enableR8=**MINIFY_WITH_R_EIGHT**
unityStreamingAssets=.unity3d**STREAMING_ASSETS**
android.useAndroidX=true
android.enableJetifier=true
**ADDITIONAL_PROPERTIES**
LauncherManifest.xml
这段代码按照 Android 接入文档 的指南进行了以下配置:
application
的android:name
属性值被设为com.kingsoft.shiyou.omnisdk.api.OmniApplication
。activity
的android:name
属性值被设为com.seayoo.sdk.OmniSDKMainActivity
。这是 Unity SDK 默认提供的 Activity。如需进行改动,请参见 Android GameActivity 接入 获取详细信息。
为了适应 Android 12 的新需求,我们进行了以下设定:
activity
的android:exported
的值必须明确设为true
或false
。这是为了适配 Android 12(目标API等级为31或更高)的新规定,其中要求android:exported
必须被明确声明。有关此变更的更多信息,请查阅 Android 开发文档。
在 Unity 默认生成的 LauncherManifest.xml
模板文件中,原本并没有 application
和 activity
的定义。然而,目前的 KSSYOmniSDKTools 不支持在 Library 中引入 kssyOmniChannels.gradle
,这就导致了我们无法在 unityLibrary 中使用任何 OmniSDK 的API。因此,为了解决这个问题,我们将 application
和 activity
的定义移至了 LauncherManifest.xml
文件中。
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="preferExternal">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<application android:name="com.kingsoft.shiyou.omnisdk.api.OmniApplication"
android:extractNativeLibs="true"
android:label="@string/app_name"
android:icon="@mipmap/app_icon"
android:allowBackup="true"
tools:replace="android:allowBackup">
<activity android:name="com.seayoo.sdk.OmniSDKMainActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="reverseLandscape" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:resizeableActivity="false" android:hardwareAccelerated="false" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.notch_support" android:value="true" />
</activity>
</application>
</manifest>
launcherTemplate.gradle
依据 Android 集成文档 配置了 OmniSDK 的 Gradle 依赖,如需修改 /launcher/build.gradle
请仔细阅读 Android 集成文档。
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
apply plugin: 'com.android.application'
apply from: ("${rootProject.rootDir}/kssyOmniPlugin.gradle")
apply from: ("${rootProject.rootDir}/kssyOmniChannelsApp.gradle")
apply from: ("${rootProject.rootDir}/kssyOmniChannels.gradle")
dependencies {
implementation project(':unityLibrary')
}
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
applicationId '**APPLICATIONID**'
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
}
aaptOptions {
noCompress = ['.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
}**SIGN**
lintOptions {
abortOnError false
}
buildTypes {
debug {
minifyEnabled **MINIFY_DEBUG**
proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**
jniDebuggable true
}
release {
minifyEnabled **MINIFY_RELEASE**
proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**
}
}**PACKAGING_OPTIONS****PLAY_ASSET_PACKS****SPLITS**
**BUILT_APK_LOCATION**
bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = true
}
}
}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP**
AndroidManifest.xml
在 Unity 默认生成的 AndroidManifest.xml
模板文件中,是包含了 activity
的定义的。但由于现阶段 KSSYOmniSDKTools 的相关问题,我们需要删除或注释此处原本定义的 activity
。
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<!--<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>-->
</application>
</manifest>
mainTemplate.gradle
需要将 dependencies
中 fileTree(dir: 'libs', include: ['*.jar'])
属性改为 api
,否则在 launcher 中引用 unityLibrary 时会导致编译失败。
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
apply plugin: 'com.android.library'
**APPLY_PLUGINS**
dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress = ['.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
}**PACKAGING_OPTIONS**
}**REPOSITORIES**
**IL_CPP_BUILD_SETUP**
**SOURCE_BUILD_SETUP**
**EXTERNAL_SOURCES**
Unity Player Settings
Other Settings
Mininum API Level
,确保 API level 设置为 21 或以上版本(OmniSDK 最低兼容 Android 版本为 Android 5.0)。Scripting Backend
,选择IL2CPP
。Target Architectures
,勾选ARM64
,同时取消勾选ARMv7
。
Unity 2018 已知问题
当导出 Android 项目的 Target API Level 为 31 或以上时,Unity 2018 可能会在 Android 12 上出现启动后黑屏或卡死的问题。这是由于 Android 12 中已废弃了 TelephonyManager
的 listen
函数。如果应用程序未获得 READ_PHONE_STATE
权限,此函数将抛出 SecurityException
。
在 Unity 启动时,如果已启用内置的音频系统,将调用 TelephonyManager.listen()
以在用户接电话时静音游戏。这可能导致抛出异常,导致游戏启动黑屏或卡死。
解决方案: 在 PlayerSettings -> OtherSettings 中,勾选 "Mute Other Audio Sources" 选项。
更多详细信息请参考 Unity 论坛相关讨论。
Build
Step 1. 在 Android Studio 中 安装 KSSYOmniSDKTools 插件,如已安装可跳过。
Step 2. 更新发布计划,请仔细阅读 发布计划配置说明。
Step 3. 点击 Gradle Sync 进行同步。
Step 4. 通过 KSSYOmniSDKTools -> ChannelTree 面板进行编译出包,详见 KSSYOmniSDKTools 工具集 UI。
更多内容请参阅 Android 构建与出包文档。
iOS
Setup
- Unity 2018
- Unity 2019 or later
构建 iOS 工程
OmniSDK 已通过 Unity 构建后处理机制对导出的 Xcode 工程作如下配置:
- Runpath Search Paths 配置
- 嵌入 Swift 标准库
此配置是为防止当 iOS Deployment Target < 12.2 时,启动时崩溃。
- 关闭 Bitcode
SDK 初始化参数
将导出的 iOS 工程通过 Xcode 打开,在 Info.plist 文件中配置 SDK 初始化参数。
集成 XCFrameworks 组件
在工程中拖入所需 XCFrameworks 文件夹,拖入时 Xcode 会弹出如下图选项框,请按照下图在选项框中勾选:
嵌入动态库
不配置此项,会导致游戏客户端在启动时因为缺少动态库而 crash
在 Target Unity-iPhone 中,嵌入所需组件对应的动态库(把选项 Do Not Embed
改为 Embed & Sign
)
构建 iOS 工程
OmniSDK 已通过 Unity 构建后处理机制对导出的 Xcode 工程作如下配置:
- Runpath Search Paths 配置
- 嵌入 Swift 标准库
此配置是为防止当 iOS Deployment Target < 12.2 时,启动时崩溃。
- 关闭 Bitcode
- 链接配置
SDK 初始化参数
将导出的 iOS 工程通过 Xcode 打开,在 Info.plist 文件中配置 SDK 初始化参数。
集成 XCFrameworks 组件
将导出的 iOS 工程通过 Xcode 打开,在工程中拖入所需 XCFrameworks 文件夹,拖入时 Xcode 会弹出如下图选项框,请按照下图在选项框中勾选:
嵌入动态库
不配置此项,会导致游戏客户端在启动时因为缺少动态库而 crash
在 Target Unity-iPhone 中,嵌入所需组件对应的动态库(把选项 Do Not Embed
改为 Embed & Sign
)
Windows
Setup
创建 OmniSDK Settings
导入 OmniSDK Package 后,选择菜单项 OmniSDK -> Assets -> Create Settings
配置 OmniSDK Settings
Property | Type | Required | Description |
---|---|---|---|
AppId | String | True | 应用 ID OmniSDK 为每个应用配置的独立的 ID |
AppKey | String | True | 应用客户端密钥 OmniSDK 为每个应用配置的独立的 Client Key |
PlanId | String | True | 发布计划 ID 主要为获取不同的渠道参数,由 OmniSDK 提供 |
ServerUrl | String | True | OmniSDK 服务端 Url 默认已经提供,不需要修改 |