Unity插件分为两种:托管插件(Managed Plugins)和本地插件(Native Plugins)。本文先来说说Unity中的托管插件,本地插件的文章留到下一篇文章再说。

有时候我们会有这样的需求:给第三方公司提供Unity插件,而又不希望第三方看到具体代码,这时就可以将核心代码编译成dll文件供第三方调用。或者说,同一个公司多个项目都用到某个模块,则可以把该模块封装成dll,方便在不同项目之间共用和维护。

关于dll加密的问题,以后有机会了可以考虑写点东西分享出来。

一、创建DLL


打开VS,选择文件 -> 新建 -> 项目后打开新建项目对话框。接着操作如下:

点击确定后,编写如下代码:

using System;

namespace MyLib
{
public class MyClass
{
public static string GetBlogName()
{
return "Sheh伟伟的简书";
} public static TimeSpan GetBlogTime(DateTime time)
{
return (time - DateTime.Parse("2016/11/14"));
}
}
}

然后生成dll文件,操作如下图:

提示:也可以用MonoDeveloper创建并生成dll,至于操作步骤可以查看官网手册

二、导入DLL


将MyLib项目目录下的bin/Debug目录下的MyLib.dll文件拷贝到Unity项目的Plugins目录下。这时,Unity控制台报Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded的错误,报错详细信息如下:

这是因为我用的Unity版本是5.3.4f1,支持的.NET Framework的版本为3.5。而我创建的MyLib项目的默认.NET Framework 3.5版本为4.5.2。

选择项目,然后右键选择属性 -> 应用程序,将目标框架改为 .NET Framework 3.5或以下 ,如下图:



接着重新生成一下dll文件,重新导入到Unity就行了。

三、调用DLL


在Unity新建一个TestDll的脚本,并挂到主摄像机上,脚本代码如下:

using UnityEngine;
using System;
using MyLib; // 导入dll public class TestDll : MonoBehaviour { private string blogUrl = "http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles";
void Start ()
{
string myBlog = string.Format("{0}:{1}", MyClass.GetBlogName(), blogUrl);
Debug.Log(myBlog); TimeSpan span = MyClass.GetBlogTime(DateTime.Now);
Debug.Log("写这篇博客到现在的时间间隔:" + span.TotalDays);
}
}

注意,调用Dll中的方法一定要使用using语句引入导入到unity中的dll类库。

四、导入Unity DLL


怎么导入Unity原生类库呢?别急,接下来就说说怎么在自定义的dll类库中调用Unity中的类。

首先选中项目,接着右键选择添加 -> 引用后,弹出引用管理器,如下图:

在应用管理器界面点击浏览按钮,找到UnityEngine.dll文件点击确认按钮导入,如下图所示:

Unity类库在Mac上的路径为Applications/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll;在Windows上的路径为Program Files\Unity\Editor\Data\Managed\UnityEngine.dll

接着,将项目中无用的类库都移除掉,只保留用到的System和UnityEngine两个类库,如下图:

然后,修改MyClass脚本,代码如下:

using System;
using UnityEngine; namespace MyLib
{
public class MyClass
{
public static string GetBlogName()
{
return "Sheh伟伟的简书";
} public static TimeSpan GetBlogTime(DateTime time)
{
return (time - DateTime.Parse("2016/11/13"));
} public static void CreateCube()
{
GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
int random = UnityEngine.Random.Range(-5, 5);
go.transform.position = new Vector3(random, random, 0);
}
}
}

代码编写完成后,重新生成一下dll,然后导入到Unity中,接着修改Unity脚本TesDll,具体代码如下:

using UnityEngine;
using System;
using MyLib; public class TestDll : MonoBehaviour { private string blogUrl = "http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles";
string myBlog;
double time; void Start ()
{
myBlog = string.Format("{0}:{1}", MyClass.GetBlogName(), blogUrl);
Debug.Log(myBlog); TimeSpan span = MyClass.GetBlogTime(DateTime.Now);
time = span.TotalDays;
Debug.Log("写这篇博客到现在的时间间隔:" + time);
} void OnGUI()
{
GUILayout.Label(myBlog);
GUILayout.Label(time.ToString()); if(GUILayout.Button("Create Cube"))
{
MyClass.CreateCube();
}
}
}

运行后的效果图如下:

源代码放在了群共享中,想要源码的可以加群:253999688

四、参考资料


Managed Plugins


如果本文有错误之处还请帮忙指出。本文欢迎转载,但转载请注明出处:http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles

Unity插件之Unity调用C#编译的DLL的更多相关文章

  1. 我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中:

    我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中: C/C++ code   ? 1 int retrieve(int scanno,void* buf); 在 ...

  2. C#调用C++编译的DLL--

    引用 C#调用C++编译的DLL详解 可以单步跟踪进入dll的源码!每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认 ...

  3. [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究

    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...

  4. Unity3D游戏开发之Unity与Android交互调用研究

    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...

  5. Unity 与 Android 互调用

    https://www.jianshu.com/p/b5e3cfcdf081 Unity 项目中一些需要访问安卓操作系统的功能,比如获取电量,wifi 状态等,需要 Unity 启动安卓系统的 Bro ...

  6. Unity通过Jar包调用Android

    Unity通过Jar包调用Android 我们会需要面对下面几个问题,我们一个一个来解决: 怎样在Android Studio中打Jar包 怎样打一个Unity使用的Jar包 怎样在Unity工程中使 ...

  7. Unity Application 前后台切换调用关系

    [Unity Application 前后台切换调用关系] http://blog.csdn.net/aa4790139/article/details/48087877

  8. Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸

    依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小:然后在UI Root下再创建一个Panel. ...

  9. Unity中的Mono & Linux上编译Mono的流程

    前段时间编译了一下Unity的Mono,看了很多相关的文章,也遇到很多新坑.所以来总结一下,加深自己对Mono的理解 为什么Unity可以跨平台运行呢 通常Unity的脚本有C#.JS.Boo.不过现 ...

随机推荐

  1. AngularJS实例实战

    学习了这么多天的AngularJS,今天想从实战的角度和大家分享一个简单的Demo--用户查询系统,以巩固之前所学知识.功能需求需要满足两点 1.查询所有用户信息,并在前端展示 2.根据id查询用户信 ...

  2. Spark笔记:复杂RDD的API的理解(下)

    本篇接着谈谈那些稍微复杂的API. 1)   flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...

  3. Mina、Netty、Twisted一起学(八):HTTP服务器

    HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...

  4. 计算机程序的思维逻辑 (51) - 剖析EnumSet

    上节介绍了EnumMap,本节介绍同样针对枚举类型的Set接口的实现类EnumSet.与EnumMap类似,之所以会有一个专门的针对枚举类型的实现类,主要是因为它可以非常高效的实现Set接口. 之前介 ...

  5. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  6. CentOS7下mysql5.6修改默认编码

    参考原文教程:Centos7下修改mysql5.6编码方式 解决网站中文显示问号 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操 ...

  7. EF Code First学习系列

    EF Model First在实际工作中基本用不到,前段时间学了一下,大概的了解一下.现在开始学习Code First这种方式.这也是在实际工作中用到最多的方式. 下面先给出一些目录: 1.什么是Co ...

  8. asp.net core 1.1 升级后,操作mysql出错的解决办法。

    遇到问题 core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新.插入操作没有问题. 如果你也遇到这个问题,请参照以下步骤进行升 ...

  9. 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(四)

    (四)搭建Website Cloud环境 1安装CONTROLLER主机 在开始安装Web site Cloud之前,读者应该对该服务的拓扑结构有个大概了解. 如图: Controller是非常重要的 ...

  10. input输入

    只能输入数字onkeyup='this.value=this.value.replace(/\D/gi,"")'限制文本框只能输入正数,小数onkeyup="value= ...