赞
踩
引言:
开发中为了统一管理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的回调略,网上很多,只要注意回调的入口和上面一样保证接口唯一性。
这部分内容暂时先介绍到这,后面更新库工程的制作方法!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。