P1——独立游戏开发ARPG
P1——独立游戏开发ARPG 前置知识点 C# 相关知识点 Unity 相关知识点 UGUI 相关知识点 数据持久化之2进制 小框架重置版 如何进行学习和学习重点 一切从零开始开发,如同传统商业游戏开发流程一样的来制作我们的项目 作为程序开发教学课程,会把学习重点放到 设计开发 和 发行上线 上 因为这两部分工作和我们程序工种息息相关 而 预研立项 和 测试调优 两部分, 本课程会根据讲师的多年的工作经验简单给大家讲解 也让大家也能够了解到这两部分的重要性 (特别对于独立游戏开发者) 主要学习内容 预研立项 预研立项的基本流程 确定游戏类型 市场调研 核心玩法Demo产出 预研立项流程中的立项评估 程序准备工作 游戏开发前后端程序区别 【程序准备工作】技术栈选择 版本管理相关 【程序准备工作】为何要使用版本管理软件 使用基于Github Desktop的版本管理 【git版本管理】Github注册登录,以及Gitbub...
UH4L21——重定向的书写规则
UH4L21——重定向的书写规则 本章代码关键字 1234567ILIntepreter.AppDomain //通过解释器获取appDomainILIntepreter.Minus() //移动栈指针,获取不同位置,可用于获取栈底或者指向某个参数的地址Type.CheckCLRTypes() //将StackObject.ToObject()转换出来的对象再为某种类型的对象(返回出来的值可直接强转成对应的类型)StackObject.ToObject() //将某个栈空间存储的值转换为对象CLR.Utils.Extensions.TypeFlags //要转换的类型枚举,配合Type.CheckCLRTypes()使用ILIntepreter.Free //释放某个栈上的内存ILIntepreter.PushObject() ...
UH4L20——解释器
UH4L20——解释器 ILRuntime中的解释器 当ILRuntime通过 Mono.Cecil 库将DLL文件中的 IL 中间语言读取出来后, 会利用已经写好的相关代码,将IL代码解释翻译,之后用于执行 它主要做了(ILIntepreter脚本): 遍历方法体中的每一条指令 使用内部巨大的 switch case 用于处理 IL 中的每一条指令(判断不同的指令类型来处理对应逻辑) 在执行代码时,使用ILRuntime内部自己实现的运行栈来管理内存,ILRuntime中使用非托管内存,内存不会被GC管理, 而是ILRuntime内部自己管理,通过指针直接对内存进行操作(脚本RuntimeStack),其中使用自定义类 StackObject 来表达基础类型值 ILRuntime中的内存布局 在ILRuntime实现的非托管 运行栈 中存储的对象主要就是 StackObject 对象 在该运行栈中,StackObject 对象是依次排列的,我们只需要移动当前的栈指针(加一或者减一)就可以获取到栈中存储的各数据 123456789101112 ...
UH4L19——类型系统
UH4L19——类型系统 类型系统的作用 类型系统用于表示热更工程中的各种类型、方法、成员、实例对象等等信息 相当于,ILRuntime帮助我们利用它内部的解释器,将我们实现的代码解释翻译为了自己的一套类型规则 在真正执行代码时,都是基于ILRuntime自己的类型系统中的规则来执行的 说人话:类型系统 是 热更工程中的类、方法、成员等信息...
UH4L18——基本原理
UH4L18——基本原理 ILRuntime基本原理 ILRuntime借助Mono.Cecil库来读取DLL中的IL汇编码,然后通过内置的IL解释执行虚拟机来执行DLL中的代码 C#的运行机制 该知识点在 Unity进阶之C#知识补充 中详细讲解过,详见:CS5L1——.NET相关知识 C# 通过C#编译器 生成 对应的 CIL(通用中间语言) 然后通过 CLR(公共语言运行时)将 CIL 解释翻译 为最终的机器码,运行在平台上 那么我们生成DLL文件,其中存储的就是我们的 CIL 中间语言,我们可以通过 反编译工具 ILSpy 来查看对应的 IL 中间代码 注:上图不是ILSpy而是dySpy,就查看IL中间代码的能力是一致的,dySpy已停更 ILSpy获取地址:icsharpcode/ILSpy (github.com) IL的汇编代码中有很多的指令信息,如果想要学习他们,可以前往微软官网查看具体的IL汇编指令的作用 OpCodes 类 (System.Reflection.Emit) | Microsoft...
UH4L17——性能优化相关
UH4L17——性能优化相关 本章代码关键字 1appDomain.Prewarm() //提前预热加载某个类或者方法,提高第一次执行时的性能 ILRuntime性能测试或打包时的注意事项(设置相关) 如果要进行ILRuntime性能测试,或最终打包,为了达到最好的性能表现,需要注意以下几点 热更工程生成的DLL包使用Release编译生成 在Unity编辑器中的执行效率会低于真机,内存占用也会相差数倍,建议真机测试性能和内存 打包时不要勾选 Development Build(开发构建),若勾选打包后真机测试效率会较低 如果是IL2CPP打包,在 PlayerSetting 中 的 Other Setting 中需要将 C++ Compiler Configuration(C++编译器配置)设置为...
UH4L16——寄存器模式
UH4L16——寄存器模式 本章代码关键字 1234567ILRuntimeJITFlags //ILRuntime的即时编译(JIT)模式ILRuntimeJITFlags.None //不启用寄存器模式ILRuntimeJITFlags.JITOnDemand //按需即时编译(JIT)模式,全局开启时,一般只会使用该模式ILRuntimeJITFlags.JITImmediately //立即JIT模式ILRuntimeJITFlags.NoJIT //禁用JIT模式ILRuntimeJITFlags.ForceInline //强制内联模式,该模式只对方法的Attribute生效[ILRuntimeJIT()] //对类和方法使用,指定为某个类或者方法开启寄存器模式 寄存器模式 寄存器模式是 ILRuntime2.0 版引入的专用于优化大规模数值计算的执行模式 该模式通过 ILRuntime 自己的...
UH4L15——调试相关
UH4L15——调试相关 本章代码关键字 12appDomain.DebugService.StartDebugService() //注册调试服务appDomain.DebugService.IsDebuggerAttached //判断调试器链接 ILRuntime调试相关 注:笔者实际测试下来出现了无法命中断点的问题,原因不明且无法解决 进行ILRuntime调试需要安装插件 想要进行断点调试,我们需要注册调试服务,想要及时进断点,那么可以配合协同程序等待调试器链接 可以利用IP和端口调试特点来调试移动设备 准备ILRuntime调试相关插件 ILRuntime 2.1.0以下的版本 需要前往ILRuntime的Github页面获取插件 地址:Releases · Ourpalm/ILRuntime (github.com) 打开页面后,点击右侧的Releases,在对应版本处下载调试插件 ILRuntime...
UH4L14——序列化库
UH4L14——序列化库 本章代码关键字 1JsonMapper.RegisterILRuntimeCLRRedirection() //ILRuntime修改的LitJson特有的方法,热更工程如果要使用则必须调用该方法注册,传入appDomain ILRuntime中使用序列化库 序列化库在我们开发当中经常会用到,比如之前我们学过的 LitJson、Protobuf 但是这些库都是存在于主工程中的,那么当使用他们序列化反序列化热更工程中的对象时,他们是不能识别的 所以在ILRuntime中使用序列化库,需要对其进行修改 LitJson库获取:Demo工程中就有修改好的LitJson Protobuf库获取:protobuf-net: Protobuf-net for ILRuntime...
UH4L13——Unity反射调用ILRuntime
UH4L13——Unity反射调用ILRuntime ILRuntime反射相关 Unity中反射使用ILRuntime热更工程中内容 通过IType获取类型消息 12IType type = appdomain.LoadedTypes["TypeName"];Type t = type.ReflectedType; 不能使用Activator.CreateInstance 或 new T() 创建实例 只能通过创建ILRuntime中对象中的反射方式创建 appdomain.Instantiate 或者 type.GetConstructor 后...