引言:
开发中为了统一管理Unity产品,需要设计一个比较完善的平台构建系统,这里我尽量简单的分享下我的思路(正在实践中...),并把涉及到的重要内容拣出来介绍下,希望能帮助其他开发者解决平台移植方面的困惑!文章内容适合有平台开发经验的Unity产品开发者,做着玩的不需要看下面的内容!
之前做cocos游戏,构建平台工程包的设计理念可以借鉴到Unity中,总共三个部分
一、平台接口部分框架搭建
二、库工程的创建(ios库工程/android库工程)
三、打包构建脚本的编写
总体项目结构图大概如下:
简单解释下工程结构的设计原因
1、为什么使用库工程?
Unity工程最终是要输出平台包,所以构建系统一定要保证适用于所有Unity产品,创建库工程可以使Unity内容与平台相关原生内容完全分开,所有的产品共同依赖这些库工程(库工程单独放置在一个版本库中),这样一些第三方库或通用方法的更新只需要做一遍,对于数量比较多的项目群,这是一个必须的方法!
2、为什么不使用第三方平台插件?
作为有一定规模的项目开发经验的开发人员,我不推荐任何第三方的Unity版本插件(尤其是非第三方官方的插件),原因很简单,第三方的SDK是持续更新的,Unity也是,多一层封装,多一份兼容性的风险,还不如直接使用原生SDK,更加灵活,更加稳定。
3、构建脚本编写
这部分内容后面会持续更新,现在还没有比较完善的构建流,因为要考虑不同平台中的不同渠道,甚至是不同版本的种种情况!
下面开始一步步的整理这套构建框架,先看第一步:平台接口部分的框架设计
这部分网上估计都烂了,无非是C#如何调用和回调Object-C和java,这部分就不过多介绍,直接上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using System;
/// <summary>
/// 平台入口,调用ios和android方法
/// </summary>
public class PlatformUtil {
/// <summary>
/// instance
/// </summary>
static PlatformUtil instance;
public static PlatformUtil getInstance(){
if(instance == null){
instance = new PlatformUtil();
}
return instance;
}
#if UNITY_IOS
[DllImport("__Internal")]
///注册ios入口方法
static extern string callIOSPlatformFunction(string functionName,string jsonContent);
#endif
public string callPlatformFunction(string functionName,string jsonContent){
string value = "";
#if UNITY_EDITOR
#elif UNITY_ANDROID
///java 接口路径
string JAVA_CLASS = "com.biemore.myDemo";
string UNITY_CLASS = "com.biemore.myDemo.UnityPlayerNativeActivity";
AndroidJavaClass unityClass = new AndroidJavaClass(UNITY_CLASS);
value = unityClass.CallStatic<string>(functionName,jsonContent);
#elif UNITY_IOS
value = callIOSPlatformFunction(functionName,jsonContent);
#endif
return value;
}
}
这个文件就是平台入口,游戏中所有调用平台方法的地方都必须经过这个唯一入口(防止多次重写JNI等桥接代码),平台方法的参数使用json格式,兼容所有平台方法!
写好调用平台的入口之后,ios部分需要再定义一个mm文件用来调用库工程的Oc方法(android不需要,平台方法直接进入库工程的android接口中),这个mm文件路径必须放在Unity工程目录/Library/Plugins/IOS/ ,代码如下:
#ifdef __cplusplus
extern "C" {
#endif
const char* PlatformUtil::callIOSPlatformFunction(const char* functionName,const char* jsonContent){
if (0 == strcmp(functionName,"PlatformFunc_A")){
return [Lib_IOS_ProjInstance PlatformFunc_A];
}else if ...
其中Lib_IOS_ProjInstance是库工程的实例
android方面:
方法写在库工程中:
public class Platform_android {
public static SGBaseActivity mContext;
/**
* C++调用java通用接口
* @param functionName 方法名
* @param jsonContent json参数
* @return
*/
public static String callPlatformFunction(String functionName,String jsonContent){
Log.d("=====================", functionName);
if(functionName.equals("openSinaWeibo")){//打开新浪微博
mContext.openSinaWeibo();
}
Oc和Java的回调略,网上很多,只要注意回调的入口和上面一样保证接口唯一性。
这部分内容暂时先介绍到这,后面更新库工程的制作方法!