• Unity Plugins的使用方法


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

      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(UnityEditorDataPlaybackEnginesAndroidPlayerin);
                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中的相关问题,没有涉及插件原数据本身如何创建,这个就需要各个平台专攻了,这里不能探索。

  • 相关阅读:
    OpenCV人脸检测
    和机器学习和计算机视觉相关的数学(转载)
    操作系统课程设计 消息缓冲队列通信
    操作系统课程设计 线程的同步与互斥
    嵌入式考试Shell编程题
    Bash基础知识
    开始学习Shell/bash 加减乘运算
    RT-Thread Mini2440串口驱动
    Mini2440裸机RTC时钟驱动转化为字符串显示
    Mini2440裸机液晶屏TD35驱动
  • 原文地址:https://www.cnblogs.com/Tearix/p/7802251.html
Copyright © 2020-2023  润新知