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

news2024/10/6 16:28:22

目录

一、动态语言

二、创建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.coloradmin.cn/o/1476681.html

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

相关文章

Centos7:自动化配置vim | suoders信任列表添加普通用户

Centos7&#xff1a;自动化配置vim | suoders信任列表添加普通用户 vim 配置原理sudoers系统可信任列表中添加普通用户自动化配置vim vim 配置原理 在目录/etc下有一个vimrc文件&#xff0c;该文件是系统中公共的vim配置文件&#xff0c;对所有用户都成立。  而在每个普通用户…

ABAP-CPI: Get CPI Monitoring Log (通过postman去获取CPI监控中心的日志)

参照文档: SAP Business Accelerator Hub Using Message Monitoring and Logging (sap.com) 进入到你的CPI监控中心: 获取到上面的 https://..hana.ondemand.com的地址,在它后面加上/api/v1 即https://....hana.ondemand.com/api/v1 然后就可以开始postman调用了,文章…

[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

vue2 + axios + mock.js封装过程,包含mock.js获取数据时报404状态的解决记录,带图文,超详细!!!

vue axios mock.js 以下是封装的过程&#xff0c;记录一下 1、首先先了解什么是mock.js的用途及特点 官网地址&#xff1a;Mock.js (mockjs.com) 作用&#xff1a;生成随机数据&#xff0c;拦截 Ajax 请求 优势&#xff1a; 2、了解axios的原理及使用 官网地址&#xff1a…

Python把excel内容保存为图片(非统计图而是纯原表格数据)

一、引入 excel2img 库&#xff0c;没有的话使用 pip install excel2img进行安装 二、采用如下方法进行图片生成 excel文件名为&#xff1a;111.xlsx excel表格里面的sheet名称列表为 [Sheet1, Sheet2] 最终保存为以sheet名称.png的图片 支持跨表格合并项 import excel2i…

【大数据】Flink SQL 语法篇(八):集合、Order By、Limit、TopN

Flink SQL 语法篇&#xff08;八&#xff09;&#xff1a;集合、Order By、Limit、TopN 1.集合操作2.Order By、Limit 子句2.1 Order By 子句2.2 Limit 子句 3.TopN 子句 1.集合操作 集合操作支持 Batch / Streaming 任务。 UNION&#xff1a;将集合合并并且去重。UNION ALL&a…

MySql-多表设计-一对多-外键

目录 外键约束问题分析问题解决 实例通过SQL语句操作物理外键和逻辑外键 外键约束 表结构创建完毕后&#xff0c;我们看到两张表的数据分别为&#xff1a; 现在员工表中有9个员工都归属于2号部门&#xff0c;当删除了号部门后&#xff0c;数据变为&#xff1a; 2号部门被删除…

什么是电子邮件客户端?如何选择合适的邮箱客户端?

“从1到10分&#xff0c;你会如何评价我们的电子邮件服务&#xff1f;” 无论你的评分是多少&#xff0c;影响你评分的一个重要因素肯定是电子邮件客户端提供的功能。 电子邮件客户端应该具有基本而漂亮的高级功能&#xff0c;以使迁移过程更容易。此外&#xff0c;应该有一些…

leetcode — 动态规划 — 打家劫舍、完全平方数

1 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房…

Vue官网“食用指南”

把Vue官网当做一个工具来用&#xff0c;有问题&#xff0c;先来官网查一查。 官网中常用的板块 官网&#xff1a;https://cn.vuejs.org/上手后&#xff0c;最常用的模块是【快速上手】【API】。所以务必要知道这两个模块在哪里&#xff0c;怎么使用。![image.png](https://img…

VPX基于全国产飞腾FT-2000+/64核+复旦微FPGA的计算刀片

6U VPX计算板 产品简介 产品特点 飞腾计算平台&#xff0c;国产化率100% VPX-MPU6902是一款基于飞腾FT-2000/64核的计算刀片&#xff0c;主频2.2GHz&#xff0c;负责业务数据流的管控和调度。搭配自带独立显示芯片的飞腾X100芯片&#xff0c;可用于于各类终端及服务器类应用场…

R语言使用dietaryindex包计算NHANES数据多种健康饮食指数 (HEI等)(1)

健康饮食指数 (HEI) 是评估一组食物是否符合美国人膳食指南 (DGA) 的指标。Dietindex包提供用户友好的简化方法&#xff0c;将饮食摄入数据标准化为基于指数的饮食模式&#xff0c;从而能够评估流行病学和临床研究中对这些模式的遵守情况&#xff0c;从而促进精准营养。 该软件…

能在手机上运行,仅仅0.5B大小的小语言模型MobiLlama

模型介绍 该模型基于LLaMA-7B架构设计&#xff0c;旨在能够在边缘设备上高效运行&#xff0c;无需将数据发送到远程服务器或云端处理。如智能手机、平板电脑、智能手表等。MobiLlama模型虽然体积小、对资源的需求低&#xff0c;但仍能提供高精度的语言理解和生成能力。项目还提…

fastjson序列化MessageExt对象问题(1.2.78之前版本)

前言 无论是kafka&#xff0c;还是RocketMq&#xff0c;消费者方法参数中的MessageExt对象不能被 fastjson默认的方式序列化。 一、查看代码 Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {t…

C语言——深度剖析数据在内存中的存储——第2篇——(第25篇)

坚持就是胜利 文章目录 三、浮点型在内存中的存储1、一个例子2、浮点数存储规则1、IEEE 754对 有效数字M 和 指数E &#xff0c;还有一些特别规定。2、至于 指数E&#xff0c;情况比较复杂&#xff0c;首先&#xff0c;E 为 一个无符号整数(unsigned int)3、然而&#xff0c;指…

防御保护:防火墙内容安全

一、IAE&#xff08;Intelligent Awareness Engine&#xff09;引擎 二、深度检测技术(DFI和DPI&#xff09; 1.DPI – 深度包检测技术 DPI主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#x…

c# .net8 香橙派orangepi + hc-04蓝牙 实例

这些使用c# .net8开发&#xff0c;硬件 香橙派 orangepi 3lts和 hc-04蓝牙 使用场景&#xff1a;可以通过这个功能&#xff0c;手机连接orangepi进行wifi等参数配置 硬件&#xff1a; 1、带USB口的linux开发板orangepi 2、USB 转TTL 中转接蓝牙&#xff08;HC-04) 某宝上买…

openGauss学习笔记-230 openGauss性能调优-系统调优-配置并行查询功能

文章目录 openGauss学习笔记-230 openGauss性能调优-系统调优-配置并行查询功能230.1 适用场景与限制230.2 资源对SMP性能的影响230.3 其他因素对SMP性能的影响230.4 配置步骤 openGauss学习笔记-230 openGauss性能调优-系统调优-配置并行查询功能 openGauss的SMP并行技术是一…

双流机场到天府机场ADS-B数据导入MATLAB

MATLAB导入数据 导入的数据Excel部分截图&#xff1a; 一些处理 % 导入外部轨迹数据并转成标准形式 clear;clc; %% 导入&预处理 [NUM,TXT,RAW]xlsread(2021年10月31日CTU-TFU); time_cell RAW(3:end,1); %拉取时间数据&#xff08;cell&#xff09; time_char char(t…

【清理mysql数据库服务器二进制日志文件】

清理前后比对 清理前占用 86% &#xff1a; 清理后占用 29% &#xff1a; 排查占用磁盘较大的文件 检测磁盘空间占用 TOP 10 # 检测磁盘空间占用 TOP 10 $ sudo du -S /var/log/ | > sort -rn | # -n选项允许按数字排序。-r选项会先列出最大数字&#xff08;逆序&#x…