长春网站怎么推广,wordpress 文章分页 插件,如何对上传的网站做代码修改,蛋糕电子商务网站建设方案文章目录 一、游戏声音设计二、 游戏镜头设计2.1 镜头的基本参数2.2 镜头时间轴动画 三、界面编辑3.1 界面编辑器设置3.2 添加按钮事件3.3 触发编写 四、 表格编辑器#xff08;实现对话UI#xff09;4.1 一维表和多维表4.2 数据验证、搜索、保存与撤销4.3 Excel导入导出4.4 … 文章目录 一、游戏声音设计二、 游戏镜头设计2.1 镜头的基本参数2.2 镜头时间轴动画 三、界面编辑3.1 界面编辑器设置3.2 添加按钮事件3.3 触发编写 四、 表格编辑器实现对话UI4.1 一维表和多维表4.2 数据验证、搜索、保存与撤销4.3 Excel导入导出4.4 使用表格编辑器实现对话UI4.5 更多示例 五、 函数库5.1 简介 六、项目竞技场争霸赛6.1 项目简介6.2 地形设置6.3 游戏初始化6.4 战斗准备6.5 战斗中6.5.1 右键移动6.5.2 左键攻击6.5.3 Boss AI 6.6 游戏结束 七、 使用排行榜八、 不同步问题8.1 本地配置不同步日志环境8.2 线上游戏不同步定位8.3 定位不同步问题8.4 游戏不同步常见原因 Y3编辑器文档1编辑器简介及菜单栏详解文件、编辑、窗口、细节、调试Y3编辑器文档2场景编辑地形编辑、物件放置Y3编辑器文档3物体编辑器Y3编辑器文档4触发器1界面及使用简介、变量作用域、入门案例Y3编辑器教程5触发器进阶使用镜头、UI、表格、函数库、排行榜、游戏不同步 本文参考官方文档《触发器案例》和《触发器初级教程》 一、游戏声音设计 声音不仅是玩家接收游戏信息的重要途径也是游戏开发者传递情感和增强游戏体验的关键工具。游戏中的声音主要分为功能性音乐和背景音乐两大类
功能性音乐 游戏信息提示为玩家提供画面外的游戏信息提示和预警例如交互物品的存在、环境变化和潜在威胁。玩家操作反馈通过声音反馈玩家操作增强游戏互动性使玩家获得及时且全面的反馈。 背景音乐 环境渲染通过声音对游戏场景进行多感官渲染增强玩家的沉浸感。情绪渲染利用声音表达复杂的情绪如战斗的激烈、对未知的恐惧和紧迫感。
在物体编辑器中可以进入音效模块设置音效属性
淡入设置声音开始时由无声过渡到有声所经历的时间。淡出设置声音结束时由有声过渡到无声所经历的时间。调整至3D声音模式我们可以设置声音的衰减距离和静音距离。 点击“”可以为一个音乐场景添加多个声音不仅可以调节各个声音的音量还可以调整各个声音的播放概率从而使游戏中的音乐变得多样化。还可以为音效添加新的自定义属性并设置其名称、类型、值后续通过触发器调用。 在物编器-单位-单位固定属性中我们可以为单位绑定声音事件比如选择当角色升级时播放升级音效。
二、 游戏镜头设计
2.1 镜头的基本参数 打开工具栏-放置物件-镜头可以看到编辑器自带得默认镜头Initial Camera此镜头的视角为进入游戏之后的默认视角无法删除无法重命名。用户可以在场景中的任意位置点击“以当前视角设置镜头属性”来为当前视角创建镜头。用户创建的镜头可以重命名、删除。
参数说明焦点位置及镜头的指向点焦点位置指的是镜头所注视的目标点它由三维坐标X、Y、Z确定。镜头的指向是通过这些坐标来设定的表示镜头当前所看的位置。俯仰角镜头与水平线的夹角平视为零度仰视为负数俯视为正数。导航角镜头在地平面上的方向通常从参考方向如正北开始测量镜头面向正东时导航角为90度。滚转角镜头自身的旋转角度类似于歪头时视角的变化。距离镜头与焦点之间的三维空间距离。观察区域FOV镜头视野所能覆盖的范围决定镜头显示细节的区域。远景裁剪镜头显示参数超出距离范围的物体不进行渲染不显示。实时观察镜头属性改变勾选后可实时预览镜头的视角变化。与焦点的最大/最小距离游戏中玩家可通过鼠标滚轮控制镜头与焦点的距离设置此参数可进行限制。例如当二者设为一样时玩家视角将被限定无法使用鼠标滚轮调整距离。 2.2 镜头时间轴动画 使用镜头时间轴动画和使用触发器都可以实现镜头动画二者在最终的画面表现上没有区别但却各有优势
镜头时间轴动画可以在时间轴内通过设置关键帧的形式方便快速地制作镜头动画。但每条时间轴镜头动画不能复制无法复用。触发器触发器编写的自定义程度高语句还可以复制粘贴具有很强的复用性和扩展性。相关定义详见触发器-镜头API 点击新建的“镜头时间轴动画1”右侧的编辑按钮即使用当前画面视角为初始帧创建时间轴动画。每条时间轴动画由两个部分组成分别是 时间轴和 当前关键帧下镜头的属性面板。 我们可以在时间轴上拖动进度条或是在frame窗口中输入具体帧数来选择关键帧位置。Y3编辑器使用的刷新率为30帧每秒所以如果设置关键帧在第60帧就是在第两秒。点击上方的创建按钮即可在所处位置为所选参数新建关键帧。 关键帧分为绝对值当前关键帧下镜头的具体参数和相对值相对于初始帧所改变的取值。当指针选定一个关键帧时点击鼠标右键即可对关键帧进行复制、粘贴、删除按下delete按键也行等操作。编辑并保存关键帧之后在触发器中可以编写镜头触发事件 三、界面编辑
本节课我们要实现以下效果 界面编辑器是对软件的人机交互操作逻辑和界面美观进行的整体编辑我们通常会用到图像、文字、按钮等组件在界面上与操作者进行互动从而丰富和增强用户的体验。Y3编辑器中UI编辑器的操作界面主要由五个部分组成 画板区在开始做一个界面之前必须先创建一个画板。节点区用于展示每个画板里面的各个控件。所有组件都以树结构来陈列包含了一组节点节点之间相互关联并且具有父节点和子节点关系节点的任何附属节点都称为子节点。删除一个节点其所有子节点也会被一起删除。控件栏展示所有可使用的UI组件包括按钮、图片、模型、文本输入框、进度条、滑动条列表等。画布区在画布中编辑摆放组件并查看组件属性。属性/事件区前者用于编辑组件的具体参数包括大小、位置、外观、动画等后者配合触发编辑器去实现一些想要的功能。
3.1 界面编辑器设置 首先在地图上放置一个用于选择的单——探险者在法师周围绘制一个圆形区域命名为select _area,表示进入这个区域会触发宝物选择界面。
创建空白画布打开界面编辑器单击创建一个新的画板并重命名为select_treasure。缩放画布大小为33%。创建选择框底板拖动顶部图片按钮到画布中央在资源库中选择喜欢的图片控件-背景纹理-场景立绘装饰框。拖动图片锚点放大图片或者通过x轴y轴坐标进行放大。最终坐标960540尺寸18001000。设置界面标题拖动顶部文本按钮到底板上调整位置和大小输入“请选择一个你喜欢的宝物”作为选择框的标题并命名为title。设置文本的字体颜色和对齐方式让它们看上去更美观一些。 设置玩家选项1拖动一张图片控件图标-蓝色控件图标到画布上根据喜好调整位置700540、尺寸320400命名为button1。将另外一个图片图标-勋章-蓝色面具成就图标拖动至button1内作为奖励的展示图标icon1尺寸156×156选择文本并将其拖至button1内作为奖励的名字name输入“魔法戒指”并调整字体颜色和位置。调整父子级关系以图片为父节点将title,button1拖动到图片下作为相互平行的子节点。将icon,name拖动到button1下作为其子节点。这样icon,name,button1就可以作为一个整体被选择。设置玩家选项2复制并粘贴一个新的选项重命名为button2调整级别和位置更改图像和文本完成第二个按钮。 3.2 添加按钮事件 界面组件设置完毕后我们为按钮添加事件。选中button1右上角点击事件点击添加事件并命名为choose_ring。点击“空事件-事件设置-点击”。同样的方式为button2选择点击事件并命名为choose cloak。 在事件板块点击音效可以选择事件的音效点击界面上方的动画编辑可通过时间轴管理为事件制作帧动画。时间轴和动作设置板块中的动画效果互相排斥如果在动作设置板块中选择了一个动画效果则时间轴不生效。 由于整个画板在事件触发前是不可见的所以选中整个画板select_treasure选择属性将是否可见取消勾选这样我们绘制的整个界面组件在触发调用前是不可见的。
3.3 触发编写
整个触发分三部分
当选择单位进入到对应的区域后会出现选择框选择按钮A左侧信息栏提示A内容选择按钮B左侧信息栏提示B内容
下面是具体的编写逻辑
触发器-进入区域 在物编器的触发器页签下创建任意单位进入select _area区域事件将此事件命名为“进入区域”。新建条件-单位类型判断获取事件中单位的单位类型等于探险者。新建动作-界面-显示/隐藏控件对玩家1显示控件。 触发器-选择戒指 创建事件界面-控件事件参数UI事件选择choose ring。创建动作选择界面-显示/隐藏控件来向玩家1显示控件select_treasure选择完毕不需要再展示选择界面。创建动作选择界面-系统消息提示来向玩家提示“你选择了魔法戒指”持续时间设为5秒。 触发器-选择斗篷 直接复制上一条触发器重命名为选择斗篷UI事件改为choose cloak第二条动作命令信息显示内容修改为“你选择了魔法斗篷”。 应该添加一个全局变量表示经过了选择即只能选择一次。 四、 表格编辑器实现对话UI 在故事中我们通过对话UI向玩家传达了剧情的重要信息。不同的对话内容需要多个UI来呈现吗其实不用在Y3编辑器中我们可以结合表格编辑器、界面编辑器和触发来实现这个效果。
4.1 一维表和多维表 表格编辑器是Y3编辑器提供的数据管理工具我们可以在表格编辑器中以表格的形式保存数据并之后通过触发来快速调用这些数据比如怪物的物品掉率刷怪时怪物种类和数量。 在表格编辑器中有两种表格一维表和多维表。一维表中每一行都是一条独立的数据包含键名、类型、值和备注。通过键名也就是索引我们就能快速获取到对应的值。 一维表适合定义零散的各种数据比如游戏初始化时的一些规则和参数。假设你的《练功房》项目中一共会有六个房间你想分配其中有两个房间产出经验有两个房间产出金币并且希望在游戏中时间12时开始刷新怪物14时之后就停止刷新怪物。由于这些数值关系到项目中设定的经济产出如果你希望快速地调整这些数值可以将这些数值保存在一维表格中 假设你正在制作一个《塔防》项目在第1波次一共有30只恶魔进攻玩家玩家需要在60秒内把他们消灭。这里波次有“顺序”、“怪物数量”、“怪物类型”、”消灭时间”四个关键属性可以使用多维表格管理数据。多维表中每条数据包含多个属性及其数值我们需要两个索引才能锁定数据位置。 多维表适合定义一个数据对象表格中的第一行是这个数据对象的属性名称(key)第二行是这个属性的数据类型第三行及之后的行则是对应的值。如果数据类型选错了那么你可能没有办法在触发器中正确的拿到你想要的数据。 4.2 数据验证、搜索、保存与撤销
多维表可灵活添加行和列一维表固定只有三列不能新增列。不允许出现相同的主索引值且主索引只能是整型或字符串类型数据验证标红的单元格意味着该数据无法在局内读取到。若是在你配置过程中出现可能只是因为你的表格还没有编辑完成而系统提前在验证。数据配置后仍有单元格标红可把鼠标悬浮在红框上查看具体原因如关键数据的缺失或不匹配或重复再予以修复。 重命名右键点击一张表或选中后按F2可进行重命名表格归类点击文件夹图标按钮或CtrlG可创建文件夹归类表格。保存与撤销保存按钮是保存整个工程而撤销按钮只针对你在表格编辑器内的操作。
4.3 Excel导入导出 表格编辑器并不支持如office中公式、填充柄、甚至VBA等一些高级功能的应用。如果要进行高效开发推荐先使用Excel进行快速编辑再导入编辑器。表格编辑器用于快速验证调试游戏体验。 点击导入你可以选择一个表格文件将其导入至编辑器中当前支持的表格格式有”.xlsx”,”.xlsm”,”.xls”,”.csv”共四种。
一维表导入所有以“kv_”开头的sheet将读取为一维表 标题行第一行为标题行限定内容为“Key,Type,Value,Des大小写允许模糊。数据行第二行往后为数据行 多维表导入所有config_作为前缀的sheet表格将读取为多维表 第一行为注释行不读取第二行为数据名读取后视为列名第三行为数据格式支持int,string,float,bool四个类型支持大小写模糊第四行为主键标识格式需要是整型或者字符串类型以key1,key2,key3进行枚举支持大小写模糊。最多支持三键表需有key1才能有key2需有key2才能有key3否则报错导入错误。如果没有key则生成一个”key1“列作为主键以行号填写值。第五行之后为表格的数据涉及到的公式等特殊格式以结果的值进行读取。
4.4 使用表格编辑器实现对话UI
在表格编辑器内定义的表格在游戏初始化时将会保存在内存中供你在任意的触发器中调用 下面我们就来看一看表格编辑器的具体使用方法。 绘制UI绘制一个界面来承载和展示对话内容 打开界面编辑器添加一个新面板并将其重命名为dialogue。这个界面应包含两个图片一个作为content背景框体-对话框527×190一个作为real name角色的背景以及两个分别用于承载real name和content文本框。拖动调整这些控件的大小和位置在文本设置中设置文本的字体样式微软雅黑24调整空间的父子级关系。选择整个面板并取消勾选是否可见表示直到它被触发才显示对话界面。 创建多维表创建多维表并将其重命名为scripts。在scripts中将主索引key修改为order存储对话顺序整型。添加两个类型为字符串的属性role name和content分别存储角色名称和对话内容。 触发编写 新建事件硬件输入-键盘空格键按下事件新建动作设置对话顺序设置一个全局整数变量order来记录空格键被按下的次数初始值为零。使用函数-整数间运算设置变量order为order1这样当我们第一次按下空格键时order都加1。新建动作显示角色名称选择界面-设置文本对玩家一设置dialogue面板下的real name文本字符串参数选择函数然后选择第二个多维表中的字符串值。现在当我们第一次按下空格键时order1主索引为1的role name数据将读取显示。当我们再次按下空格键时order2主索引为2的role name的数据将被读取显示。新建动作显示角色对话文本操作同上 4.5 更多示例
一维表用例配置了如下的一维表命名为globalConfig。 可直接通过Type类型对应的参数类型在获取到Key对应的Value值。 多维表用例配置了如下的多维表命名为Example。 最基础的使用方式为直接获取表格中的值如我当前需要获得id为1的数据中的use_money字段数据将其存入变量a中。可以采用这样的方式 常用方式是遍历表格实现一些逻辑 五、 函数库
5.1 简介 在之前的章节中我们使用循环计时器连续生成次元入侵者。那如果需要在多个区域在不同的时间点生成敌人是否需要写多个触发器重复设置效果呢当然不是Y3编辑器为我们提供了一种更简单的方法来重复实现简单的功能即函数库。 你可以将自己常用的触发器语句/功能模块添加到函数库接着就可以在触发器中找到该函数语句进行重用。与触发器的操作逻辑相同在左侧创建函数后在右侧编辑功能库函数。 初始化玩家技能槽位 函数描述定义了函数在操作列表中的显示方式。 函数描述包括以下内容
名称要生成的触发器语句的名称。描述要生成的触发器语句的内容和格式。提示当前函数的说明。 函数体包括以下内容
参数定义了该函数的输入数据可设置参数类型如定时器、单位和整数。返回值定义了函数执行后返回的结果输出数据。你可以点击 来设置返回值的名称和类型以方便触发器的后续调用。动作显示了函数的具体行动逻辑 现在我们想要实现的效果是在三个指定的地点间隔0.3秒生成一个指定类型的野怪总共生成五个。我们可以使用函数库简化具体的编写过程。
触发组件我们需要在地形上放置敌对单位、boss和探险者。 在boss周围绘制三个点区域分别命名为point A、Point B、Point C。以boss为中心绘制一个圆形区域alert area作为boss的警戒范围自定义三个不同的小怪他们会在三个点生成。 自定义函数库函数 在函数库中新建函数命名为“野怪刷新”参数为Monster小怪单位类型和Point刷新点点击左边的可用参数使用刚刚创建的参数组成函数描述“在参数Point处创建参数Monster”。新建一个技数计时器设定每隔0.3秒运行一次共运行五次选择“立即执行”在动作列表中选择创建单位单位类型是参数Monster点是函数参数Point为单位boss创建方向是单位boss的方向。添加一个动作来向怪物发出命令选择“单位发布命令”设置命令为“攻击移动”。 触发编写调用函数库通过设置不同的参数和计时器来在不同时间和地点生成敌人。 新建“任意单位进入区域事件”在单玩家位进入BOSO警戒区域两秒、三秒、四秒后分别使用“野怪刷新”函数在三个点刷新小怪。
六、项目竞技场争霸赛
6.1 项目简介 游戏的制作一般分为三大类
设计包括游戏的核心玩法和故事背景。美术负责游戏的原画角色、物体和场景的三维建模。程序设计通过代码实现游戏玩法。 本项目“竞技场争霸赛”是一款射击类小游戏一个人就足以完成开发。核心玩法是玩家控制挑战者挑战怪物通过移动和射击来躲避怪物攻击和击败怪物。每隔几秒钟怪物就会热身蓄力然后冲锋玩家必须使用鼠标右键移动进行躲避然后使用鼠标左键精瞄准射击击败怪物所以游戏两大核心机制是移到和射击 另外游戏将从游戏印象和游戏沉浸两个角度进行设计。由于挑战者在攻击时不能移动所以玩家在何时躲避危险和何时瞄准目标之间保持平衡是很重要的这带来了挑战和乐趣。在游戏沉浸方面我们可以通过动画、镜头、角度、滤镜等去创造过程带来令人印象深刻的游戏体验玩家将在游戏开始时更加兴奋在游戏结束时更感到印象深刻。 时间有限下面只展示必要步骤。
6.2 地形设置
新建空白工程选择小型地图64×64和自定义UI模板。创建生物单位挑战者、boss、观众和抛射物探险者的子弹。 挑战者模型选择仙人掌人血条样式为绿色血条显示模式为不满血显示取消勾选死亡后销毁单位取消勾选无法反击时逃跑。最大血量设为30生命恢复设为0。 复制挑战者模板BOSS模型选择图示小怪物血条显示红色单位状态里设置禁止普攻 观众选择图示小怪物无血条显示单位状态选择无效 抛射物选择绿色法阵符文特效缩放0.6 绘制陆地碰撞 为挑战者、BOSS和观众设置出生点设置挑战者和BOSS的战斗准备圈放置一个几乎覆盖整个竞技场的战斗圈作为boss的攻击区域
6.3 游戏初始化
在“竞技场争霸赛”这款游戏中我们将游戏分为以下四个阶段
游戏初始化镜头跟随玩家设置变量为游戏角色伤害初始值。战斗准备挑战者和boss的嘲讽动作摄像机跟随。战斗中实现鼠标操作右键移动、左键射击boss的AI逻辑蓄力和冲锋。战斗结束根据胜者播放不同的动画和滤镜效果结束游戏。
我们先完成第一阶段游戏初始化
刷出挑战者并设置镜头让玩家以第三人称视角跟随他。设置一个2s的计时器给玩家一点缓冲时间让他们意识到游戏即将开始。向挑战者发布命令移动到挑战者准备区为了提高游戏的沉浸感邀请观众参加战斗。 点击基础-收纳盒设置一个存储框设置一个观众点数组存储所有观众点设置完后折叠起来使界面更简洁。 设置一个循环来生成观众并让他们的方向朝着战场中心。最后将每个观众都添加到观众单位组中这样游戏结束时我们就可轻易命令单位组成员播放庆祝或挫折动画了。
6.4 战斗准备
当挑战者进入准备圈时我们需要做三件事
移除挑战者的准备圈防止重复挑战者准备逻辑挑战者停止下来播放嘲讽动画作为准备战斗的信号boss进入战斗区域并使用镜头跟随它
当BOSS进入它的准备圈时也有三个工作
移除boss的准备圈播放boss嘲讽动画将比赛气氛推向高潮等待2s后战斗开始让镜头恢复正常并允许玩家控制角色。
最后创建一个全局布尔变量battleongoing默认值为false现在为true表示正在战斗中。 6.5 战斗中
6.5.1 右键移动 为了在游戏中实现鼠标操作我们设置了右键移动左键射击。移动机制为当玩家按下鼠标右键并且布尔变量battleongoing为真时让角色移动到鼠标位置。 6.5.2 左键攻击
当玩家按下鼠标左键且battleongoing为真时创建一个局部变量为鼠标的游戏坐标point为当前玩家坐标命令挑战者停止防止可以边移动边攻击将方向设置为从point朝向clickedPoint的方向播放攻击动画完成开枪逻辑 在point处创建投射物设为变量方便移除添加运动器来设置子弹的直线运动轨迹和造成的伤害在移动完成后将运动器和抛射物移除创建碰撞运动器实现子弹的射击伤害并跳字显示 6.5.3 Boss AI
Boss的AI逻辑有两个部分蓄力和冲锋。
每三秒如果battleongoing为真怪物将停止移动并播放循环蓄力动画idle22秒钟后怪物会播放一个循环冲锋动画并为自己创造一个线性的移动器达到高速移动的效果。BOSS移动位置为战斗区中随机位置。使用碰撞移动器让BOSS冲锋时对碰撞的敌方单位造成真实伤害 6.6 游戏结束
当任何单位死亡时战斗结束。我们需要停止玩家的控制权限播放结束过场动画并结束游戏。
创建一个触发器触发事件为任意单位死亡设置battleongoing为False将摄像机对准胜者如果是挑战者这意味着玩家赢了让我们为挑战者和所有观众播放赢家动画。设置一个闪闪发光的滤镜效果使这个庆祝时刻更愉快并以胜利结束游戏。如果胜者是boss播放输家动画设置对应的滤镜。 七、 使用排行榜 点击主界面【细节】-【存档设置】打开存档槽设置 点击加号创建一个新的存档槽并修改存档槽数据类型为整数 选择确认计入排行榜这个存档槽位就变成了排行榜存档。可以选择排行榜排序规则升序降序与排行榜最大人数。 使用以下eca可以获取排行榜上所有玩家的存档值配合界面eca让排行榜在界面显示。玩家-整数型增量存档eca可以让整数类型存档保持只增效果。
排行榜数据在游戏启动后不会再刷新使用双槽位可以实现周排行榜。 创建两个整数类型存档槽位A与BA存储第一周所有玩家的排行榜数据 当一周结束时通过时间戳判断使用B榜存储玩家在第二周的排行数据 在第二周开始时通过ECA清除玩家A槽位数据以备第三周存储玩家排行数据。需通过在作者之家清除A榜数据权限需找运营申请。 当第二周结束时将玩家排行榜数据存储在A榜并清除B槽位数据循环往复
八、 不同步问题 参考《不同步相关》 8.1 本地配置不同步日志环境 用户由于使用ECA不当频繁出现游戏逻辑不同步的问题会影响游戏正常运行。此时可通过在本地多开测试来进行调试。在【通用设置-调试】打开本地多开同步检测。 使用Lua文件配置更详细的不同步日志打开地图路径下Script文件夹下的main.lua文件在lua文件中配置不同步日志相关API
GameAPI.api_set_enable_detail_snapshot(true)
GameAPI.api_set_detail_snapshot_enable_tag(0xfffffff)
GameAPI.api_set_enable_eca_snapshot(true)
GameAPI.api_set_snapshot_traceback_level(2)配置完毕后本地多开运行游戏。如遇游戏逻辑不同步会有弹窗提示并在本地生成不同步日志以供用户定位不同步问题。
不同步日志Lua配置API说明
API描述参数返回值api_set_enable_detail_snapshot控制不同步日志记录的总开关。关闭后其他设置接口将不生效但可以提升性能。enable(bool)是否开启默认为false无api_set_snapshot_traceback_level设置日志堆栈记录详细等级默认0不记录1仅记录最近一层堆栈2记录完整堆栈数据压缩3记录完整日志不压缩数据量稍大记录越完整越有利于定位问题但开销增大level(int32)堆栈记录等级默认值为0无api_set_enable_timer_snapshot开启或关闭计时器不同步检测日志检测额外创建的ECA计时器但计时器不一致并不一定意味着游戏内容不同步。enable(bool)默认值为false无api_set_enable_eca_snapshot开启或关闭ECA不同步检测日志开销较高。可通过参数过滤掉一些安全的API以防止误报例如创建特效、UI操作等enable(bool)默认值为false无filter_mode(int32)过滤模式默认为11剔除模式不记录filter_set中指定的api0包含模式仅记录filter_set中指定的apifilter_set(table)过滤集合默认为client_only,client_possible可传入想要剔除/包含的API取决于上个参数如GameAPIprint_to_dialog,“GameAPIget_function_return_value。”api_set_detail_snapshot_enable_tag设置不同步详细日志级别。越详细越利于定位不同步产生点但性能消耗会增高tag(UInt64)控制开启哪些日志的mask 1运动器tick2运动器碰撞检测4寻路回调8寻路坐标更新16血量变化32坐标瞬变0xFFFFFFFF全部开启默认开启1632无add_detail_log记录自定义日志log(string)日志内容bool值恒定为true
8.2 线上游戏不同步定位
在本地配置不同步日志环境 打开地图路径下Script文件夹下的main.lua文件在lua文件中配置不同步日志相关API这样线上游戏发生不同步时根据配置API玩家客户端会自动上传日志。例如
GameAPI.api_set_enable_detail_snapshot(true)
GameAPI.api_set_detail_snapshot_enable_tag(0xfffffff)
GameAPI.api_set_enable_eca_snapshot(true)
GameAPI.api_set_snapshot_traceback_level(2)下载不同步日志 使用KK账号登录编辑器打开任意地图点击【菜单栏】【调试】【查看不同步日志】查看线上游戏的不同步日志。 查找需要定位问题的对局下载不同步日志不同步日志包含对局中所有玩家的对战信息。
8.3 定位不同步问题 不同步日志文件中包含的是出现不同步情况的帧信息通过对比玩家日志差异可以大致定位到问题所在。打开不同步日志文件夹使用第三方文本对比工具进行对比推荐使用BeyondCompare。比如在main.lua文件中进行了如下配置
GameAPI.api_set_enable_detail_snapshot(true);
GameAPI.api_set_enable_timer_snapshot(true);打开不同步日志查看逐帧信息 将多名玩家日志成对拖放到beyondcompare中进行对比发现玩家2比玩家1多了一个timer 通过对不同步信息附近的帧信息进行理解可大致定位问题为某个客户端上多了一个循环计时器在项目中进行查找可能的问题所在。
8.4 游戏不同步常见原因
本地值 在单个客户端即单个玩家的设备上有效的数据比如界面显示、特效、镜头位置、声音等这些数据在不同的客户端之间不需要同步因为它们只影响单个玩家的体验。任意值与【本地值】进行逻辑运算后得到的值等价于【本地值】动作类ECA中修改【本地值】不会影响游戏的全局逻辑因此不会影响游戏的同步性。 本地操作针对本地值的操作如【获取本地玩家】、【获取本地控件坐标】、【获取镜头焦点】、【获取滑动条当前值】等这些获取本地值的ECA函数在不同客户端得到的结果也是不同的。全局值在所有客户端之间需要保持一致的值比如单位、技能、物品等。这些值的一致性对于游戏的公平性和逻辑一致性至关重要。全局操作针对全局值的操作比如修改单位的状态、技能的效果、物品的数量等。这些操作会影响游戏的全局逻辑因此需要确保在所有客户端上都能正确同步。 导致游戏逻辑不同步的一个重要原因就是将【本地值】作为参数传递到【全局操作】中或者是使用【本地值】进行逻辑判断后进行【全局操作】。这会导致不同客户端执行不同的逻辑最终导致不同客户端上【全局值】不同即游戏逻辑不同步。更多内容详见文档多人联机同步机制。