如果你有点关心这方面的知识,你应该知道Unity3D做的项目很容易被反编译。反编译后,你所有的资源和代码都会毫无遮掩地呈现出来。本身并没有加密措施,所以我们一般使用混淆代码对程序进行一定程度的加密。在接下来的两篇博客中UI界面,赵会简单的讲讲我自己在Unity3D中的程序加密实践。首先,在第一部分中,我将简要说明如何在Unity3D中使用dll动态链接库,然后第二部分将解释如何对dll进行混淆处理。开始第一篇的内容:首先,我们需要新建一个类库项目,可以使用VisualStudio或者Monodevelop来完成。我这里用vs2012创建:选择项目类型unity 默认命名空间,写项目名。新生成的项目中默认有一个Class1类,可以通过在解决方案资源管理器中重命名来更改为你想要的类名。比如我把它改成 Math3D 并在里面写了一个简单的静态方法。这里我写了最简单的加法(Add)。也可以不写静态方法,写普通的公共方法unity 默认命名空间,在新对象使用时调用方法。这与普通的 C# 编程没有什么不同。写好后,在资源管理器中选择“Generate”,然后在项目的bin/debug中就可以看到dll文件了。比如我的项目是AzhaoDll.dll。接下来,在Unity3D中创建你需要的项目,把dll文件放到项目的Assets文件夹中即可。可以通过在解决方案资源管理器中重命名它来更改为您想要的类名。比如我把它改成 Math3D 并在里面写了一个简单的静态方法。这里我写了最简单的加法(Add)。也可以不写静态方法,写普通的公共方法,在新对象使用时调用方法。这与普通的 C# 编程没有什么不同。写好后,在资源管理器中选择“Generate”,然后在项目的bin/debug中就可以看到dll文件了。比如我的项目是AzhaoDll.dll。接下来,在Unity3D中创建你需要的项目,把dll文件放到项目的Assets文件夹中即可。可以通过在解决方案资源管理器中重命名它来更改为您想要的类名。比如我把它改成 Math3D 并在里面写了一个简单的静态方法。这里我写了最简单的加法(Add)。也可以不写静态方法,写普通的公共方法,在新对象使用时调用方法。这与普通的 C# 编程没有什么不同。写好后,在资源管理器中选择“Generate”,然后在项目的bin/debug中就可以看到dll文件了。比如我的项目是AzhaoDll.dll。接下来,在Unity3D中创建你需要的项目,把dll文件放到项目的Assets文件夹中即可。也可以不写静态方法,写普通的公共方法,在新对象使用时调用方法。这与普通的 C# 编程没有什么不同。写好后氛围,在资源管理器中选择“Generate”,然后在项目的bin/debug中就可以看到dll文件了。比如我的项目是AzhaoDll.dll。接下来,在Unity3D中创建你需要的项目,把dll文件放到项目的Assets文件夹中即可。也可以不写静态方法,写普通的公共方法,在新对象使用时调用方法。这与普通的 C# 编程没有什么不同。写好后,在资源管理器中选择“Generate”,然后在项目的bin/debug中就可以看到dll文件了。比如我的项目是AzhaoDll.dll。接下来,在Unity3D中创建你需要的项目,把dll文件放到项目的Assets文件夹中即可。
关于这个dll文件的存放位置,网上有人说一定要放在plugin文件夹下,但不是必须的,在任何位置都可以识别。当然,按照良好的项目路径习惯,我们创建一个专门放置插件的文件夹来存放dll文件是合理的。然后在Unity3D中创建一个C#脚本,写一行简单的代码来调用我们刚才写的Math3D.Add方法。这时候你会发现Math3D类无法识别。我们使用AzhaoDll命名空间,然后将脚本挂在Unity3D中的摄像头上,运行,可以看到打印出正确的结果,证明dll调用成功。回顾一下我们刚刚做的一些小细节,在类库项目的 Math3D 类中。我们默认使用 AzhaoDll 命名空间。那么如果我们不使用命名空间怎么办,或者我们可以使用其他命名空间吗?答案是肯定的,命名空间可以任意改变,如果没有使用命名空间,那么调用时就不需要使用,如果使用了其他命名空间,对应的使用其命名空间就行了。尝试删除命名空间如下:那么Unity3D中的调用可以直接使用:运行结果也正常:当然不建议不使用命名空间,这是一个解释,因为创建的脚本是由unity3D本身默认不使用命名空间,只是说明如果不想麻烦,直接在Unity3D中编译不使用命名空间的脚本也是可以的。那么调用的时候就不需要使用了,如果使用了其他的命名空间,对应的使用它的命名空间就行了。尝试删除命名空间如下:那么Unity3D中的调用可以直接使用:运行结果也正常:当然不建议不使用命名空间,这是一个解释,因为创建的脚本是由unity3D本身默认不使用命名空间,只是说明如果不想麻烦,直接在Unity3D中编译不使用命名空间的脚本也是可以的。那么调用的时候就不需要使用了,如果使用了其他的命名空间,对应的使用它的命名空间就行了。尝试删除命名空间如下:那么Unity3D中的调用可以直接使用:运行结果也正常:当然不建议不使用命名空间,这是一个解释,因为创建的脚本是由unity3D本身默认不使用命名空间,只是说明如果不想麻烦,直接在Unity3D中编译不使用命名空间的脚本也是可以的。
再次回顾细节,我们刚才使用的是原生 C#。如果我们需要在类库项目中写一个方法来调用Unity3D自己的函数呢?在Unity3D安装目录EditorDataManaged中,找到UnityEditor.dll和UnityEngine.dll两个文件。然后添加对类库项目的引用,并添加这两个dll。这时候我们就可以在类库项目中使用UnityEngine来使用Unity3D方法了。例如,我们在这里简单地写了一个 CreateGameObject 方法来生成一个名为“CreateByDll”的游戏对象。