Unity插件之Unity调用C#编译的DLL
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
四、参考资料
如果本文有错误之处还请帮忙指出。本文欢迎转载,但转载请注明出处:http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles
Unity插件之Unity调用C#编译的DLL的更多相关文章
- 我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中:
我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中: C/C++ code ? 1 int retrieve(int scanno,void* buf); 在 ...
- C#调用C++编译的DLL--
引用 C#调用C++编译的DLL详解 可以单步跟踪进入dll的源码!每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认 ...
- [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...
- Unity3D游戏开发之Unity与Android交互调用研究
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...
- Unity 与 Android 互调用
https://www.jianshu.com/p/b5e3cfcdf081 Unity 项目中一些需要访问安卓操作系统的功能,比如获取电量,wifi 状态等,需要 Unity 启动安卓系统的 Bro ...
- Unity通过Jar包调用Android
Unity通过Jar包调用Android 我们会需要面对下面几个问题,我们一个一个来解决: 怎样在Android Studio中打Jar包 怎样打一个Unity使用的Jar包 怎样在Unity工程中使 ...
- Unity Application 前后台切换调用关系
[Unity Application 前后台切换调用关系] http://blog.csdn.net/aa4790139/article/details/48087877
- Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸
依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小:然后在UI Root下再创建一个Panel. ...
- Unity中的Mono & Linux上编译Mono的流程
前段时间编译了一下Unity的Mono,看了很多相关的文章,也遇到很多新坑.所以来总结一下,加深自己对Mono的理解 为什么Unity可以跨平台运行呢 通常Unity的脚本有C#.JS.Boo.不过现 ...
随机推荐
- 如何利用 Visual Studio 自定义项目或工程模板
在开发项目的时候,由其是商业性质的大型项目时,往往需要在每个代码文件上都加上一段关于版权.开发人员的信息,并且名称空间上都需要带有公司的标志.这个时候,是选择在开发的时候手动添加还是自动生成呢? 我们 ...
- Oracle---------sql 中取值两列中值最大的一列
1.表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列. select (case when a>b then a else b ...
- 快速查找sql server中的存储过程和视图
select a.name,a.[type],b.[definition] from sys.all_objects a,sys.sql_modules b where a.is_ms_shipped ...
- python学习 异常
#===========================常见异常 ===================== #print(a);#NameError: name 'a' is not defined ...
- WCF学习之旅—第三个示例之三(二十九)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...
- 一、Redis基本操作——String(原理篇)
小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...
- Redis数据结构详解(一)
前言 Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据记录.Redis还支持对这些数据类型做更多的服务端操作 ...
- 逆向工程 - Reveal、IDA、Hopper、HTTPS抓包 等
目录: 一. iOS 如何做才安全 二.ipa文件 三.沙盒 中的数据 四.Reveal:查看 任何APP 的UI结构 五.反编译工具:IDA 六.反编译工具:Hopper Disassembler ...
- Android自定义View初步
经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...
- 读书笔记--SQL必知必会04--过滤数据
4.1 使用WHERE子句 在SELECT语句中,数据根据WHERE子句中指定搜索条件进行过滤. 搜索条件(search criteria)也称为(filter condition). WHERE子句 ...