ILRuntime - 写个简单的游戏 DEMO 工程

2023-11-21 07:20

本文主要是介绍ILRuntime - 写个简单的游戏 DEMO 工程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • ILRuntime DebugServer 的优化
  • VS 生成事件设置
  • Project
  • References


为何 “又” 研究了 ILRuntime 的使用呢,因为现在所在的公司,项目中在很多功能变动的地方都使用了 C# 开编写,只有 UI 使用 lua,但是重现将之前的逻辑都翻译成 lua,可能会有很多问题,虽然也有 CSharp.lua 之类的工具,但是很多语法特性是不支持的,有些是工具翻译不成的,而且主要还是项目先阶段不适合大改风险,所以才选用 ILRuntime

所以 综合 考虑后,才使用 ILRuntime 来处理这部分频繁变动的 C# 动态

所以,这个项目也有成了:C# + ILRuntime + ToLua 的项目,真实让人无语啊


下面在 “又” 预研回 ILRuntime 的内容,有写了一次 DEMO(其实上家公司项目也有用到,但是当时其他人去负责研究了,我就没去重头研究,这次刚好有机会重现研究一下)

具体其他简单的用法可以参考 References 中的 官方DEMO

其中 HotFix 层的 Behavior, Component, UIView 等封装

我写的这个 DEMO 学习用,里面部分简单的用法可以相互学习、交流

整个已上传到:GitHub 上了:javelinlin/ILRuntimeU3DDemo


ILRuntime DebugServer 的优化

因为我们在 主工程 中如果在加载完 *.dll后 直接:

domain.DebugService.StartDebugService(56000);

然后在 HotFixProj 工程下 Attach to ILRuntime

这时,如果你断点调试 HotFixProj 中 初始化那部分代码,你是中不了断点的
所以为了做这个优化,我在主工程 定义一个宏,是否需要等待 HotFixProj Attach 后,才继续后续的 ILRuntime 逻辑,核心代码如下:

    private IEnumerator WaitingAttachILRTDebuggerAndHotFixInit(){int times = 0;
#if UNITY_EDITORvar waitingViewPrefabPath = "Assets/UI/Prefabs/ShowTipsForWaitingAttachILRTDebugger.prefab";var waitingViewPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(waitingViewPrefabPath);var waitingViewInst = GameObject.Instantiate(waitingViewPrefab);var parent = GameObject.Find("Canvas/Dialog");waitingViewInst.transform.SetParent(parent.transform);var rectTrans = waitingViewInst.GetComponent<RectTransform>();rectTrans.anchoredPosition = Vector2.zero;rectTrans.sizeDelta = Vector2.zero;
#endifif (!domain.DebugService.IsStarted){domain.DebugService.StartDebugService(56000);}while (!domain.DebugService.IsDebuggerAttached){Debug.Log($"Waiting For Attaching ILRuntime Debugger..., time : {++times}");yield return new WaitForSeconds(1.0f);}Debug.Log($"ILRuntime Debugger was Attached!, use Waiting Times : {times}");#if UNITY_EDITORGameObject.Destroy(waitingViewInst);
#endifonHotFixLauncherInit();}

确保以下 ILRTBehaviorLauncher.cs 中的 __ENABLED_ILRT_DEBUG__ 定义了
在这里插入图片描述
还要确保我们的,HotFixProj 工程生存 Debug 的发布程序,然后重新生成一下
在这里插入图片描述

这时候,我们启动 unity 主工程:
在这里插入图片描述
如上图,可以看到有提示:Waiting for Attach to ILRuntime Debugger... 的内容

然后回到 HotFixProj 工程,Attach to ILRuntime,如下图:
在这里插入图片描述
在弹出的对话框中,我们默认连接 127.0.0.1:56000,也就是我们主工程开启的断点调试服务
在这里插入图片描述

Attach 一下,就可以正常断点 HotFixProj 中的断点了(虽然 Watch 视图内容不是很稳定,但好过没有)

另外,我还写了一个编辑器,便于多个工程开发时,可以设置不一样的 Port 设置,并且可以显示对应的 Start 与否,和 是否Attached 的状态显示
在这里插入图片描述

下面是操作一波的 GIF 动画:
在这里插入图片描述


VS 生成事件设置

因为 HotFotProj 会生成一些不必要的文件
所以我们在生存的前后,最好都清理一波
配置如下(也可以参考:Visual Studio - 搬砖日志 - 生成事件后删除文件)
在这里插入图片描述


Project

javelinlin/ILRuntimeU3DDemo


References

  • Ourpalm/ILRuntimeU3D - U3D ILRT 的 DEMO
  • Unity 热更方案相关

这篇关于ILRuntime - 写个简单的游戏 DEMO 工程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400766

相关文章

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::