[2]自定义Lua解析方式 在上文中我们学会学会更改加载路径,加载对应文件夹下的Lua脚本。 默认解析加载的lua脚本存在的文件位置非AB包或者Resources文件夹下往往不能随包体更新,这显然不符合热更需要。因此自定义继承 tolua中lua脚本加载解析类LuaFileUtils来重写对应的lua脚本加载方法。 publicclassLuaCustomLoad:LuaFileUtils { ///<summary> ///优先从AssetBundle中加载(默认AB文件名称为lua)Resources文件夹下lua文件夹加载 ///</summary> ///<...
[0]toLua的导入 下载toLua资源包,访问GitHub项目地址,点击下载即可。 将文件导入工程目录中: 导入成功之后会出现Lua菜单栏,如未成功生成文件,可以点击GenerateAll重新生成(注意很可能是路径问题导致的生成失败!) 之后就可以开始编写脚本执行第一个lua程序了! [1]C调用Lua脚本 编写C脚本,使用LuaState来开启虚拟机加载lua脚本,加载lua脚本有两种方式。 直接加载Lua目录下的lua脚本 这是LuaState自动寻找的路径--即Asset/Lua路径,所以只需要给lua脚本的名称即可。 publicclassCallLuaEntrance:Mo...
最近做传送门的时候发现一个很好玩的问题,当我通过Collsion触发带floatingPawnMovement的Pawn的SetActionLocation时会获得非常大的速度:pawn直接弹射到宇宙了ಠ_ಠ 但是当我通过controller按键触发传送时却没有这个问题于是我看了下floatingPawnMovement代码发现了问题所在`voidUFloatingPawnMovement::TickComponent(floatDeltaTime,enumELevelTickTickType,FActorComponentTickFunctionThisTickFunction){if(Sh...
[3]自定义Lua解析器管理器-------演化脚本V0.5 方便我们在项目中使用Lua解析方法,我们封装管理一个lua解析器,管理LuaState的方法执行。 解析器脚本: usingLuaInterface; namespaceBaseFramework { ///<summary> ///自定义的toLua解析器 ///</summary> publicclassCallLuaManager:SingletonAutoMono<CallLuaManager> { privateLuaState_luaState; ///<summary>...
工具类封装 通过上文中对AB包加载API的了解和简单使用,对AB包资源加载的几种方法进行封装,将其写入单例类中,如代码展示。 确保每个AB资源包只加载一次: 在LoadAssetBundleManager单例工具类中,首先提供基本的AB包及其AB包依赖包的加载方法,为保持AssetBundle只加载一次,使用DIctionary键值对来记录已经加载出的AB资源。 主包路径的灵活获取: 加载主包路径的获取,采用宏来对不同的打包平台来选择对应的主包名称。(可自行定义使用) 依赖包的加载: 通过加载主包中的AssetBundleManifest来获取目标AB包的依赖AB包名称,根据名称进行逐个加载。...
Unity游戏框架设计之背包管理器 简单介绍 背包系统通常分为两个部分,第一个部分是背包的UI界面,第二个部分是对背包进行逻辑操作的管理器。 在下述代码中,实现了对背包的基本逻辑操作,包括向背包添加物品,从背包中取出物品,移动背包中的物品和使用背包中的物品的基本操作,并将这些操作封装为背包管理器。 为实现完整的背包系统,我们需要背包UI资源,并基于MVC模式编写背包UI的脚本,并配合背包管理器进行实现。 代码设计 publicclassBackpackManager:SingletonMono<BackpackManager> { privateDictionary<stri...
AssetBundle AB包是什么? AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包。 Unity中的AssetBundle系统是对资源管理的一种扩展,通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,可以动态地加载和卸载AB包,继而有选择地加载内容。 AB包的优势有哪些? AB包的存储位置自定义。可以放入可读可写的路径下便于实现热更。 可以自定义压缩方式。对于压缩方式可以选择不压缩或者LZMA和LZ4等不同的压缩方式压缩,满足不同的网络传输需求。 资源可以分布在不同的AB包体中,可以最大程度减少运行时候的内存压力,做到即用即加载,针对性的...
目录 前言 场景继承 在SceneModel里面添加基础的节点获取 EnemyScene.cs EnemySceneModel.cs GodotExport属性和Enum Export默认值问题 修改前 EnemySceneModel.cs EnemyScene.cs 修改后 EnemyScene.cs EnemySceneModel.cs 但是有个问题,有必要这么写吗? 导入野猪图片 图片拼接 RayCast2D射线碰撞检测 碰撞检测 碰撞层 碰撞层命名 状态机 状态机的朝向问题和加载问题 总结 前言 这个实在是拖了太久了,这次速战速决 场...
AB包的依赖 接上一小结。 在这里我们新建一个红色材质球,赋值给Cube预制体。此时不对材质球进行AB包分类,再次进行打包。运行脚本,发现红色cube成功的从AB包中加载出来。尽管我们没有将cube所依赖的材质球进行打包分类,但是打包时候unity会自动将包中的物体相关依赖打入包中【图三所示】。对于所依赖的资源我们如果不进行打包设置,也可以正常使用。 如果还是这个红色的材质球,需要被其它AB包中的预制体所使用呢?每个AB包里会默认打入一个材质球显然有些浪费AB包的空间。 我们可以设置某个公共资源打入到具体的包中,而在加载使用AB包中的资源时候,把此AB包相关依赖的其它AB包也同时加载出来...
Unity游戏框架设计之UI管理器 简单介绍 在游戏开发过程中,我们通常需要管理UI游戏对象的加载、打开和销毁等操作,同时也需要管理游戏数据和游戏数据在UI上的显示,因此我们需要一个UI管理器来统一实现上述基础功能。 我们可以基于MVC模式编写UI管理器,此时UI管理器将分为模型管理器(Model)、视图管理器(View)和控制管理器(Controller)。 UI模型管理器 简单介绍 UI模型管理器主要管理UI上数据的设置和读取。为了将数据显示到UI上,则必须选定一个UI组件作为载体。对于不同的UI组件,则有不同的设置和读取方法。因此引入UIModelType类来区分不同的UI组件。 下述代...
Unity游戏框架设计之单例Mono 简单介绍 在编写Unity脚本的过程中,我们通常需要编写一些依赖于MonBehaviour生命周期且全局始终唯一的类,比如EventManager、MessageManager、ResourceManager和UIManager等等。 我们可以基于单例模式,设计出名为SingletonMono的单例类,然后让拥有上述特性的类继承于SingletonMono单例类,来保证这些类在游戏运行过程中始终唯一。 一般的脚本必须依赖于某个场景中的某个游戏对象。而在游戏运行的过程中,我们可能频繁的切换Scene,而这可能导致我们在切换场景的过程中,不小心将Singlet...
Unity游戏框架设计之场景管理器 简单介绍 在游戏开发过程中,我们经常对Scene进行切换。为了不使场景切换时造成的游戏卡顿,可以Unity官方API利用协程的方式异步加载场景。 同时,为提升Scene切换的玩家体验,我们经常会在场景切换的开始,先显示过渡UI,然后才对目标场景进行加载。在对目标场景加载的过程中,还必须不断将加载进度更新到过渡UI上,以便玩家观察。 对于一个场景的管理,除了加载场景和卸载场景之外,还必须管理场景中的游戏对象和组件。因此我们还必须提供对场景游戏对象的创建、加载、激活、禁用、卸载和搜索等方法。组件也同理。这部分代码相对简单,因此下述代码未给出。 代码设计 publ...
GDExtension的C示例 本文按照官方文档,进行C的GDExtension插件开发,主要对文档进行复刻,同时对文档中未涉及步骤进行补充 什么是GDExtension 除了GDScript和C这两种脚本语言外,Godot引擎可以执行其他编程语言编写的代码。目前有两种方式实现:C模块与GDExtension 简单的对这两种方式进行对比: 支持的语言 是否需要和引擎一起编译 C模块 C 是 GDExtension C,Go,D,Haxe,Rust,Swift 否 GDExtension官方明确维护C版本,同时目前没有别的语言的维护计划,上表所列出的其他语言均...
目录 相关链接 前言 4:加速和减速 move_toward,加速移动 5:角色状态机 有限状态机 代码改动 改动前 改动后 如何写状态机 状态初始量 状态进入和退出 强制状态修改 熟练使用异步 6:滑墙 图片拼接 碰撞框对应 判断是否在墙上 7:蹬墙跳 优化跳跃手感 总结 相关链接 十分钟制作横版动作游戏|Godot4教程《勇者传说》0 GodotEngine4.2简体中文文档 GodotNet_LegendOfPaladinC重构项目地址 前言 这次来学习一下Godot的运动控制,Godot中内置了很多数据运算的函数,而且是使用C集成的,...
1、声道设置 (1)、不设置单声道音频大小为下图 (2)、设置单声道音频大小为下图 2、加载类型 (1)、DecompressOnLoad使用内存8.1M (2)、CompressedInMemory占用内存2.7M (3)、Streaming占用内存1.5M但是CPU暂用提升了 3、采样率和压缩格式设置 4、总结 简短音效小于200k使用默认DecompressOnLoadCPU开销少因本身占用不大所以内存占用不大 对于复杂音效大于200k长度小于5秒使用CompressedInMemory 对于背景音乐长度较长的音效使用Streaming但是会有CPU额外开销但是节省内存不卡顿...
单个skynet进程,或者说单台机器的承载业务能力是有上限的,对于负责玩家主要业务的节点,横向扩展以提高游戏承载能力是必须的。 对于滚服架构,玩家角色与指定业务节点(单服)固定对应,连接游戏业务前通过中央后台获取到指定信息进行连接。承载能力通过新增单服完成,这里我们只对世界服架构做探讨。 我们将负责玩家主要业务逻辑的skynet节点类型称为user,将负责验证登入身份信息的skynet节点称为login,单个接入的玩家使用独立的lua虚拟机代理,称之为agent,玩家唯一id称为roleid。那么user必然需要是非单点且支持动态分配扩展的,现在探讨以下几个问题: user节点如何分配 即...
MaterialEditorGUI重写的歪门邪道 序言 以前有人在群里问过怎么过滤掉unity里面的其他没有用的Shader,或者重新将工程里面的Shader列表重新排序,避免美术使用乱七八糟项目以外的Shader。 反编译 这个经过反编译代码,我找到了欺骗世界的方法。(其实也比较简单,找到绘制下拉窗口的GUI函数调用位置。然后修改过滤方法就行了。 然鹅,比较尴尬的问题是,有的函数是Internal的,需要用歪门邪道才能调用。 先用ILspy找到可以调用Editor里面Internal函数的dll,然后新建一个package,找一个不会用到的dll欺骗引擎,然后就可以在这个package里面调...
d3d12龙书阅读----绘制几何体(上) 本节主要介绍了构建一个简单的彩色立方体所需流程与重要的api下面主要结合立方体代码分析本节相关知识 顶点 输入装配器阶段的输入首先,我们需要定义立方体的八个顶点顶点结构体: structVertex { XMFLOAT3Pos; XMFLOAT4Color; }; 当然,对于更复杂的情况,我们不仅要定义顶点的位置与颜色,还要包括法线向量、纹理x坐标、纹理y坐标等等但在这里情形比较简单之后,我们还需要定义一个顶点结构体描述子数组,被称为输入布局描述数组中的每个成员与顶点结构体的成员一一对应,同时也与顶点着色器中的参数对应: std::vector&l...
ArrayList 1、Arraylist本质上是一个可以自动扩容的object数组2、由于用万物之父来存储数据,自然存在装箱拆箱3、当往其中进行值类型存储时就是在装箱,当将值类型对象取出来转换使用时,就存在拆箱。4、所以ArrayList尽量少用,之后我们会学习更好的数据容器(泛型)。 底层原理: 底层是通过数组实现的,每次容量不够的时候,声明一个容量翻倍的新数组,并且把原来的内容复制到新数组中。 Clear原理: 将数组的Count设为0,然后将所有元素的属性设为默认值(值类型为0,引用类型为null),Capacity不变,也就是说栈内存保持不变,释放的堆内存需要等下次GC时回收。 代码...
前言: 上一篇文章我们主要介绍社交游戏化趋势,并分析了直播平台面临的买量贵、变现难等问题,探讨了小游戏作为新的运营变现玩法的优势。同时还列举了各大直播平台TOP5的小游戏。今天我们继续介绍小游戏系列内容,本文是该系列的第二篇文章-方案选型篇,接下来我们分享小游戏如何做技术选型,希望对需要选型的开发者和企业带来帮助。 一、社交小游戏的技术难点 社交小游戏的开发和落地面临着方案层面和技术层面的双重挑战。在技术上,主要难点包括实现高质量且低延迟的实时音视频通信。如何快速有效地集成多款游戏,同时确保这些游戏在不同平台上的兼容性;以及维护数据和货币交易的安全性。 而从方案角度来看,挑战包括寻找或开发...