Unity | 动态读取C#程序集实现热更新

目录

一、动态语言

二、创建C#dll

1.VS中创建一个C#语言的库工程

2.添加UnityEngine.dll的依赖

3.编写代码,生成dll

三、Unity使用dll


一、动态语言

        计算机编程语言可以根据它们如何将源代码转换为可以执行的代码来分类为静态语言和动态语言。

  • 静态语言(也称为编译型语言)通常需要在程序运行之前将源代码编译成机器码。这个过程是通过编译器完成的,编译器会检查源代码中的错误并将其转换成目标平台的机器码。静态语言的例子包括C、C++、Rust和Go等。静态语言的优势在于它们通常能够生成更高效的机器码,因此它们的执行速度往往更快。另外,由于编译时会进行类型检查,因此它们在类型安全方面也更为严格。
  • 动态语言(也称为解释型语言或者脚本)不需要预先编译。它们在程序执行时由解释器逐行读取源代码,然后转换成可以执行的操作。这种语言的例子包括Lua、Python、JavaScript和PHP等。动态语言的优势在于它们的灵活性和开发速度,因为开发者可以快速编写和测试代码,而不需要长时间的编译过程。但这种灵活性可能会以性能为代价,因为解释执行通常比直接执行编译后的代码要慢。
  • 值得注意的是,有些语言如Java和C#,它们通常被认为是静态类型语言,但它们采用了一种中间方式。这些语言的代码首先被编译成中间语言(比如Java的字节码),然后在运行时通过虚拟机(如JVM和CLR)解释执行或即时编译(JIT编译)成机器码。这种方式结合了编译型语言的一些优势和解释型语言的某些便利。

        使用动态语言的最大优势是不需要重新编译即可实现对程序的修改。Unity的底层是使用的C++语言,应用层面主要是使用的C#,使用C#的反射功能一定程度上可以实现对发布后的程序进行修改,但其使用并不容易,而且受到很多限制,比如苹果App就对反射功能有诸多限制,因此如果对游戏内容进行了改动,使用C#还是要重新编译整个程序。所以热更新使用的比较多的技术是Lua语言。

        使用Lua主要包括两部分,一部分是在Lua的宿主语言中创建接口读取、执行Lua脚本;另一部分是在宿主语言中编写接口供Lua脚本调用。(下一篇记录)

Lua 的动态类型系统意味着变量不需要在编译时声明其类型;类型会在运行时根据赋予变量的值自动确定。这提供了极大的灵活性,使得编写和修改代码变得更加快捷。同时,Lua 的解释器可以直接执行源代码,或者将源代码预编译为字节码,以提高执行效率。

二、创建C#dll

        在Unity或C#程序中,可以动态调用编译好的程序集(也就是.dll文件),这样在程序发布后,只需要更新.dll文件,即可实现对程序内容的更新,而不用重新编译整个程序。之前已经实现了Unity调用C++封装的dll。本文记录C#封装dll(超级简单)。

1.VS中创建一个C#语言的库工程

        注意版本选择的是.Net Framework3.5。

2.添加UnityEngine.dll的依赖

        然后在工程中选择【Dependencies】→【Add Reference】,引用Unity安装目录下Editor/Data/Managed中的UnityEngine.dll。

3.编写代码,生成dll

        因为引用了UnityEngine.dll,所以可以在代码中引用Unity引擎的功能。

using UnityEngine;
namespace ClassLibrary1CanDelete
{public class MyPlugin:MonoBehaviour{void Start() {Debug.Log("This is my c# plugin");}}
}

         编译工程,生成***.dll文件。

三、Unity使用dll

        将***.dll复制到Unity工程的Plugins目录内。

  • MyPlugin可作为组件直接拖到物体身上。
  • 也可用代码添加MyPlugin组件
 this.AddComponent<ClassLibrary1CanDelete.MyPlugin>();

        在Unity中做热更新,通常会将需要更新的内容放到Unity的StreamingAssets(PC端可读写,移动端只读)路径下,如果将***.dll文件放到StreamingAssets路径下,则必须使用文件读取的方式读取.dll文件,然后通过反射执行.dll文件提供的功能。

    void AddDll(){//this.AddComponent<ClassLibrary1CanDelete.MyPlugin>();byte[] bytes = System.IO.File.ReadAllBytes(System.IO.Path.Combine(Application.streamingAssetsPath, "ClassLibrary1CanDelete.dll"));Assembly assembly = Assembly.Load(bytes);System.Type type = assembly.GetType("ClassLibrary1CanDelete.MyPlugin");this.gameObject.AddComponent(type);}

        在Unity中实现热更新主要是通过网络下载需要更新的文件,并保存到Unity API中Aplication.dataPath指向的路径(一个可写的路径)。程序首先访问Application.dataPath指向的路径,如果目标文件不存在,便进行网络下载,如果服务器端不存在更新的文件,最后再到StreamingAssets读取默认的文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

省市区街道/乡镇四级联动vue3

最近优化了一个省.市.区/县、乡镇/街道的四级联动组件&#xff0c;技术栈是element vue3记录一下。 本来是这样的三级联动&#xff1a; 这个三级联动很简单&#xff0c;直接利用el-select组件把地区值带进去就行了&#xff0c;现在要优化成省.市.区/县、乡镇/街道的四级联动&…

提高笔记本电脑使用寿命,这几个技巧很重要!

“我新买了一台笔记本电脑&#xff0c;想问问在平常使用时我应该注意什么才可以更好地提高笔记本电脑的使用寿命呢&#xff1f;” 随着科技的不断发展&#xff0c;笔记本电脑已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;许多人在使用笔记本电脑时&#xff0c;往往…

docker 容器修改端口

一般在运行容器时&#xff0c;我们都会通过参数 -p&#xff08;使用大写的-P参数则会随机选择宿主机的一个端口进行映射&#xff09;来指定宿主机和容器端口的映射&#xff0c;例如 docker run -it -d --name [container-name] -p 8088:80 [image-name]这里是将容器内的80端口…

平板江湖:华为“行”、苹果“停”、小米“等一等”

配图来自Canva可画 近年来&#xff0c;随着人们对日常生活和办公中的智能电子产品提出了越来越高的要求&#xff0c;智能手机和平板电脑的产品类型便开始变得更加丰富、价位覆盖更为全面、场景应用也更显多样起来。只不过&#xff0c;在进入新的一年后&#xff0c;与智能手机市…

【PHP】Workerman开源应用容器的GatewayWorker 与 iOS-OC对接

Workerman 开源高性能PHP应用容器 workerman是一款开源高性能PHP应用容器,它大大突破了传统PHP应用范围,被广泛的用于互联网、即时通讯、APP开发、硬件通讯、智能家居、物联网等领域的开发。 PHPSocket.io PHP版本的socket.io,具有良好的客户端兼容性,常用于即时通讯领域…

时间序列分析实战(八):时序的格兰杰因果检验

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

C语言题目练习

目录 前言 1、网购 1.1题目 描述 输入描述&#xff1a; 输出描述&#xff1a; ​编辑 1.1 解题 2、带空格直角三角形图案 2.1题目 描述 输入描述&#xff1a; 输出描述&#xff1a; ​编辑 2.2 解题 3、小乐乐改数字 3.1 题目 描述 输入描述&#xff1a; 输…

【自然语言处理三-self attention自注意是什么】

自然语言处理三-自注意力 self attention 自注意力是什么&#xff1f;自注意力模型出现的原因是什么&#xff1f;词性标注问题解决方法1-扩展window&#xff0c;引用上下文解决方法2-运用seq2seq架构新问题来了&#xff1a;参数量增加、无法并行的顽疾 自注意力self attention模…

备战蓝桥杯————k个一组反转单链表

k个反转单链表&#xff0c;顾名思义就是k个节点为一组进行反转&#xff0c;这是一道困难的题目&#xff0c;如何解答&#xff0c;可以在我们前面的反转链表中得到思路。 如何 K 个一组反转单链表 题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xf…

MySQL表分区技术介绍

目录 1. 分区概述 1.1 表分区 1.2 表分区与分表的区别 1.3 表分区的好处 1.4 分区表的限制因素 2. 如何判断当前MySQL是否支持分区&#xff1f; 3. 分区类型详解 3.1 MySQL支持分区类型 3.2 RANGE分区 3.2.1 根据数值范围分区 3.2.2 根据TIMESTAMP范围分区 3.2.3 根…

视频mov如何转换成mp4?五分钟学会4种方法

在今天的数字时代&#xff0c;我们不可避免地需要处理各种视频文件格式。MOV格式是由苹果公司开发的一种常见视频格式&#xff0c;而MP4格式则是更为通用和广泛支持的视频格式。 因此&#xff0c;当我们需要在不同设备或平台上播放或分享视频时&#xff0c;可能需要将MOV格式的…

Eclipse是如何创建web project项目的?

前面几篇描述先后描述了tomcat的目录结构和访问机制&#xff0c;以及Eclipse的项目类型和怎么调用jar包&#xff0c;还有java的main函数等&#xff0c;这些是一些基础问题&#xff0c;基础高清出来才更容易搞清楚后面要说的东西&#xff0c;也就是需求带动学习&#xff0c;后面…

Unity开发一个FPS游戏

在之前的文章Unity 3D Input System的使用-CSDN博客中,我介绍了如何用Input System来实现一个FPS游戏的移动控制,这里将进一步完善这个游戏。 以下是游戏的演示效果: fps_demo 添加武器模型 首先是增加主角玩家的武器,我们可以在网上搜索到很多免费的3D资源,例如在以下网…

12年高级工程师的“飞升之路”,redis和rabbitmq面试题

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例

STM32 合宙1.54“ 电子墨水屏&#xff08;e-paper&#xff09;驱动显示示例 &#x1f4cd;相关篇《Arduino框架下ESP32/ESP8266合宙1.54“ 电子墨水屏&#xff08;e-paper&#xff09;驱动显示示例》&#x1f516;程序是从GooDisplay品牌和微雪电子下同型号规格墨水屏的示例程序…

【C#】忽略大小的替换字符串

结果 代码 string a"aAAAAAAaBBaaCC"; string b Strings.Replace(a, "a", "D", 1, -1, CompareMethod.Text);

php基础学习之错误处理(其一)

一&#xff0c;错误处理的概念 错误处理指的是系统(或者用户)在执行某些代码的时候&#xff0c;发现有错误&#xff0c;就会通过错误处理的形式告知程序员&#xff0c;俗称报错 二&#xff0c;错误分类 语法错误&#xff1a;书写的代码不符合 PHP 的语法规范&#xff0c;语法错…

力扣刷题:383.赎金信

题目&#xff1a; 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&…

mac电脑监控软件哪个好

在Mac电脑使用日益普及的今天&#xff0c;企业对于Mac终端的安全管理需求也日益增长。Mac电脑监控软件作为一种有效的管理工具&#xff0c;能够帮助企业提高数据安全性和员工工作效率。 在众多Mac电脑监控软件中&#xff0c;域智盾软件以其卓越的功能和性能脱颖而出&#xff0c…

3D工业相机及品牌集合

3D相机可以获取物理世界的空间信息&#xff0c;即立体三维的物理信息&#xff0c;不仅可以拍摄到场景的二维图像&#xff0c;而且能获取物体之间的位置关系&#xff0c;再经过进一步深化处理&#xff0c;还能完成三维建模等应用。 3D相机三种方案 1、结构光 通常采用特定波长…