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.hqwc.cn/news/497838.html

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

相关文章

用Flutter开发App:助力您的移动业务腾飞

一、Flutter简介 Flutter是Google推出的用于构建多平台应用程序的开源UI框架。它使用Dart语言编写&#xff0c;可以编译为原生机器代码&#xff0c;从而提供卓越的性能和流畅的用户体验。 二、Flutter的优势 一套代码&#xff0c;多平台部署&#xff1a;Flutter可以使用一套代…

软信天成:一文详解拥有可观测性能力的数据目录

近年来&#xff0c;数据治理和数据可观测性被越来越多的企业广泛采用。现代数据系统为用户提供多项功能和精准服务&#xff0c;允许用户以不同形式自由存储和查询相关数据&#xff0c;但随着功能增加以及系统间快速产生的海量、可变化数据&#xff0c;可能会导致数据漂移、数据…

基于Redo log Undo log的MySQL的崩溃恢复

基于Redo log & Undo log的MySQL的崩溃恢复 Redo log Undo log Redo log 重做日志,记录,修改过的数据 Undo log 回滚日志,记录修改之前的数据 两个我不做详细的介绍了,redo log就是记录哪些地方被修改了 undo log是记录修改之前我们的数据长什么样 更新流程 我们来捋一…

实例:NX二次开发抽取平面以及标准柱面中心线

一、概述 最近体验许多外挂&#xff0c;包括胡波外挂、星空外挂及模圣等都有抽取面的中心线&#xff0c;由于刚刚学习&#xff0c;我尝试看看能不能做出来&#xff0c;本博客代码没有封装函数&#xff0c;代码有待改进&#xff0c;但基本可以实现相应的功能。 二、案例实现的功…

rtthread stm32h743的使用(三)uart串口设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.打开cubemux&#xff0c;设置外部时钟及串口外设…

亚马逊云科技实时 AI 编程助手 Amazon CodeWhisperer,开发快人一步

​ ​ Amazon CodeWhisperer 是一款 AI 编码配套应用程序&#xff0c;可在 IDE 中生成 整行代码和完整的函数代码建议&#xff0c;以帮助您更快地完成更多工作。在本系列 文章中&#xff0c;我们将为您详细介绍 Amazon CodeWhisperer 的相关信息&#xff0c;敬请 关注&#xff…

c++之static的作用

目录 1、C语言 ​2、c(拓展) &#xff08;1&#xff09;static修饰成员变量 &#xff08;I&#xff09;static修饰变量之后成为静态变量&#xff0c;在编译时就会产生空间&#xff1b; &#xff08;II&#xff09;解决思路&#xff1a; a、目标要求&#xff1a; b、原则&am…

基于Java SSM springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java SSM springbootVUEredis实现的前后端分类版网上商城项目 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐…

Python实现向量自回归移动平均与外生变量模型(VARMAX算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 向量自回归移动平均与外生变量模型&#xff08;Vector Autoregression Moving Average with Exogenous…

金融行业专题|期货超融合架构转型与场景探索合集(2023版)

更新内容&#xff1a; 更新 SmartX 超融合在期货行业的覆盖范围、部署规模与应用场景。新增 CTP 主席系统实践与评测、容器云资源池等场景实践。更多超融合金融核心生产业务场景实践&#xff0c;欢迎下载阅读电子书《SmartX 金融核心生产业务场景探索文章合集》。 面对不断变…

【机器学习】线性回归模型(Linear Regression)

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;机器学习&#x1f338;今日语录:温柔的一半是知识&#xff0c;没有知识的涵养撑不起你想要的风骨。 ☘️0文章预览 本系列文章主要是根据吴恩达老师的机器学习课程以及自己的理解整合而成&#xf…

electron安装最后一部卡住了?

控制台如下错误 不是的话基本可以划走了 这个很可能是镜像出现问题了&#xff0c;不一定是npm镜像 打开npm的配置文件添加下述 electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-build…