当前位置: 首页 > news >正文

y3编辑器教学5:触发器2 案例演示

文章目录

    • 一、探索
      • 1.1 ECA
        • 1.1.1 ECA的定义
        • 1.1.2 使用触发器实现瞬间移动效果
      • 1.2 变量
        • 1.2.1 什么是变量
        • 1.2.2 使用变量存储碎片收集数量并展现
      • 1.3 if语句(魔法效果挂接)
        • 1.3.1 地形设置
        • 1.3.2 编写能量灌注逻辑
        • 1.3.3 编写能量灌注后,实现传送逻辑
    • 二、战斗
      • 2.1 循环
      • 2.2 数组
      • 2.3 计时器
      • 2.4 单位组
    • 三、升级
      • 3.1 技能
        • 3.1.1 地形设置
        • 3.1.2 触发编写
      • 3.2 界面编辑
        • 3.2.1 界面编辑器设置
        • 3.2.2 添加按钮事件
        • 3.2.3 触发编写
      • 3.3 运动器
    • 四、优化
      • 4.1 游戏声音设计
      • 4.2 游戏镜头设计
        • 4.2.1 镜头的基本参数
        • 4.2.2 镜头时间轴动画
      • 4.3 表格编辑器(实现对话UI)
        • 4.3.1 一维表和多维表
        • 4.3.2 数据验证、搜索、保存与撤销
        • 4.3.3 Excel导入导出
        • 4.3.4 使用表格编辑器实现对话UI
        • 4.3.5 更多示例
      • 4.4 函数库
    • 五、项目:竞技场争霸赛
      • 5.1 项目简介
      • 5.2 地形设置
      • 5.3 触发器设置
        • 5.3.1 游戏初始化
        • 5.3.2 战斗准备
        • 5.3.3 战斗中
        • 5.3.4 游戏结束

  • Y3编辑器文档1:编辑器简介及菜单栏详解(文件、编辑、窗口、细节、调试)
  • Y3编辑器文档2:场景编辑(地形编辑、物件放置)
  • Y3编辑器文档3:物体编辑器
  • Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)

一、探索

参考《开发者学院:系统化教程》

1.1 ECA

1.1.1 ECA的定义

Y3编辑器中触发器可以实现游戏内的所有功能,触发器由三部分组成:

  • 事件(Event):触发器的导火索,当设定的事件发生时触发器才会执行。
  • 条件(Condition):触发执行必须满足的条件。
  • 动作(Action):触发执行的结果。
    在这里插入图片描述

  当事件被激活,满足了条件后才会执行动作。例如短跑比赛中,信号枪响(事件),只有参赛者(条件)会开始跑步(动作)。

1.1.2 使用触发器实现瞬间移动效果

本视频中实现瞬间移动的步骤为:

  1. 地形设置:在地图上放置一个单位,在传送阵处绘制圆形区域。在希望角色被传送到的地方绘制一个点。点和区域在编辑器里是可见的,但在游戏中会处于隐藏状态。

  2. 触发编写

    • 新建事件(Ctrl+E):当任意单位进入圆形区域时触发,所以选择单位->任意单位区域事件。区域行为选择进入,区域选择刚刚绘制的圆形区域。

    • 新建条件(Ctrl+D):只有神秘人进入才会触发动作。设置单位->单位类型-判断,触发选择单位类型->函数->获取单位类型,判断符选择等号,第二个字段选择自定义的神秘人

    • 新建动作(Ctrl+R):神秘人移动至点P1。

      • 移动命令:选择单位->强制移动动作,选择单位->函数->获取事件中的单位,坐标选择刚刚创建的点。
      • 发布停止命令:不设置的话单位瞬移后会立马跑回去。选择单位->发布命令->停止
      • 相机跟随单位:为了增加玩家视觉体验,设置镜头->第三人称跟随单位。玩家选择玩家1,镜头焦点选择跟随事件中的单位。

在这里插入图片描述

1.2 变量

1.2.1 什么是变量
  • 变量是可能随时变化的值,比如人的体重或年龄。
  • 变量按照作用域分为局部变量和全局变量。局部变量只在单个触发器内有效,而全局变量可以在整个触发器中被调用。
  • 变量不能重名
  1. 变量类型:变量在创建时,需要声明其类型,这包括:

    • 布尔型:True或False。
    • 整数型:整数,如12345。
    • 浮点型:实数,如4.633,也可以存储整数。
    • 字符串型:由数字、字母和符号组成的字符序列,用于存储游戏中的文字。
  2. 变量类型限制

    • 一旦定义了变量类型,该变量只能存储该类型的数据。
    • 不同类型的变量不能直接进行数学运算或拼接。
1.2.2 使用变量存储碎片收集数量并展现

  游戏中,探险者收集六个次元石块并修复传送阵,这需要通过设置一个整数变量来记录探险者收集的石块数量。具体实施步骤为:

  1. 地形设置

    • 打开物体编辑器,创建一个新的物品(石块),并设置模型和图标。
    • 在表现页面,可以预先设置石块大小,提前调整
    • 将在地图上放置六个石块,注意间隔。
      在这里插入图片描述
  2. 触发编写:触发的核心,是需要设置一个整数变量去记录探险者收集的石块数量。

    • 创建事件:创建一个新的触发器,设置事件为物品->单位获得事件
    • 创建动作:选择基础->变量-设置变量->全局变量(可重命名为number,类型选整数)来记录石块数量,初始值为0。
    • 实现累加逻辑:每次探险者获得石块时,变量number增加1。所以设置第二个参数整数->整数间数学运算。第一个变量为number,运算符为+,第二个变量设为1,这样每获得一个石块,数量就累加1。
    • 存储石块数:为了增加用户体验,创建一个字符串变量来存储和显示累计拾取的数量并展示。选择变量->设置变量->局部变量(字符串类型,可命名为message)。设置为字符串->字符串拼接。第一个字符串为“累计拾取数为:”,第二个为number。由于整型要转为字符串类型才能拼接,选择字符串->任意变量转为字符串,选择待转换的变量为整数->全局变量->number
    • 展示消息:选择界面->系统消息提示,选择向玩家1显示message信息,持续时间可自己调整。

在这里插入图片描述

1.3 if语句(魔法效果挂接)

魔法效果挂接参考《挂接流程》

  if流程语句的结构如下,条件可以是取反(not语句)、所有条件成立(and语句)、任意条件语句(or语句)或者所有条件不成立。
在这里插入图片描述
下面用if语句实现献祭能量后激活传送阵的效果。

1.3.1 地形设置
  • 在物体编辑器中新建两个自定义装饰物(能量圈和传送门)和一个自定义单位(探险者)放置在地图上。
  • 在能量圈和传送门的位置各绘制一个圆形区域,并分别重命名为能量圈区域和传送门区域。
  • 在希望被传送到的位置绘制一个点,重命名为point。
  • 新建能量获取魔法效果:选择魔法效果->创建->普通->右上角获得特效列表下选择一个蓝色护盾buff特效。选择左上 模型编辑器-模型,可以查看在不同单位模型效果。单机特效标签,弹出的窗口中还可以对效果进行旋转和缩放,以及选择挂接点。
    在这里插入图片描述

在这里插入图片描述

1.3.2 编写能量灌注逻辑

需要新增一个全局变量infusion来判断探险者是否进入能量泉进行了能量灌注,类型为布尔值。

  • 创建事件:选择单位任意单位进入区域(魔法区域)
  • 创建注入动作:选择基础->设置变量,新建全局变量重命名为infusion,类型为布尔值,默认为False。进一步设置变量infusionTrue,表示单位进入能量泉后,能量注入成功,infusion应为True
    在这里插入图片描述
  • 创建魔法效果动作:选择魔法效果->添加魔法效果。第一个参数魔法效果类型,选择刚刚自定义的获得能量护盾效果(蓝色护盾buff)。第二个参数单位选择探险者。
    在这里插入图片描述
1.3.3 编写能量灌注后,实现传送逻辑

  如果条件满足(探险者已能量灌注),则执行if b动作列表,将探险者瞬移到点point并发布停止命令。如果条件不满足,则执行else动作列表,提示传送失败。新建一个触发器:

  • 创建事件:单位->任意单位进入区域
  • 创建动作:基础->条件IF/THEN/ELSE,旁边的+号点击后选择基础->布尔值判断,判断条件为infusion=True
  • 创建Then语句:探险者瞬移到point,然后发布停止命令
  • 创建Else语句:选择界面->系统消息提示,参数分别选择玩家1和“传送失败”。
    在这里插入图片描述

二、战斗

2.1 循环

循环是指重复执行某项动作。在Y3编辑器中,循环有三种类型:

  1. 指定次数或指定整数变量重复执行:这是最常用的循环触发方式,例如,设定NPC敲门三次,动作会重复三次后自动停止。

  2. 条件成立,重复执行:在条件满足的情况下,进行无限次的循环,直到条件不再满足。例如,如果条件是门关着就敲门,那么敲门动作会一直重复,直到门开了才会停止。

  3. 遍历数组变量循环:根据数组的索引数字,对数组中的每个单位重复执行动作。例如,有一个不同门的列表,NPC会按照顺序敲门,直到所有门都被敲过。

在这里插入图片描述

指定次数循环实现召唤六个次元种子

  1. 地形设置
    自定义创建黑袍男单位并重命名为boss,自定义特效种子(投射物)重命名为Seed。将boss单位放置在地图上,并以boss为中心绘制一个圆形区域,重命名为alert_area
  2. 触发编写
    • 创建事件:选择单位->任意单位区域事件,设置参数为任意单位进入alert area(任意单位包括boos啊,得指定玩家才行,非boss都不行)。

    • 创建动作

      • 创建一个变量循环,Seed number变量类型为整数,从1到6做动作表示循环六次,创建六个种子。变量Seed number存储当前循环的整数数字。
      • 创建一个角度变量angle,使用函数->数学运算->角度运算,选择已创建的整数变量Seed number,乘以60,得到从60度到360度的六个平均分布的方向,确保投射物出现在boss周围。
        在这里插入图片描述
    • 创建一个点变量loc(点类型),用来记录种子出现的点。选择函数->路径-点向方向偏移,初始点为boss所在点,方向为变量angle,偏移距离设置为300

    • 添加动作为boss创建种子。选择投射物,创建投射物seed,位置为变量loc,可选参数中选择持续时间为5秒。

在这里插入图片描述

2.2 数组

  数组是相同数据类型的集合,数组中的每个元素都在其基本值上添加了一个索引,使我们在数组中更容易找到和访问它们。整数、单位、实体、单位名字、物品实体等变量都可以设置为数组。

  下面使用数组实现六个黑暗守卫一起进攻的游戏效果。地形上我们复用上一节的地形。触发编写为:

  • 创建事件:键盘按键H按下(硬件输入->键盘-按下->H)。
  • 创建动作
    • 设置一个局部变量guards,类型为单位类型(不是单位),这里要勾选数组。分别设置1~6对应我们需要的六个黑暗守卫单位(类似语句可以直接复制粘贴,还是太不优雅了)。
    • 利用上节课学习到的循环,创建一个变量循环numGuard,从1~6循环。
    • 我们同样需要创建变量angleGuardlocGuard,来存储黑暗守卫出现的方向和位置。
    • 添加动作为boss在locGuard创建guards,数组变量guards的索引为变量numGuard

在这里插入图片描述

2.3 计时器

  计时器就好比一个沙漏,在计时结束后开始执行某项动作。我们可以用计时器来处理和时间有关的游戏逻辑。在编辑器中,计时器一共有三种:

  1. 运行单次计时器:计时器运行一次后开始执行动作。例如,倒数三秒后约翰的门就会打开。
  2. 运行循环计时器:计时器循环运行,每次运行后都会执行动作。例如,每隔一秒约翰的门就会打开一次。
  3. 运行固定次数的计时器:计时器中间停留固定时间,固定次数的计时器。例如,每隔一秒约翰的门就会打开一次,一共打开三次。

在这里插入图片描述

本节使用计时器实现一只只次元入侵者从裂缝中爬出来的效果。

  1. 地形设置
    • 在地图上绘制一个点(区域->点),重命名为“裂缝”。
    • 打开物体编辑器->生物,自定义次元入侵者。头顶无显示,血条样式无血条,取消勾选是否有技能资源条,取消勾选是否在小地图显示,修改攻击范围为10。
      在这里插入图片描述
  2. 触发编写
    • 创建事件:键盘按键J按下事件。
    • 创建动作
      • 选择循环计时器,每两秒循环一次。通过设置语句中的布尔值参数,我们可以选择“立即执行”或者选择“等待两秒后再执行第一次动作”。我们在这里选择true,即立即执行。
      • 动作列表中,创建你想要生成的单位,在刚才绘制的点“裂缝”处创建,面向角度跟boss一样。
        在这里插入图片描述

2.4 单位组

  单位组是由一个或多个单位组成的集合,单位组里面的所有元素的类型都是单位。单位组也可以是一组不同类型的单位组成的集合。合理利用单位组,我们可以在游戏制作中节省大量的时间。在单位组中,我们能同时对所有的单位发布命令。

  下面使用单位组实现主人公发送特技“次元入侵”,入侵者瞬间死伤殆尽的效果。

在这里插入图片描述

  1. 地形设置:在地图上放置一些自定义的次元入侵者和一名次元统领,设置他们的单位所属为中立-敌对,再将我们的主角探险者放置在地图上。
  2. 触发编写
    • 创建事件:硬件输入键盘按键按下,选择按下K键。
    • 创建动作
      • 设定一个局部变量,变量名invaders_Group,类型为单位组,我们将次元入侵者设为单位组中的指定单位类型(函数->单位组->指定类型的单位->次元入侵者)。
      • 选择单位组invaders_Group,遍历其中的单位,在动作列表中添加单位->杀死单位。第一个参数选择“获取单位组中遍历到的单位”,凶手为“探险者”。现在单位组invaders_Group中的所有单位将被一起杀死。

在这里插入图片描述

三、升级

3.1 技能

技能的释放简单来说,有三个关键点:

  • 施法开始:在施法开始节点后会播放单位的施法动作,比如魔法师抬起魔杖
  • 施法引导:施法过程的开始,例如魔法师开始念咒语
  • 施法结束:咒语念完的时间点,在这个关键点之后,部分人物会有结束动作。

下面实现探险者在选中位置召唤一个巨雷,对区域内所有敌人造成伤害的效果

3.1.1 地形设置
  • 在地图上放置中立-敌对的野怪单位,以及主角探险者。

  • 新建自定义技能,并为其命名和添加说明“探险者在选中位置召唤一个巨雷,对区域内所有敌人造成伤害。”。在右侧固定属性基础中保留是否转身,勾选超出范围、立即释放,其他全部取消。选择圆形指示器,设置技能范围为300。
    在这里插入图片描述

  • 新建自定义的雷电投射物,作为技能的施法效果(新建投射物->表现页签->右侧属性栏-特效配置选择闪电特效)。

  • 在物编器中给探险者添加雷电技能作为其通用技能。
    在这里插入图片描述

3.1.2 触发编写

此技能有两个阶段:

  • 施法开始到施法引导阶段:播放施放技能的动作
  • 施法引导到施法结束阶段:创建施法效果的投射物表示产生技能效果,识别技能范围内的所有单位,对其中的敌对单位造成群体伤害并显示伤害数据。
    在这里插入图片描述

在工具栏-技能中,也可以编辑触发器,它会编写技能触发的具体过程。整个逻辑实现过程为:

  • 技能物编器中新建触发器,重命名为stage1
    • 创建施法开始事件:选择技能->施法开始
    • 创建施法动画播放动作:单位->动画->播放动画,参数“单位”选择“函数->技能拥有者”,参数“播放动画字符串”选择“值->attack1”(单位内置动画名称),参数“速率”设为1,即正常播放速度。从0秒播放到-1秒(表示动画播放到最后)。
  • 技能物编器中新建触发器,重命名为stage2
    • 创建施法引导事件:选择技能->施法引导
    • 创建动作1——投射物动作(施法):选择投射物->投射物-在点创建,参数“投射物类型”选择刚刚自定义技能“雷电”,参数“点”选择“函数->技能(当前技能)获取到点”,参数“所属”选技能拥有者。在可选参数中选择持续时间为3秒。
    • 创建动作2:——筛选单位组:新建动作,设置单位组->函数->筛选范围内所有单位,以技能选取点为圆心半径300内的所有单位做动作。
    • 创建动作3——对敌人造成技能伤害:新建if条件动作->如果所有条件成立
      • 创建if条件: 在if条件中选择单位->是敌对关系,两个参数分别选择“获取单位组中遍历到的单位”和“技能拥有者”。
      • 创建Then动作:选择单位->造成伤害。对遍历单元组中的单位造成500点法术伤害,伤害所属设置为技能拥有者,所属当前技能。
      • else代表同盟或者友方单位,不需要做任何动作。

在这里插入图片描述

技能默认消耗MP,而生物和建筑单位默认是没有MP的,装备了主动技也使用不了。

3.2 界面编辑

  界面编辑器是对软件的人机交互操作逻辑和界面美观进行的整体编辑,我们通常会用到图像、文字、按钮等组件,在界面上与操作者进行互动,从而丰富和增强用户的体验。Y3编辑器中UI编辑器的操作界面主要由五个部分组成:
在这里插入图片描述

  1. 画板区:在开始做一个界面之前,必须先创建一个画板。
  2. 控件区:用于展示每个画板里面的各个控件。
  3. 节点区:展示所有可使用的UI组件,包括按钮、图片、模型、文本输入框、进度条、滑动条列表等。
  4. 画布区域:在画布中编辑摆放组件,并查看组件属性。
  5. 事件区域:用于编辑组件的具体参数,包括大小、位置、外观、动画等。

  在控件区,所有组件都以树结构来陈列,包含了一组节点,节点之间相互关联,并且具有父节点和子节点关系(节点的任何附属节点都称为子节点)。删除一个节点,其所有子节点也会被一起删除。

  UI本身只有显示作用,我们一般会配合触发编辑器,去实现一些想要的功能。接下来,我们实现以下界面UI:

在这里插入图片描述

3.2.1 界面编辑器设置

  首先在地图上放置一个用于选择的单——探险者,在法师周围绘制一个圆形区域,命名为select _area,,表示进入这个区域会触发宝物选择界面。

  • 创建空白画布:打开界面编辑器,单击+创建一个新的画板,并重命名为select_treasure。缩放画布大小为33%。

  • 创建选择框底板:拖动顶部图片按钮到画布中央,在资源库中选择喜欢的图片(弹窗->公告栏)。拖动图片锚点放大图片,或者通过x轴y轴坐标进行放大。

  • 设置界面标题:拖动顶部文本按钮到底板上,调整位置和大小,输入“请选择一个你喜欢的宝物”作为选择框的标题,并明明为title。设置文本的字体颜色和对齐方式,让它们看上去更美观一些。
    在这里插入图片描述
    在这里插入图片描述

  • 设置玩家选项1:拖动一张图片(控件图)到画布上,根据喜好调整位置、尺寸和背景图片,命名为button1。将另外一个图片拖动至button1内,作为奖励的展示图标(icon1),选择文本并将其拖至button1内,作为奖励的名字(name),输入“魔法戒指”并调整字体颜色和位置。

  • 调整父子级关系:以图片为父节点,将title,button1拖动到图片下,作为相互平行的子节点。将icon,name拖动到button1下,作为其子节点。这样icon,name,button1就可以作为一个整体被选择。

  • 设置玩家选项2:复制并粘贴一个新的选项,重命名为button2,调整级别和位置,更改图像和文本,完成第二个按钮。
    在这里插入图片描述

3.2.2 添加按钮事件

  界面组件设置完毕后,我们为按钮添加事件。选中button1,右上角点击事件,点击+添加事件,并命名为choose_ring。点击“空事件->事件设置-点击”。同样的方式为button2选择点击事件并命名为choose cloak

  在事件板块,点击音效可以选择事件的音效,点击界面上方的动画编辑,可通过时间轴管理为事件制作帧动画。时间轴和动作设置板块中的动画效果互相排斥,如果在动作设置板块中选择了一个动画效果,则时间轴不生效。
在这里插入图片描述

  由于整个画板在事件触发前是不可见的,所以选中整个画板select_treasure,选择属性,将是否可见取消勾选。,这样我们绘制的整个界面组件,在触发调用前是不可见的。

3.2.3 触发编写

整个触发分三部分:

  • 当选择单位进入到对应的区域后,会出现选择框
  • 选择按钮A,左侧信息栏提示A内容
  • 选择按钮B,左侧信息栏提示B内容

下面是具体的编写逻辑:

  1. 触发器-进入区域
    • 在物编器的触发器页签下创建任意单位进入select _area区域事件,将此事件命名为“进入区域”。
    • 新建条件->单位类型判断,获取事件中单位的单位类型等于探险者。
    • 新建动作->界面->显示/隐藏控件,对玩家1显示控件。
      在这里插入图片描述
  2. 触发器-选择戒指
    • 创建事件:界面->控件事件,参数UI事件选择choose ring
    • 创建动作选择界面->显示/隐藏控件来向玩家1显示控件select_treasure
    • 创建动作选择界面->系统消息提示,来向玩家提示“你选择了魔法戒指”,持续时间设为5秒。
      在这里插入图片描述
  3. 触发器-选择斗篷
    直接复制上一条触发器重命名为选择斗篷,UI事件改为choose cloak,第二条动作命令信息显示内容修改为“你选择了魔法斗篷”。

3.3 运动器

  运动器可以为单位或者特效等添加运动效果,比如沿着直线运动或追踪某一个单位等,是制作技能、特效等场景中十分常用的功能。

  在Y3编辑器中,运动器分为追踪运动器、曲线运动器、直线运动器、环绕运动器(对单位)、环绕运动器(对点)。今天就以环绕运动器(对单位)为例,给大家做一个演示,实现电球的环绕和爆炸效果。

在这里插入图片描述

  1. 触发组件设置
    • 在物编器中创建一个自定义投射物"Electric ball"(球形蓝色电流攻击)作为环绕的球体,设置缩放0.4倍大小,勾选循环播放,让特效一直播放。
    • 设置自定义投射物"Explosion"(蓝色电流冲击波,0.3倍缩放)作为结束时的爆炸效果。
    • 在主界面地图上放置一个英雄单位作为主角
  2. 触发逻辑
    • 新建事件:硬件输入->键盘按下A
    • 新建电球投射物:创建一个投射物变量"Electric ball",投射物类型选择预设的投射物"Electric ball",选择在点创建,创建的位置点,选择探险者所在的点。
    • 新建运动器:选择运动器->环绕运动器对单位,两个参数分别设为变量"Electric ball"和探险者,环绕半径为200,角速度为100。在可选参数中,添加环绕时间5s和环绕高度100
    • 新建投射物爆破动作:在运动完成动作列表下添加动作,在探险者所在的点创建投射物"Explosion",持续时间1s
    • 优化游戏内存:销毁投射物"Electric ball"并移除运动器(为单位移除运动器,单位选择探险者)。

在这里插入图片描述

四、优化

4.1 游戏声音设计

  声音不仅是玩家接收游戏信息的重要途径,也是游戏开发者传递情感和增强游戏体验的关键工具。游戏中的声音主要分为功能性音乐和背景音乐两大类:

  • 功能性音乐:
    • 游戏信息提示:为玩家提供画面外的游戏信息提示和预警,例如交互物品的存在、环境变化和潜在威胁。
    • 玩家操作反馈:通过声音反馈玩家操作,增强游戏互动性,使玩家获得及时且全面的反馈。
  • 背景音乐:
    • 环境渲染:通过声音对游戏场景进行多感官渲染,增强玩家的沉浸感。
    • 情绪渲染:利用声音表达复杂的情绪,如战斗的激烈、对未知的恐惧和紧迫感。

在物体编辑器中可以进入音效模块,设置音效属性:

  • 淡入::设置声音开始时由无声过渡到有声所经历的时间。
  • 淡出::设置声音结束时由有声过渡到无声所经历的时间。
  • 调整至3D声音模式,我们可以设置声音的衰减距离和静音距离。
    在这里插入图片描述
      点击“+”可以为一个音乐场景添加多个声音,不仅可以调节各个声音的音量,还可以调整各个声音的播放概率,从而使游戏中的音乐变得多样化。还可以为音效添加新的自定义属性并设置其名称、类型、值,后续通过触发器调用。
    在这里插入图片描述
      在物编器-单位-单位固定属性中,我们可以为单位绑定声音事件,比如选择当角色升级时播放升级音效。

4.2 游戏镜头设计

4.2.1 镜头的基本参数

  打开工具栏->放置物件->镜头,可以看到编辑器自带得默认镜头Initial Camera,此镜头的视角为进入游戏之后的默认视角,无法删除,无法重命名。用户可以在场景中的任意位置,点击“以当前视角设置镜头属性”来为当前视角创建镜头。用户创建的镜头可以重命名、删除。
在这里插入图片描述

参数说明
焦点位置及镜头的指向点焦点位置指的是镜头所注视的目标点,它由三维坐标(X、Y、Z)确定。镜头的指向是通过这些坐标来设定的,表示镜头当前所看的位置。
俯仰角镜头与水平线的夹角,平视为零度,仰视为负数,俯视为正数。
导航角镜头在地平面上的方向,通常从参考方向(如正北)开始测量,镜头面向正东时导航角为90度。
滚转角镜头自身的旋转角度,类似于歪头时视角的变化。
距离镜头与焦点之间的三维空间距离。
观察区域(FOV)镜头视野所能覆盖的范围,决定镜头显示细节的区域。
远景裁剪镜头显示参数,超出距离范围的物体不进行渲染(不显示)。
实时观察镜头属性改变勾选后可实时预览镜头的视角变化。
与焦点的最大/最小距离游戏中,玩家可通过鼠标滚轮控制镜头与焦点的距离,设置此参数可进行限制。
例如,当二者设为一样时,玩家视角将被限定,无法使用鼠标滚轮调整距离。

在这里插入图片描述

4.2.2 镜头时间轴动画

  使用镜头时间轴动画和使用触发器都可以实现镜头动画,二者在最终的画面表现上没有区别,但却各有优势:

  • 镜头时间轴动画:可以在时间轴内,通过设置关键帧的形式,方便快速地制作镜头动画。但每条时间轴镜头动画不能复制,无法复用。
  • 触发器:触发器编写的自定义程度高,语句还可以复制粘贴,具有很强的复用性和扩展性。(相关定义详见触发器-镜头API)
    在这里插入图片描述

  点击新建的“镜头时间轴动画1”右侧的编辑按钮,即使用当前画面视角为初始帧,创建时间轴动画。每条时间轴动画由两个部分组成,分别是 时间轴当前关键帧下镜头的属性面板。
在这里插入图片描述

  我们可以在时间轴上拖动进度条,或是在frame窗口中输入具体帧数,来选择关键帧位置。Y3编辑器使用的刷新率为30帧每秒,所以如果设置关键帧在第60帧,就是在第两秒。点击上方的创建按钮,即可在所处位置为所选参数新建关键帧。

  关键帧分为绝对值(当前关键帧下镜头的具体参数)和相对值(相对于初始帧所改变的取值)。当指针选定一个关键帧时,点击鼠标右键,即可对关键帧进行复制、粘贴、删除(按下delete按键也行)等操作。编辑并保存关键帧之后,在触发器中可以编写镜头触发事件:

在这里插入图片描述

4.3 表格编辑器(实现对话UI)

4.3.1 一维表和多维表

  在故事中,我们通过对话UI向玩家传达了剧情的重要信息。不同的对话内容需要多个UI来呈现吗?其实不用,在Y3编辑器中,我们可以结合表格编辑器、界面编辑器和触发来实现这个效果。

  表格编辑器是Y3编辑器提供的数据管理工具,我们可以在表格编辑器中以表格的形式保存数据,并之后通过触发来快速调用这些数据,比如怪物的物品掉率,刷怪时怪物种类和数量。

  在表格编辑器中有两种表格:一维表和多维表。一维表中,每一行都是一条独立的数据,包含键名、类型、值和备注。通过键名,也就是索引,我们就能快速获取到对应的值。

  一维表适合定义零散的各种数据,比如游戏初始化时的一些规则和参数。假设你的《练功房》项目中一共会有六个房间,你想分配其中有两个房间产出经验,有两个房间产出金币,并且希望在游戏中时间12时开始刷新怪物,14时之后就停止刷新怪物。由于这些数值关系到项目中设定的经济产出,如果你希望快速地调整这些数值,可以将这些数值保存在一维表格中:

在这里插入图片描述

  假设你正在制作一个《塔防》项目,在第1波次,一共有30只恶魔进攻玩家,玩家需要在60秒内把他们消灭。这里波次有“顺序”、“怪物数量”、“怪物类型”、”消灭时间”四个关键属性,可以使用多维表格管理数据。多维表中,每条数据包含多个属性及其数值,我们需要两个索引才能锁定数据位置。

在这里插入图片描述

  多维表适合定义一个数据对象,表格中的第一行是这个数据对象的属性名称(key),第二行是这个属性的数据类型,第三行及之后的行则是对应的值。如果数据类型选错了,那么你可能没有办法在触发器中正确的拿到你想要的数据。

4.3.2 数据验证、搜索、保存与撤销
  • 多维表可灵活添加行和列,一维表固定只有三列,不能新增列。
  • 不允许出现相同的主索引值,且主索引只能是整型或字符串类型
  • 数据验证:标红的单元格意味着该数据无法在局内读取到。若是在你配置过程中出现,可能只是因为你的表格还没有编辑完成而系统提前在验证。数据配置后,仍有单元格标红,可把鼠标悬浮在红框上查看具体原因,如关键数据的缺失或不匹配或重复,再予以修复。
    在这里插入图片描述
  • 重命名:右键点击一张表或选中后按F2可进行重命名
  • 表格归类:点击文件夹图标按钮或Ctrl+G可创建文件夹,归类表格。
  • 保存与撤销:保存按钮是保存整个工程,而撤销按钮只针对你在表格编辑器内的操作。
4.3.3 Excel导入导出

  表格编辑器并不支持如office中公式、填充柄、甚至VBA等一些高级功能的应用。如果要进行高效开发,推荐先使用Excel进行快速编辑,再导入编辑器。表格编辑器用于快速验证调试游戏体验。

  点击导入,你可以选择一个表格文件将其导入至编辑器中,当前支持的表格格式有”.xlsx”,”.xlsm”,”.xls”,”.csv”共四种。

  1. 一维表导入:所有以“kv_”开头的sheet将读取为一维表
    • 标题行:第一行为标题行,限定内容为“Key,Type,Value,Des",大小写允许模糊。
    • 数据行:第二行往后为数据行
  2. 多维表导入:所有"config_"作为前缀的sheet表格将读取为多维表
    • 第一行为注释行,不读取
    • 第二行为数据名,读取后视为列名
    • 第三行为数据格式,支持int,string,float,bool四个类型,支持大小写模糊
    • 第四行为主键标识,格式需要是整型或者字符串类型,以key1,key2,key3进行枚举,支持大小写模糊。最多支持三键表,需有key1,才能有key2,需有key2,才能有key3,否则报错,导入错误。如果没有key,则生成一个”key1“列作为主键,以行号填写值。
    • 第五行之后为表格的数据,涉及到的公式等特殊格式以结果的值进行读取。
4.3.4 使用表格编辑器实现对话UI

在表格编辑器内定义的表格,在游戏初始化时将会保存在内存中,供你在任意的触发器中调用:

在这里插入图片描述
下面我们就来看一看表格编辑器的具体使用方法。

  1. 绘制UI:绘制一个界面来承载和展示对话内容

    • 打开界面编辑器添加一个新面板,并将其重命名为dialogue。这个界面应包含两个图片,一个作为content(对话内容)背景,一个作为real name(角色)的背景,以及两个分别用于承载real namecontent文本框。
    • 拖动调整这些控件的大小和位置,在文本设置中设置文本的字体样式,调整空间的父子级关系。选择整个面板并取消勾选是否可见,表示直到它被触发才显示对话界面。
      在这里插入图片描述
  2. 创建多维表:创建多维表并将其重命名为scripts。在scripts中将主索引key修改为order(存储对话顺序,整型)。添加两个类型为字符串的属性role namecontent分别存储角色名称和对话内容。

  3. 触发编写

    • 新建事件:硬件输入-键盘空格键按下事件
    • 新建动作设置对话顺序:设置一个全局整数变量order,来记录空格键被按下的次数,初始值为零。使用函数->整数间运算,设置变量orderorder+1,这样当我们第一次按下空格键时,order都加1
    • 新建动作显示角色名称:选择界面->设置文本,对玩家一设置dialogue面板下的real name文本,字符串参数选择函数,然后选择第二个多维表中的字符串值。
      在这里插入图片描述

        现在当我们第一次按下空格键时,order=1,主索引为1role name数据将读取显示。当我们再次按下空格键时,order=2,主索引为2role name的数据将被读取显示。

    • 新建动作显示角色对话文本:操作同上
      在这里插入图片描述
4.3.5 更多示例

一维表用例:配置了如下的一维表,命名为globalConfig
在这里插入图片描述
可直接通过Type类型对应的参数类型,在获取到Key对应的Value值。
在这里插入图片描述
多维表用例:配置了如下的多维表,命名为Example。
在这里插入图片描述
最基础的使用方式为直接获取表格中的值,如我当前需要获得id为1的数据中的use_money字段数据,将其存入变量a中。可以采用这样的方式:
在这里插入图片描述
常用方式是遍历表格,实现一些逻辑:
在这里插入图片描述

4.4 函数库

在这里插入图片描述
  在2.3章节中,我们使用循环计时器连续生成次元入侵者。那如果需要在多个区域,在不同的时间点生成敌人,是否需要写多个触发器重复设置效果呢?当然不是,Y3编辑器为我们提供了一种更简单的方法来重复实现简单的功能,即函数库。

  函数库允许我们将常用的触发器语句转换成可重复使用的函数,类似于编程中的函数或者方法,可以提高工作效率。函数库由以下部分组成:

  • 函数描述:定义函数在动作列表中的显示方式,包括自定义名称、描述(触发器语句的内容和格式)和提示。
  • 参数:定义了该函数的输入数据,连接函数库和触发器,可设置参数类型。
  • 返回值:定义了函数执行后返回的结果(输出数据)。你可以点击 "+"来设置返回值的名称和类型,以方便触发器的后续调用。
  • 动作:函数执行的动作列表,显示了函数的具体行动逻辑。

在这里插入图片描述

  现在我们想要实现的效果是,在三个指定的地点间隔0.3秒,生成一个指定类型的野怪,总共生成五个。我们可以使用函数库简化具体的编写过程。
在这里插入图片描述

  1. 触发组件:我们需要在地形上放置敌对单位、boss和探险者。

    • 在boss周围绘制三个点区域,分别命名为point A、Point B、Point C。
    • 以boss为中心绘制一个圆形区域alert area,作为boss的警戒范围
    • 自定义三个不同的小怪,他们会在三个点生成。
  2. 自定义函数库函数

    • 在函数库中新建函数,命名为“野怪刷新”,参数为Monster(小怪,单位类型)和Point(刷新点)
    • 点击左边的可用参数,使用刚刚创建的参数组成函数描述:“在参数Point处创建参数Monster”
    • 新建一个技数计时器,设定每隔0.3秒运行一次,共运行五次,选择“立即执行”
    • 在动作列表中选择创建单位,单位类型是参数Monster,点是函数参数Point,为单位boss创建,方向是单位boss的方向。
    • 添加一个动作来向怪物发出命令,选择“单位发布命令”,设置命令为“攻击移动”。
      在这里插入图片描述
  3. 触发编写:调用函数库,通过设置不同的参数和计时器来在不同时间和地点生成敌人。

    • 新建“任意单位进入区域事件”
    • 在单玩家位进入BOSO警戒区域两秒、三秒、四秒后,分别使用“野怪刷新”函数,在三个点刷新小怪。
      在这里插入图片描述

五、项目:竞技场争霸赛

5.1 项目简介

在这里插入图片描述

游戏的制作一般分为三大类:

  • 设计:包括游戏的核心玩法和故事背景。
  • 美术:负责游戏的原画,角色、物体和场景的三维建模。
  • 程序设计:通过代码实现游戏玩法。

  本项目“竞技场争霸赛”是一款射击类小游戏,一个人就足以完成开发。核心玩法是玩家控制挑战者挑战怪物,通过移动和射击来躲避怪物攻击和击败怪物。每隔几秒钟怪物就会热身蓄力,然后冲锋,玩家必须使用鼠标右键移动进行躲避,然后使用鼠标左键精瞄准射击,击败怪物,所以游戏两大核心机制是移到和射击
在这里插入图片描述

  另外游戏将从游戏印象和游戏沉浸两个角度进行设计。由于挑战者在攻击时不能移动,所以玩家在何时躲避危险和何时瞄准目标之间保持平衡是很重要的,这带来了挑战和乐趣。在游戏沉浸方面,我们可以通过动画、镜头、角度、滤镜等去创造过程,带来令人印象深刻的游戏体验,玩家将在游戏开始时更加兴奋,在游戏结束时更感到印象深刻。

在这里插入图片描述
在这里插入图片描述

时间有限,下面只展示必要步骤。

5.2 地形设置

  • 新建空白工程,选择小型地图(64×64)和自定义UI模板。
  • 创建生物单位(挑战者、boss、观众)和抛射物(探险者的子弹)。
    • 挑战者模型选择仙人掌人,血条样式为绿色血条,显示模式为不满血显示,取消勾选死亡后销毁单位,取消勾选无法反击时逃跑。最大血量设为30,生命恢复设为0。
      在这里插入图片描述

    • 复制挑战者模板,BOSS模型选择图示小怪物,血条显示红色,单位状态里设置禁止普攻,

    • 观众选择图示小怪物,无血条显示,单位状态选择无效

    • 抛射物选择绿色法阵符文特效,缩放0.6
      在这里插入图片描述

  • 绘制陆地碰撞
    在这里插入图片描述
    在这里插入图片描述
  • 为挑战者、BOSS和观众设置出生点
  • 设置挑战者和BOSS的战斗准备圈
  • 放置一个几乎覆盖整个竞技场的战斗圈,作为boss的攻击区域
    在这里插入图片描述

5.3 触发器设置

在“竞技场争霸赛”这款游戏中,我们将游戏分为以下四个阶段:

  • 游戏初始化:镜头跟随玩家,设置变量为游戏角色伤害初始值。
  • 战斗准备:挑战者和boss的嘲讽动作,摄像机跟随。
  • 战斗中:实现鼠标操作(右键移动、左键射击),boss的AI逻辑(蓄力和冲锋)。
  • 战斗结束:根据胜者播放不同的动画和滤镜效果,结束游戏。
5.3.1 游戏初始化
  • 刷出挑战者,并设置镜头,让玩家以第三人称视角跟随他。
  • 设置一个2s的计时器,给玩家一点缓冲时间,让他们意识到游戏即将开始。
  • 向挑战者发布命令,移动到挑战者准备区
  • 为了提高游戏的沉浸感,邀请观众参加战斗。
    • 点击基础->收纳盒,设置一个存储框,设置一个观众点数组存储所有观众点,设置完后折叠起来,使界面更简洁。
      在这里插入图片描述

    • 设置一个循环来生成观众,并让他们的方向朝着战场中心。最后将每个观众都添加到观众单位组中,这样游戏结束时,我们就可轻易命令单位组成员,播放庆祝或挫折动画了。
      在这里插入图片描述

5.3.2 战斗准备

当挑战者进入准备圈时,我们需要做三件事:

  • 移除挑战者的准备圈,防止重复挑战者准备逻辑
  • 挑战者停止下来,播放嘲讽动画作为准备战斗的信号
  • boss进入战斗区域,并使用镜头跟随它

在这里插入图片描述
当BOSS进入它的准备圈时,也有三个工作:

  • 移除boss的准备圈
  • 播放boss嘲讽动画将比赛气氛推向高潮
  • 等待2s后战斗开始,让镜头恢复正常,并允许玩家控制角色。

最后创建一个全局布尔变量battleongoing,默认值为false,现在为true,表示正在战斗中。

在这里插入图片描述

5.3.3 战斗中

  为了在游戏中实现鼠标操作,我们设置了右键移动,左键射击。移动机制为,当玩家按下鼠标右键,并且布尔变量battleongoing为真时,让角色移动到鼠标位置。
在这里插入图片描述
攻击机制:

  • 当玩家按下鼠标左键且battleongoing为真时,创建一个局部变量为鼠标的游戏坐标,point为当前玩家坐标
  • 命令挑战者停止(防止可以边移动边攻击),将方向设置为从point朝向clickedPoint的方向,播放攻击动画
  • 完成开枪逻辑:
    • point处创建投射物(设为变量方便移除),添加运动器来设置子弹的直线运动轨迹和造成的伤害
    • 在移动完成后将运动器和抛射物移除
    • 创建碰撞运动器实现子弹的射击伤害,并跳字显示

在这里插入图片描述

boss的AI逻辑有两个部分:蓄力和冲锋。

  • 每三秒,如果battleongoing为真,怪物将停止移动并播放循环蓄力动画idle2
  • 2秒钟后怪物会播放一个循环冲锋动画,并为自己创造一个线性的移动器,达到高速移动的效果。BOSS移动位置为战斗区中随机位置。
  • 使用碰撞移动器让BOSS冲锋时对碰撞的敌方单位造成真实伤害

在这里插入图片描述

5.3.4 游戏结束

当任何单位死亡时,战斗结束。我们需要停止玩家的控制权限,播放结束过场动画,并结束游戏。

  • 创建一个触发器,触发事件为任意单位死亡
  • 设置battleongoing为False
  • 将摄像机对准胜者,如果是挑战者,这意味着玩家赢了,让我们为挑战者和所有观众播放赢家动画。设置一个闪闪发光的滤镜效果,使这个庆祝时刻更愉快,并以胜利结束游戏。
  • 如果胜者是boss,播放输家动画,设置对应的滤镜。

在这里插入图片描述

相关文章:

y3编辑器教学5:触发器2 案例演示

文章目录 一、探索1.1 ECA1.1.1 ECA的定义1.1.2 使用触发器实现瞬间移动效果 1.2 变量1.2.1 什么是变量1.2.2 使用变量存储碎片收集数量并展现 1.3 if语句(魔法效果挂接)1.3.1 地形设置1.3.2 编写能量灌注逻辑1.3.3 编写能量灌注后,实现传送逻…...

MVC配置文件及位置

配置文件位置 默认位置 WEB-INF目录下&#xff0c;文件名&#xff1a;<servlet-name>-servlet.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.…...

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…...

C++类的运算符重载

目标 让自定义的类直接使用运算符运算 代码 头文件及类定义 #include <iostream>using namespace std; class Complex {int rel;int vir; public:void show(){cout <<"("<<this->rel<<","<<this->vir<<&quo…...

Motionface RTASR 离线实时语音识别直播字幕使用教程

软件使用场景&#xff1a; 直播、视频会议、课堂教学等需要实时字幕的场景。 1&#xff1a;系统要求 软件运行支持32位/64位windows 10/11系统&#xff0c;其他硬件要求无&#xff0c;无显卡也能实时识别字幕。 2&#xff1a;下载安装 链接:百度网盘 请输入提取码 提取码&#…...

【论文阅读】相似误差订正方法在风电短期风速预报中的应用研究

文章目录 概述&#xff1a;摘要1. 引言2. 相似误差订正算法&#xff08;核心&#xff09;3. 订正实验3.1 相似因子选取3.2 相似样本数试验3.3 时间窗时长实验 4. 订正结果分析4.1 评估指标对比4.2 风速曲线对比4.3 分风速段订正效果评估4.4 风速频率统计 5. 结论与讨论 概述&am…...

learn-(Uni-app)输入框u-search父子组件与input输入框(防抖与搜索触发)

1.父子组件u-search &#xff08;1&#xff09;父组件 <!-- 父组件 --> <template> <div><searchBar change"change" search"search"></searchBar> </div> </template> <script> // 子组件搜索 import…...

UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案

UNIX系统常见故障表现&#xff1a; 1、存储结构出错&#xff1b; 2、数据删除&#xff1b; 3、文件系统格式化&#xff1b; 4、其他原因数据丢失。 UNIX系统常见故障解决方案&#xff1a; 1、检测UNIX系统故障涉及的设备是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…...

c#动态更新替换json节点

需求项目json作为主模板&#xff0c;会应用到多个子模版&#xff0c;当后续项目变更只需要修改主模板中节点&#xff0c;并且能够动态更新到原来的子模版中去。 主模板示例&#xff1a; {"A": {"A1": "","A2": false,"A3"…...

kubernetes的可靠性测试或者故障测试有哪些?

kubernetes的可靠性测试或者故障测试有哪些? 在 Kubernetes (K8s) 集群中,可靠性测试和故障性测试旨在确保系统能够稳定运行并具备应对各种故障的能力。这些测试主要针对集群的组件、应用程序和基础设施。以下是详细的测试内容和方法: 一、可靠性测试 1. 高可用性测试 目…...

datax和datax-web打包成docker运行

概述 datax和datax-web从一台机器迁移到另一台时&#xff0c;要重新搭建一套运行环境&#xff0c;比较麻烦&#xff1b;打包成docker镜像后迁移就方便多了; 因为我的mysql版本是8&#xff0c;需要在datax的read和write中手动添加8的jdbc驱动 所以我先各自下载好了datax和data…...

ThreadLocal原理解析

ThreadLocal原理解析 本篇将带大家了解ThreadLocal的使用方法&#xff0c;并且深度剖析其原理和作用&#xff0c;通过阅读源码的方式&#xff0c;进一步了解其内部原理 ThreadLocal 是 Java 提供的一个工具类&#xff0c;用于为每个线程维护一个独立的变量副本。每个线程可以访…...

Android 分析 Activity 与 Fragment 的区别,部分使用的差异

一、基本概念 Activity&#xff1a;Activity 是应用中单独一个界面的一个组件&#xff0c;通常一个 Activity 对应一个界面&#xff08;或屏幕&#xff09;。Activity 控制了一个应用界面的生命周期&#xff0c;并且能够处理用户的输入和交互。 Fragment&#xff1a;Fragment …...

前端(Ajax)

1.客户端请求 向https://jsonplaceholder.typicode.com/users发送get请求 const xhr new XMLHttpRequest();console.log(xhr.readyState);xhr.open(get, https://jsonplaceholder.typicode.com/users)console.log(xhr.readyState);xhr.send();console.log(xhr.readyState);xh…...

【C++】约瑟夫环问题:深度解析与高级优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言约瑟夫环问题&#xff1a;深度解析与高级优化&#x1f4af;题目描述&#x1f4af;解决方案详解直接模拟法&#xff08;基于 C 实现&#xff09;代码解析示例执行过程 &#x1f4af;高级优…...

总结拓展十七:SAP 采购订单行项目“交货“页签解析

《 SAP采购订单行项目“交货”页签字段解析》 在 SAP 系统的采购流程中&#xff0c;采购订单行项目的“交货”页签承载着关键的信息&#xff0c;其中的字段更是对整个交货环节的精准描述和把控的重要元素。理解和正确解析这些字段&#xff0c;对于确保采购流程的顺利进行、优化…...

作业Day2: 多文件编译; 思维导图

目录 ①文件代码 及其所需头文件分析 main.c文件 1.h文件 1.c文件 ②运行结果&#xff1a; ③代码分析 结构体成员 数据类型的设定&#xff1a; 信息录入函数 信息删除 成绩排序 信息显示 自定义初始化函数 ④思维导图&#xff1a;​编辑 ①文件代码 及其所需头文…...

Kioptrix Level 1通关攻略

目录 修改靶机Kioptrix:Level 1 的网络模式 探测靶机IP地址 得到端口信息 扫描TCP端口 扫描UDP端口 脚本扫描 指纹探测 漏洞探测 目录枚举扫描 发现利用脚本 执行exp链接shell 修改靶机Kioptrix:Level 1 的网络模式 Kioptrix: Level 1靶机的默认网络模式是桥接&#x…...

01 下载opencv并配置vs开发环境

01 下载opencv并配置vs开发环境 01 下载windows版本的opencv 下载地址&#xff1a;点击 ​​ WIndows版本的是编译好的代码。 当然国外网站下载很慢&#xff0c;可以通过我分享的网盘链接下载 opencv-4.10.0-windows.exe https://www.alipan.com/s/wV7z4YsmXgN 点击链接保…...

Ubuntu22.04 docker如何发布镜像(和用git差不多)

在dockerhub上创建远程仓库&#xff1a;https://hub.docker.com/ 将本地镜像打tag&#xff0c;并修改成可以上传到 dockerhub 的形式 # 查看本地镜像# 修改镜像 ## docker tag 镜像名称:标签 新的镜像名称&#xff08;要和远程仓库dockerhub上的一致&#xff09;:新的标签pus…...

【Golang】——Gin 框架中的模板渲染详解

Gin 框架支持动态网页开发&#xff0c;能够通过模板渲染结合数据生成动态页面。在这篇文章中&#xff0c;我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据&#xff0c;并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染&#xff1f; 1.1 概…...

React的局限性是什么?

性能&#xff1a; 虚拟 DOM 虽然提高了渲染性能&#xff0c;但在某些情况下可能会造成性能瓶颈&#xff0c;尤其是在处理大量数据或复杂更新时。对于非UI任务&#xff08;如计算密集型操作&#xff09;&#xff0c;React 本身并不擅长。 学习曲线&#xff1a; 对于初学者来说&a…...

【Vulkan入门】09-CreateFrameBuffer

目录 先叨叨git信息关键代码VulkanEnv::FindHostVisitbaleMemoryTypeIndex()TestPipeLine::CreateFramebuffers() 与网上大多数文章不同&#xff0c;其他文章基本上都使用窗口框架&#xff08;X11、GLFW、WSL等&#xff09;提供的surface来显示Vulkan渲染出的图像。我认为那样会…...

罗技键鼠更换新台式机无蓝牙通过接收器安装

优联驱动下载&#xff1a; http://support.logitech.com.cn/zh_cn/software/unifying &#xff08;下载安装后按照步骤一步步操作&#xff0c;匹配后即可使用&#xff09; 向京东客服反馈后提供的驱动下载安装连接 有问题欢迎评论沟通~...

深入了解Modbus TCP协议:介绍、原理解析与应用示例

深入了解Modbus TCP协议&#xff1a;介绍、原理解析与应用示例 在工业自动化领域&#xff0c;设备之间的通信与数据交换至关重要。Modbus协议作为一种经典的通信协议&#xff0c;因其简单、开放和易于实现的特点&#xff0c;被广泛应用于各种工业设备之间的数据传输。而Modbus…...

vue2 项目中实现动态代理,服务器上通过nginx部署 实现动态代理

一、前言&&原理 前言&#xff1a;vue2 项目中&#xff0c;请求接口是从表格的当前获取的&#xff0c;也就是接口ip:端口号:路经不确定&#xff0c;要实现点击表格当前行请求对应的接口 实现原理&#xff1a;将实际要请求的ip等信息存在请求头中&#xff0c;用的时候再…...

OpenGL 几何着色器高级应用

几何着色器高级应用 概念回顾 几何着色器(Geometry Shader)是 OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心功能是基于输入的图元(如点、线或三角形),生成新的图元,或对输入的图元进行修改。 几何着色器的执行是以图元…...

QT JSON文件解析

参考博客 https://blog.csdn.net/cpp_learner/article/details/118421096 1 打开文件&#xff0c;读取全部内容 QFile file("../Json/js.json"); if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() << "cant open error!";return; }// 读…...

c++中string字符串与其他类型的转换

一、string 转换成其他类型 1、转换为整数 使用std::stoi&#xff08;适用于int&#xff09;、std::stol&#xff08;适用于long&#xff09;、std::stoll&#xff08;适用于long long&#xff09;、std::stoul&#xff08;适用于unsigned long&#xff09;和std::stoull&…...

aws(学习笔记第十七课) SQS Amazon Simple Queue Service服务

aws(学习笔记第十七课) SQS Amazon Simple Queue Service服务 学习内容&#xff1a; 使用SQS Amazon Simple Queue Service服务整体代码&#xff08;nodejs的通常工程&#xff09;代码动作 1. 使用SQS Amazon Simple Queue Service服务 利用应用程序来学习SQS 创建S3$ aws s…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(8)

1.问题描述&#xff1a; 在AGC中&#xff0c;推送服务的消息回执新建成功后&#xff0c;有一个有效期 1&#xff0c;这个有效期是什么意思&#xff0c;过期后&#xff0c;会影响什么呢&#xff1f; 2&#xff0c;这个有效期是否可以修改成一直不过期&#xff1f; 解决方案&…...

mysql 的 binlog 原理

binlog的作用:binlog的三种格式Statement-Based Replication (SBR)&#xff1a;Row-Based Replication (RBR)&#xff1a;Mixed-Based Replication (MBR)&#xff1a; 总结&#xff1a;如何选择:如何配置binlog? binlog的作用: 数据恢复: 如果mysql的数据丢失了,又没有备份数…...

Android显示系统(10)- SurfaceFlinger内部结构

一、前言: 之前讲述了native层如何使用SurfaceFlinger,我们只是看到了简单的API调用,从本文开始,我们逐步进行SurfaceFlinger内部结构的分析。话不多说,莱茨狗~ 二、类图: 2.1、总体架构: 先看下SurfaceFlinger的关键成员和我们BootAnimation侧关键成员如何对应起来…...

独家首发 | 基于多级注意力机制的并行预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD变体分解效果最好算法——CEEMDAN&#xff08;五&#xff09;-CSDN博客 拒绝信息泄露&#xff01;VMD滚动分…...

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…...

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…...

Referer头部在网站反爬虫技术中的运用

网站数据的安全性和完整性至关重要。爬虫技术&#xff0c;虽然在数据收集和分析中发挥着重要作用&#xff0c;但也给网站管理员带来了挑战。为了保护网站数据不被恶意爬取&#xff0c;反爬虫技术应运而生。本文将探讨HTTP头部中的Referer字段在反爬虫技术中的应用&#xff0c;并…...

Next.js授权管理教程:深入掌握Session管理

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 引言 1. Session管理的基本概念 1.1 什么是Session管理&#xff1f; 1.2 Session与Cookie 1.3 使用Session的优点 2. 在Next.js中管理Session 2.1 使用cookie存储Se…...

Python+OpenCV系列:滤波器的魔力

滤波器是图像处理领域中不可或缺的工具。无论是去除噪声、锐化图像还是提取特征&#xff0c;滤波器都扮演着重要角色。本篇将从简单到复杂&#xff0c;带你快速掌握 PythonOpenCV 中的滤波器使用技巧。 什么是滤波器&#xff1f; 滤波器是一种对图像像素值进行计算、平滑或增强…...

代码随想录算法训练营day41|动态规划买卖股票问题

今天的三题买卖股票问题&#xff0c;实际上解题方法都大同小异&#xff0c;思路也和昨天的树形dp有相似之处&#xff0c;都是用一个dp数组的不同下标来记录不同的状态。其中第一题是只买卖一次&#xff0c;可以用贪心的方法&#xff0c;找出左边的最小值和右边的最大值&#xf…...

【EthIf目录】EthIf的文件结构

ls -R 查看目录EthIf的文件结构&#xff0c;包含四个目录&#xff0c; 一个make file文件&#xff0c;具体如下所示&#xff1a;...

Spring 面试题整理

文章目录 一、控制反转 IoC什么是 Bean 和 Spring Bean&#xff1f;依赖注入的常见方式&#xff1f;Bean 的作用域有哪些&#xff1f;protype bean 里面的依赖是 singleton bean 的话&#xff0c;IoC 容器会怎么处理&#xff1f;Bean 的生命周期&#xff1f;Resource 和 Autowi…...

Converting circular structure to JSON

最近在项目中遇到了这个问题&#xff0c;头疼&#xff0c;弄了一下午才解决。做一个笔记吧。 1 Converting circular structure to JSON 我这个问题大致就是在使用pinia中出现了循环引用&#xff0c;意思是两个或多个模块、对象或依赖之间形成了相互依赖的链条。在使用 Pinia…...

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接&#xff1a;Uniapp Tool - IntelliJ IDEs Plugin | Marketplace &#xff08;结合自己的webstorm版本下载&#xff0c;不然解析不了&#xff09; 将下载到的zip文件防在webstorm安装路径下&#xff0c;本文的地址为&#xff1a; 2、安装uniapp插…...

企业级包管理器之搭建 npm 私有服务器 (6)

在企业级应用开发中&#xff0c;常常需要处理私有包的发布和管理。搭建 npm 私有服务器是一个理想的解决方案&#xff0c;它不仅能保证代码的私密性&#xff0c;还能提供更快的下载速度和更精细的权限设置。 一、搭建 npm 私有服务器的优势 保证代码私密性&#xff1a;在企业…...

会议通知:人工智能通识教育与实践发展暨和鲸科技AI通识课解决方案发布会

今年秋季学期起&#xff0c;全国多所高校面向本科生开设人工智能通识课。 当前人工智能通识课程的建设进展主要分为三种情况&#xff1a; 全市统筹&#xff0c;由某头部高校牵头建设市级人工智能通识课&#xff0c;以北京市、天津市为代表&#xff1b; 已于秋季学期按照课程…...

windows C#-自动实现属性的轻型类

此示例演示如何创建一个不可变的轻型类&#xff0c;该类仅用于封装一组自动实现的属性。 当你必须使用引用类型语义时&#xff0c;请使用此种构造而不是结构。 可通过以下方法来实现不可变的属性&#xff1a; 仅声明 get 访问器&#xff0c;使属性除了能在该类型的构造函数中…...

汽车零部件设计之——发动机曲轴预应力模态分析仿真APP

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天&#xff0c;汽车零部件需…...

C#基础:结构

目录 1. C# 程序结构 示例&#xff1a; 2. 变量和数据类型 示例&#xff1a; 3. 控制结构 条件语句&#xff08;if&#xff09;&#xff1a; 循环语句&#xff08;for 和 while&#xff09;&#xff1a; 4. 函数定义和调用 示例&#xff1a; 5. 数组和集合 数组示例…...

[免费]SpringBoot+Vue疫苗接种预约管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue疫苗接种预约管理系统&#xff0c;分享下哈。 项目介绍 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在…...