当前位置:   article > 正文

Unity 构建IOS和ANDROID工程 (一)_unity 熟悉android,ios开发环境

unity 熟悉android,ios开发环境

引言:

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

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

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

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

三、打包构建脚本的编写


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

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

1、为什么使用库工程?

Unity工程最终是要输出平台包,所以构建系统一定要保证适用于所有Unity产品,创建库工程可以使Unity内容与平台相关原生内容完全分开,所有的产品共同依赖这些库工程(库工程单独放置在一个版本库中),这样一些第三方库或通用方法的更新只需要做一遍,对于数量比较多的项目群,这是一个必须的方法!

2、为什么不使用第三方平台插件?

作为有一定规模的项目开发经验的开发人员,我不推荐任何第三方的Unity版本插件(尤其是非第三方官方的插件),原因很简单,第三方的SDK是持续更新的,Unity也是,多一层封装,多一份兼容性的风险,还不如直接使用原生SDK,更加灵活,更加稳定。

3、构建脚本编写

这部分内容后面会持续更新,现在还没有比较完善的构建流,因为要考虑不同平台中的不同渠道,甚至是不同版本的种种情况!

下面开始一步步的整理这套构建框架,先看第一步:平台接口部分的框架设计

这部分网上估计都烂了,无非是C#如何调用和回调Object-C和java,这部分就不过多介绍,直接上代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System.Runtime.InteropServices;
  5. using System;
  6. /// <summary>
  7. /// 平台入口,调用ios和android方法
  8. /// </summary>
  9. public class PlatformUtil {
  10. /// <summary>
  11. /// instance
  12. /// </summary>
  13. static PlatformUtil instance;
  14. public static PlatformUtil getInstance(){
  15. if(instance == null){
  16. instance = new PlatformUtil();
  17. }
  18. return instance;
  19. }
  20. #if UNITY_IOS
  21. [DllImport("__Internal")]
  22. ///注册ios入口方法
  23. static extern string callIOSPlatformFunction(string functionName,string jsonContent);
  24. #endif
  25. public string callPlatformFunction(string functionName,string jsonContent){
  26. string value = "";
  27. #if UNITY_EDITOR
  28. #elif UNITY_ANDROID
  29. ///java 接口路径
  30. string JAVA_CLASS = "com.biemore.myDemo";
  31. string UNITY_CLASS = "com.biemore.myDemo.UnityPlayerNativeActivity";
  32. AndroidJavaClass unityClass = new AndroidJavaClass(UNITY_CLASS);
  33. value = unityClass.CallStatic<string>(functionName,jsonContent);
  34. #elif UNITY_IOS
  35. value = callIOSPlatformFunction(functionName,jsonContent);
  36. #endif
  37. return value;
  38. }
  39. }
这个文件就是平台入口,游戏中所有调用平台方法的地方都必须经过这个唯一入口(防止多次重写JNI等桥接代码),平台方法的参数使用json格式,兼容所有平台方法!

写好调用平台的入口之后,ios部分需要再定义一个mm文件用来调用库工程的Oc方法(android不需要,平台方法直接进入库工程的android接口中),这个mm文件路径必须放在Unity工程目录/Library/Plugins/IOS/ ,代码如下:

  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. const char* PlatformUtil::callIOSPlatformFunction(const char* functionName,const char* jsonContent){
  5. if (0 == strcmp(functionName,"PlatformFunc_A")){
  6. return [Lib_IOS_ProjInstance PlatformFunc_A];
  7. }else if ...
其中Lib_IOS_ProjInstance是库工程的实例

android方面:

方法写在库工程中:

  1. public class Platform_android {
  2. public static SGBaseActivity mContext;
  3. /**
  4. * C++调用java通用接口
  5. * @param functionName 方法名
  6. * @param jsonContent json参数
  7. * @return
  8. */
  9. public static String callPlatformFunction(String functionName,String jsonContent){
  10. Log.d("=====================", functionName);
  11. if(functionName.equals("openSinaWeibo")){//打开新浪微博
  12. mContext.openSinaWeibo();
  13. }

Oc和Java的回调略,网上很多,只要注意回调的入口和上面一样保证接口唯一性。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/119146
推荐阅读
相关标签
  

闽ICP备14008679号