引言:

开发中为了统一管理Unity产品,需要设计一个比较完善的平台构建系统,这里我尽量简单的分享下我的思路(正在实践中...),并把涉及到的重要内容拣出来介绍下,希望能帮助其他开发者解决平台移植方面的困惑!文章内容适合有平台开发经验的Unity产品开发者,做着玩的不需要看下面的内容!

之前做cocos游戏,构建平台工程包的设计理念可以借鉴到Unity中,总共三个部分

一、平台接口部分框架搭建

二、库工程的创建(ios库工程/android库工程)

三、打包构建脚本的编写


总体项目结构图大概如下:

unity ios上传商店 unity发布ios_Unity移植IOS

简单解释下工程结构的设计原因

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的回调略,网上很多,只要注意回调的入口和上面一样保证接口唯一性。

这部分内容暂时先介绍到这,后面更新库工程的制作方法!