一、为插件设置平台的方法

  unity5之前,是通过把插件搞到对应目录进行区分平台的(比如在build target是ios平台时只把IOS目录的插件build进去),unity5之后提供了设置平台/cpu架构的方式,插件位置就随意了;
  在unity5中点击插件文件,那些后缀为dll,so,jar,cpp,a,mm等文件和后缀是“ .plugin, .bundle and .framework”的文件夹,会被识别为plusins,其inspector可设置平台等。

二、不同平台使用插件的方式
  A.嵌入外部或本地插件(前者包括dll,so,bundle等库的形式,后者包括h,cpp,m,jar等源码的形式):
  B.为不同平台写插件时的方案:
    共同点:写插件时,如果插件是用c++/oc实现,需要用解决名称重整问题:
      extern "C" { float FooPluginFunction ();}
    不同点:
      1.如果是给desktop平台使用,则需要把源码分别在macos,window,linux下编译生成.bundle(通过xcode建立),dll,.so文件,然后分别设置平台,c#声明后即可使用
      2.如果是给IOS平台使用,有2种方式:
        1)(lib)把源码在xcode下编译成.a文件,然后设置平台,c#声明后即可使用
        2)(源码)unity切成ios平台后会在项目内生成xcode项目,我们可以在其Classes文件夹放入源码,c#声明后即可使用,这里有几个tip需要记录:
          a.源码向unity发送信息:UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
          b.unity的脚本函数必须是void MethodName(message:string) 格式,且此方法异步且有一帧延迟
          c.从unity调用源码接口通过c#声明的入口调用,属于托管到非托管,故比较耗;
          d.从一个本地方法返回的字符串值应该是UTF-8编码的,并且分配在堆上。Mono marshaling calls are free for strings like this.
          e.一般源码放在unity生成的xcode项目的classes目录,但也可以在Asset或其子目录存放,然后在xcode那里引用之。
          f.此嵌入方法估计用来做sdk交互。
      3.如果给Android平台使用,也有2种方式:
        1)(lib,必须是c/c++才能使用)把源码在ndk下编译成.so文件,设置平台,c#声明后即可使用
        2)以aar,android lib,jar方式(第一种所有文件都在.aar文件里,后2种包括.jar,res,Manifest等多个文件)存源码。通过下面方法和java交互:
          a.在unity中用AndroidJavaClass和AndroidJavaObject来向java发送消息
          b.java那边需要,
            I.首先找到Unity Android附带的classes.jar(Unity\Editor\Data\PlaybackEngines\AndroidPlayer\bin);
            II.基于classes.jar编写我们自己的java代码,即添加classes.jar到类路径用于编译我们自定义的activity;
            (classes.jar里面有java和unity交互的底层实现,比如com.unity3d.player.UnityPlayerActivity的实现,我们自定义的activity需要继承它才能接受unity的消息)
            III.由此产生的.class文件应该被压缩到一个.jar文件中和并放置在Assets->Plugins->Android文件夹;
            IV.建立一个新的AndroidManifest.xml,决定要启动哪个活动,申请权限等。AndroidManifest.xml文件也放置在Assets->Plugins->Android文件夹。
  C.总结:
    1.一个插件要给某个平台使用需要特别给该平台产生编译文件。
    2.如果某个插件只是给个别平台使用,需要在c#调用插件接口时判断一下平台是否对应,避免白白消耗。
    if (Application.platform == RuntimePlatform.IPhonePlayer)
    3.对android,sdk一般是java写的,所以一般用第二种方式,对ios,可以用Lib方式,也可以用源码方式。
  D.不同平台嵌入lib插件格式:
  IOS:
  [DllImport ("__Internal")]
  private static extern float FooPluginFunction ();
  Android/standalone:
  [DllImport ("PluginName")]
  private static extern float FooPluginFunction ();
三、总结:以上只是讨论了插件在在unity中的相关问题,没有涉及插件原数据本身如何创建,这个就需要各个平台专攻了,这里不能探索。

Unity Plugins的使用方法的更多相关文章

  1. UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr!

    UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr! 原因是····· 得运行在一个真正的Android设备上! 得运行在一个真正的And ...

  2. unity调用c++ dll方法介绍

    摘要 unity用的很普遍,现在很多代码还是用c++写的,需要用unity去调用c++的代码.这里介绍了一种unity调用c++ dll的方法,希望有所帮助. 我采用的软件是Visual Studio ...

  3. Unity接SDK通用方法总结

    第一篇博客,回顾接UnitySDK的坑 接SDK主要有两种方式,第三方SDK和手动接(我用的android studio) 首先接触到的SDK就是Facebook-Unity的SDK,主要就是face ...

  4. 修改Unity脚本模板的方法合计

    作为一个习惯于偷懒的程序,重复性的无聊内容是最让人无奈的事,就比如我们创建Unity脚本之后,需要手动调整生成的新脚本的格式.编码.内容:如果我们要编写的是编辑器或者服务器端脚本,需要修改的内容就会更 ...

  5. Unity+NGUI性能优化方法总结

    1 资源分离打包与加载 游戏中会有很多地方使用同一份资源.比如,有些界面会共用同一份字体.同一张图集,有些场景会共用同一张贴图,有些会怪物使用同一个Animator,等等.可以在制作游戏安装包时将这些 ...

  6. Unity中自定义扩展方法

    问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...

  7. unity中的main方法

    由于方法命名的原因,无意之间把一个方法命名为了Main,然后把这个方放到了Start方法中去执行,结果运行后发现这个方法竟然执行了两次 情况如下图: -------------- 检查代码,发现脚本并 ...

  8. Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)

    简述 最近在用UGUI的时候遇到了鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件.比如下图中 这里给Cube加了一个鼠标点击改变颜色的代码,如下 ...

  9. Unity 调用 Android Native 方法(一) 获得Android系统音量

    学习雷锋,好榜样,接下来的这一系类教程里,将通过unity来实现Android端的一些常用功能, 不需要在 Asset/Plugins/Android 目录下引用jar包或者aar包,这是重点. us ...

随机推荐

  1. Oracle连接池工具类OJDBCUtils

    Oraclejdbc.properties driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@127.0.0. ...

  2. PEP8之常用编码规范-摘自官网

    PEP8是广泛应用于Python编码中的规范,这里只会记录最重要的一部分:摘自官网 使用4个空格缩进,不要使用制表符. 4个空格是一个在小缩进(允许更大的嵌套深度)和大缩进(更容易阅读)的一种很好的折 ...

  3. Python库大全,建议收藏留用!

    学Python,想必大家都是从爬虫开始的吧.毕竟网上类似的资源很丰富,开源项目也非常多. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. ...

  4. CRF

  5. 如何有效防止sql注入

    SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没 ...

  6. C# winform 弹出窗体给父窗体传值

    Winform程序有很多传值的方法,抱着学习的态度.利用委托注册事件的方法,给窗体统一添加事件: 首先定义一个Frm_Base: namespace 任意 { public partial class ...

  7. C#LeetCode刷题之#824-山羊拉丁文​​​​​​​(Goat Latin)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3971 访问. 给定一个由空格分割单词的句子 S.每个单词只包含大 ...

  8. Centos系统安装Python3.7

    服务器安装Python3.7,实测可用 原博客地址 首先要先安装依赖包: yum install zlib-devel bzip2-devel openssl-devel ncurses-devel ...

  9. 总结关于Ubuntu 安装 Docker 配置相关问题及解决方法

    总结关于Ubuntu 安装 Docker 配置相关问题及解决方法 Tomcat 示例 软件镜像(xx安装程序)----运行镜像----产生一个容器(正在运行的软件,运行的xx): 步骤: 1.搜索镜像 ...

  10. ajax、反向ajax、jsonp详解

    ajax详解 什么是ajax 其实ajax已经属于老技术了,现在几乎没人不会用了,在这里主要是把底层的东西给大家分享一下,以备应对装逼的面试官. ajax即“Asynchronous Javascri ...