Unity核心7——2D动画

一、序列帧动画

(一)什么是序列帧动画

​ 我们最常见的序列帧动画就是我们看的日本动画片,以固定时间间隔按序列切换图片,就是序列帧动画的本质

​ 当固定时间间隔足够短时,我们肉眼就会认为图片是连续动态的,进而形成动画(会动的画面)

​ 它的本质和游戏的帧率概念有点类似,原理就是在一个循环中按一定时间间隔不停的切换显示的图片

(二)制作序列帧动画

​ 方法一:

  1. 创建一个空物体

  2. 创建一个动画

  3. 直接将某一个动作的序列帧拖入窗口中

​ 方法二:

​ 直接将图片拖入 Hierarchy 层级窗口中

​ 注意:可以修改动画帧率,来控制动画的播放速度

二、骨骼动画 —— 2D Animation

​ 2D 骨骼动画是利用 3D 骨骼动画的制作原理进行制作的

​ 将一张 2D 图片分割成 n 个部位,为每个部位绑上骨骼,控制骨骼旋转移动,达到用最少的 2D 美术资源做出流畅的 2D 动画效果

​ 在 Package Manager 窗口搜索 2D Animation 并安装

​ 导入工具后,在 Sprite Editor 窗口会多一个选项 Skinning Editor

(一)单张图片骨骼编辑

​ 菜单栏按钮:

  1. Reset Pose:将角色谷歌和关节回复到原始位置
  2. Sprite Sheet:图集显示(特殊图片格式 psb 才显示)
  3. Copy:复制当前选择的数据
  4. Paste:粘贴复制数据

​ Bones:骨骼

  1. Preview Pose:预览模式,可以预览动作并不会真正地改变设置

  2. Edit Bone:编辑骨骼,可以改变骨骼位置、长度、方向、名称等

  3. Create Bone:创建骨骼,需要双击图片进行选中后才能创建骨骼

    左键创建骨骼,默认每一个骨骼是上一个骨骼的子对象

    右键取消父子关系继续创建骨骼

  4. Split Bone:拆分骨骼,将一个骨骼一分为二

​ Geometry:蒙皮

​ 蒙皮决定了骨骼主要控制哪一部分

  1. Auto Geometry:自动蒙皮
    • Outline Detail:边缘细节,值越大,轮廓越细致
    • Alpha Tolerance:阿尔法公差值,控制蒙皮细节
    • Subdivide:细化程度,控制蒙皮细节
    • Weights:是否自动设置权重,一般勾选
  2. Edit Geometry:编辑蒙皮
  3. Create Vertex:创建顶点
  4. Create Edge:创建边线
  5. Split Edge:拆分边,用一个新的顶点分离一个边

​ Weights:权重

​ 权重决定了当骨骼运动时如何影响顶点和边

  1. Auto Weights:自动赋予权重
  2. Weight Slider:编辑顶点和边的权重
    • Mode:计算模式
      • Add And Subtract:加减法
      • Grow And Shrink:增长和搜索
      • Smooth:平滑
    • Bone:设置权重的骨骼
    • Normalize:标准化设置
    • Amount:数量级
    • Vertex Weight:顶点权重对应的骨骼
  3. Weight Brush:用笔刷赋予权重
  4. Bone Influence:主要用于在 psb 图片中使用骨骼控制点的图片关联

​ 设置完成后,将图片拖入 Hierarchy 窗口中,为其添加 Sprite Skin 脚本,点击 Create Bones 按钮,将生成骨骼

​ 之后便可以通过 Animation 为其添加动画

(二)图集图片骨骼编辑

​ 在编辑之前,我们需要对图片进行如下操作:

  • 设置 Sprite 为图集模式
  • 对图集图片进行切片

​ 具体对图集中每一张图片的骨骼操作与上述类似

​ 在 Hierarchy 窗口中,创建一个根物体当作图集的父对象,依次将每一张图拖进根物体下。

​ 每次拖入一张图后,为其添加 Sprite Skin 脚本,点击 Create Bones 按钮,将生成骨骼

​ 按照图集中图片的父子关系继续拖入场景中,可以修改图片 Sprite Renderer 组件上的 Order In Layer 参数来调整图片的前后显示

(三)psb 图片骨骼编辑

​ PS(photoshop)是一款强大的图像处理软件,在各领域都被广泛使用,在游戏行业中也是美术同学使用最多的图像处理软件之一

​ PSD 和 PSB 两种格式,都是 PS 这款软件用于保存图像处理数据的文件格式

​ PSD 和 PSB 两种格式并没有太大的区别,最大的区别是 PSD 格式兼容除 PS 以外的其它一些软件,而 PSB 只能用 PS 打开

​ 在 Unity 中官方建议使用 PSB 格式,需要在 Packages Manager 窗口中引入 2D PSD Importer 工具包

​ PSB 文件关键参数:

​ PSB 文件也是一种图片文件,因此大多数参数与一般的图片参数一致(见 图片导入与图片设置),这里主要讲解其独有的参数

  1. Extrude Edges:图片边缘延伸网格,一般不修改
  2. Import Hidden:是否导入 PSB 文件中隐藏的图层,一般不勾选
  3. Moszic:启用后,将图层生成 Sprite,并将它们合并成单个纹理,默认勾选
  4. Character Rig:是否启用人物已经绑定的骨骼,默认勾选
  5. Use Layer Grouping:使用 PSB 文件中的层分组
  6. Pivot:轴心点位置
  7. Reslice:从导入层重新生成 Sprite,并清除对 Sprite 的任何更改,只有启用 Moszic 后有用
  8. Keep Duplicate Name:让 Sprite 名称保留 PSB 文件中的名字

​ 骨骼编辑界面变化:

​ 在为每一个图层生成蒙皮时,可能会覆盖其他图层的骨骼,这时可以在 Bone Influence 选项界面中设置影响的骨骼

三、反向动力学 IK

​ 在骨骼动画中,构建骨骼的方法被称为正向动力学,它的表现形式是,子骨骼(关节)的位置根据父骨骼(关节)的旋转而改变

​ 用我们人体举例子,当我们抬起手臂时,是肩部关节带动的整个手臂的运动,用父子骨骼理解的话就是父带动了子

​ IK 全称是 Inverse Kinematics,翻译过来的意思就是反向动力学的意思

​ 它和正向动力学恰恰相反,它的表现形式是,子骨骼(关节)末端的位置改变会带动自己以及自己的父骨骼(关节)旋转

​ 用我们人体举例子,当我们拿起一个杯子的时候是用手掌去拿,以杯子为参照物,我们移动杯子的位置,手臂会随着杯子一起移动

​ 用父子骨骼理解的话就是子带动了父

​ 在 Package Manager 窗口中引入 2D IK 工具包,需要在 Advanced 高级选项中选中 Show preview packages(显示预览包),这样才能看到2D IK相关内容

​ 注意:如果在引入包时报错,需要在 Windows 防火墙中添加入站规则

(一)IK Manager 2D

​ 将上一小节的 PSB 文件拖入 Hierarchy 窗口中,为其创建父对象 Player 来方便管理,给 Player 添加 IK Manager 2D 脚本

  1. IK Solvers:IK 解算器,在这里添加 IK
    • Chain(CCD):可以自定义影响 N 个关节点,不能反向
    • Chain(FABRIK):可以自定义影响 N 个关节点,可以反向
    • Limb:只会影响 3 个关节点,一般用于控制四肢
  2. Weight:权重,当有多个 IK 控制同一点时,权重会影响控制的百分比
  3. Restore Default Pose:恢复默认位置

​ 添加完成后,为需要添加 IK 效果的骨骼新建一个空物体 IK,并将其位置移动到骨骼末端位置处

​ 在 IK Manager 2D 脚本中点击加号,新建一个 IK 对象,会发现在 Player 下面多了一个 IK 对象并挂载了对应的脚本

(二)CCD Solver 2D

  1. Effector:默认的 IK 点位置
  2. Target:根据 IK 点位置生成的 IK 对象,
  3. Chain Length:IK 影响骨骼的数量,设置成功后,会发现被关联的骨骼会出现绿色的圆圈
  4. Iterations:算法运行的次数,一般不修改
  5. Tolerance:容错程度,一般不修改
  6. Velocity:速度,一般不修改
  7. Constrain Rotation:约束旋转程度
  8. Solve from Default Pose:从默认姿势进行求解计算
  9. Weight:权重

​ 设置好参数后,点击 Create Target,Target 会被创建在该脚本挂载的物体的子物体上并被自动关联

(三)Fabrik Solver 2D

  1. Effector:默认的 IK 点位置
  2. Target:根据 IK 点位置生成的 IK 对象,
  3. Chain Length:IK 影响骨骼的数量,设置成功后,会发现被关联的骨骼会出现绿色的圆圈(颜色可以设置)
  4. Iterations:算法运行的次数,一般不修改
  5. Tolerance:容错程度,一般不修改
  6. Constrain Rotation:约束旋转程度
  7. Solve from Default Pose:从默认姿势进行求解计算
  8. Weight:权重

(四)Limb Solver 2D

  1. Effector:默认的 IK 点位置
  2. Target:根据 IK 点位置生成的 IK 对象,
  3. Flip:旋转反向,用于控制 IK 的旋转方向
  4. Constrain Rotation:约束旋转程度
  5. Solve from Default Pose:从默认姿势进行求解计算
  6. Weight:权重

​ IK 的用处:

  • 瞄准功能
  • 头部朝向功能
  • 拾取物品功能

​ 对于有指向性的功能,我们都可以通过 IK 来达到目的最大的作用,可以方便我们进行动画制作

四、换装

(一)在同一个 psb 文件中制作换装资源

  • 在 ps 中制作美术资源时,将一个游戏对象的所有换装资源都摆放好位置
  • 当我们导入该资源时,要注意是否导入了隐藏的图层

​ 在右侧的 Visibility 面板上为每一个图层设置分类,右边的标签相当于其在分类中的名称

​ 注意事项:

  • 每个部位 关联的骨骼要明确设置
  • 为同一个部位的不同装备分组

​ 骨骼、蒙皮设置完成后,将图片导入场景中,会发现其自动添加了精灵资料库 Sprite Library,用于确定类别分组信息

​ 同时, Unity 会为每一个设置了类别的装备添加精灵解算器 Sprite Resolver,用于确定部位类别和使用的图片

​ 使用代码进行换装示例:

using UnityEngine.Experimental.U2D.Animation;

private Dictionary<string, SpriteResolver> equipDic = new Dictionary<string, SpriteResolver>();

// 1.获取各部位的SpriteResolver(需要引用命名空间)
// 2.使用SpriteResolver的API进行装备切换
// GetCategory() 获取当前部位默认的类别名
// SetCategoryAndLabel 设置当前部位想要切换的图片信息

private void Start() {
    SpriteResolver[] srs = this.GetComponentsInChildren<SpriteResolver>();
    for (int i = 0; i < srs.Length; i++) {
        equipDic.Add(srs[i].GetCategory(), srs[i]);
    }

    ChangeEquip("Cask", "CASK 1");
}

public void ChangeEquip(string category, string equipName) {
    if (equipDic.ContainsKey(category)) {
        equipDic[category].SetCategoryAndLabel(category, equipName);
    }
}

(二)在不同 psb 文件中制作换装资源

​ 保证个部位在 PS 文件中的统一,基础部位可选择性隐藏

​ 注意事项:不同文件的骨骼信息必须统一,所以我们直接使用复制的方式

1.首先创建 Sprite Library Asset 数据文件,对参数其进行设置


2.为根对象添加 Sprite Library 并关联数据文件

3.为换装部位关联 Sprite Resolver

​ 换装较少的游戏,比如只有面部表情更换,可以使用同一 psb 文件方案

​ 换装较多的游戏,比如各部位有 n 种装备,可以使用不同 psb 文件方案,拓展性更强

​ 一切根据需求而定

五、骨骼动画 —— Spine

​ Spine 是一个收费的跨平台的 2D 骨骼动画制作工具,它支持 Unity,UE,Cocos2D,Cocos2D-x 等等游戏引擎

​ 相对 Unity 2018 才推出的 2D Animation,Spine 是目前商业游戏中较为常用的骨骼动画制作方案 稳定且高效

​ 官方地址:http://zh.esotericsoftware.com/

​ 制作骨骼动画是美术人员的工作,除非你是要做独立游戏,美术程序一人包,那么我们没有必要去学习如何通过 Spine 制作骨骼动画

​ 我们只需要学习如何在 Unity 中通过程序使用 Spine 制作的资源

​ 如果想要学习如何制作 Spine 骨骼动画,可以根据官网提供的教学内容进行学习

​ 有了 Spine 提供的支持 Unity 开发的运行库,我们才能在 Unity 中使用 Spine 制作的骨骼动画
​ 你可以简单理解其实就是官方写好的识别文件处理文件呈现效果的代码
​ 我们只需要学习如何使用它提供的 API 即可

(一)骨骼动画使用

​ Spine 导出的资源有 3 个文件:

  • .json 存储了骨骼信息
  • .png 使用的图片图集
  • .atlas.txt 图片在图集中的位置信息

​ 当我们把这三个资源导入到已经引入了 Spine 运行库的 Unity 工程后,会自动为我们生成:

  • _Atlas 材质和 .atlas.txt 文件的引用配置文件
  • _Material 材质文件
  • _Skeleton Data、json 和 _Atlas 资源的引用配置文件

​ 创建动画的两种方式:

1.直接将 _Skeleton Data 文件拖入到场景中,选择创建 Skeleton Animation 对象

2.创建空对象,然后手动添加脚本 Skeleton Animation 进行关联

(二)骨骼动画参数

​ 骨骼数据文件:

  1. Skeleton JSON:骨骼数据文件
  2. Scale:缩放大小
  3. Skeleton Data Modifiers:骨骼数据修改器
  4. Blend Mode Materials:混合模式材质
  5. Apply Additive Material:是否使用叠加材质
  6. Additive Material:叠加材质
  7. Multiply Material:相乘材质
  8. Screen Material:屏幕材质
  9. Atlas Assets:图集资源
  10. Mix Setting:混合设置
    • Animation State Data:动画状态数据
    • Default Mix Duration:默认混合持续时间
    • Add Custom Mix:添加自定义混合
  11. Animations:动画
  12. Setup Pose:设置姿势
  13. Create Animation Reference Assets:创建动画参考资源
  14. Slots:插槽,一个部位有多张图片构成,可以在这里预览
  15. Skeleton Mecanim:骨骼控制
  16. Controller:关联动画控制器

​ 骨骼动画脚本:

  1. Skeleton Data Asset:关联的骨骼动画信息

  2. Sorting Layer:所在排序层

  3. Order in Layer:排序层的序号

  4. Mask Interaction:与精灵遮罩交互的方式

    • None:不与场景中任何精灵遮罩交互
    • Visible Inside mask:精灵遮罩覆盖的地方可见,而遮罩外部不可见
    • Visible Outside mask:精灵遮罩外部的地方可见,而遮罩覆盖处不可见
  5. Advanced:高级设置,一般不修改,了解即可

    • Initial Flip X / Y:初始反转 X / Y
    • Update When Invisible:不可见时是否更新
      • Nothing:不更新
      • Only Animation Status:仅动画状态
      • Only Event Timelines:仅事件
      • Everything Excepts Mesh:除了网格其他都更新
      • Full Update:更新所有
    • Use Single Submesh:使用单个子网格
    • Fix Draw Order:固定提取顺序
    • Immutable Triangles:不变三角形
    • Clear State On Disable:禁用时清除状态
    • Separator Slot Names:分隔符插槽名称
    • Z Spacing:Z 间距
    • Vertex Data:顶点数据
      • PMA Vertex Colors:PMA 顶点颜色
      • Tint Black:淡黑色
      • Add Normals:添加法线
      • Solve Tangents:求解切线
    • Add Skeleton Utility:添加骨骼公共程序
  6. Animation Name:当前播放的动画名

  7. Loop:是否循环

  8. Initial Skin:初始蒙皮

    美术在制作时可能有几套蒙皮,一般情况下只需要一套

  9. Time Scale:时间缩放,值越大,动画播放的越快

  10. Root Motion:是否添加根运动的脚本,一般不添加

(三)骨骼动画代码

using Spine;
using Spine.Unity;
using UnityEngine;

private SkeletonAnimation sa;

[SpineAnimation] // 可以在Unity面板中选择动画,而不是填入字符串
public string jumpName;

[SpineBone]  // 可以在Unity面板中选择骨骼,而不是填入字符串
public string boneName;

[SpineSlot]  // 可以在Unity面板中选择部位,而不是填入字符串
public string slotName;

[SpineAttachment]  // 可以在Unity面板中选择附件,而不是填入字符串
public string attachmentName;

// Start is called before the first frame update
void Start() {
    sa = this.GetComponent<SkeletonAnimation>();

    // 动画播放
    
    // 方法一:直接改变SkeletonAnimation中参数
    // 需要先改循环为false后再设置动画
    sa.loop = true;
    sa.AnimationName = "jump";

    // 方法二:使用SkeletonAnimation中动画状态改变的函数
    // 马上播放
    sa.AnimationState.SetAnimation(0, jumpName, false);
    // 排队播放
    sa.AnimationState.AddAnimation(0, "walk", true, 0);

    // 转向

    sa.skeleton.ScaleX = -1;

    // 动画事件

    // 动画开始播放
    sa.AnimationState.Start += (t) => { print(sa.AnimationName + "动画开始播放"); };
    // 动画被中断或者清除
    sa.AnimationState.End += (t) => { print(sa.AnimationName + "动画中断或者清除"); };
    // 播放完成
    sa.AnimationState.Complete += (t) => { print(sa.AnimationName + "动画播放完成"); };
    // 做动画时添加的自定义事件
    sa.AnimationState.Event += (t, e) => { print(sa.AnimationName + "自定义事件"); };

    // 便捷特性

    // 动画特性 [SpineAnimation]  
    // 骨骼特性 [SpineBone]       
    // 插槽特性 [SpineSlot]       
    // 附件特性 [SpineAttachment] 

    // 获取骨骼、设置插槽附件

    // 获取骨骼
    Bone b = sa.skeleton.FindBone(boneName);
    sa.skeleton.SetAttachment(slotName, attachmentName);

    // 在UI中使用
    // SkeletonGraphic(UnityUI)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30578.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java基础学习打卡11】Path环境变量的配置

目录 前言一、为什么配置环境变量二、如何配置环境变量三、JDK11的环境变量配置总结 前言 本文我们要知道为什么配置环境变量&#xff0c;自己思考不配置环境变量可以吗&#xff1f;JDK 11 如何配置环境变量。 一、为什么配置环境变量 原因很简单&#xff0c;就是方便命令的查…

1.5 掌握Scala内建控制结构(一)

一、条件表达式 &#xff08;一&#xff09;语法格式 if (条件) 值1 else 值2 &#xff08;二&#xff09;执行情况 条件为真&#xff0c;结果是值1&#xff1b;条件为假&#xff0c;结果是值2。如果if和else的返回结果同为某种类型&#xff0c;那么条件表达式结果也是那种…

【STM32MP135 - ST官方源码移植】第二章:TF-A源码移植教程

STM32MP135 TF-A源码移植教程 一、创建build.sh编译脚本&#xff08;1&#xff09;解压tf-a的源码压缩包&#xff08;2&#xff09;打补丁&#xff0c;获取stm32mp135的源码&#xff08;3&#xff09;设计编译脚本build.sh1、进入tf-a源码&#xff1a;2、创建build.sh脚本文件3…

HTTP协议,带你了解HTTP协议

目录 1、HTTP 协议介绍 2、HTTP 协议的工作过程 HTTP 协议的工作过程可以分为以下几个步骤&#xff1a; 3、Fiddler 抓包工具介绍 3.1 抓包工具的使用 3.2 抓包结果 3.3 抓包工具原理 4、HTTP 协议格式总览 5、HTTP 请求&#xff08;Request&#xff09; 5.1 认识 URL…

C#中List<T>的排序相关的使用方法总结

C#中List<>的排序相关的使用方法 list的排序一般使用Sort和LINQ的Orderby方法&#xff0c;本文主要介绍其如何使用。 &#x1f32e;1.Sort和实现Comparable接口 此方式需要类去实现IComparable接口 public class OrderTest {[Test]public void OraderTest(){List<E…

MySQL优化--undo log和redo log的区别

首先我们需要知道两个概念 缓冲池&#xff08;buffer pool&#xff09;:主内存中的一个区域&#xff0c;里面可以缓存磁盘上经常操作的真实数据&#xff0c;在执行增删改查操作时&#xff0c;先操作缓冲池中的数据&#xff08;若缓冲池没有数据&#xff0c;则从磁盘加载并缓存…

(写自己语言的练手级应用)JSON(JavaScript Object Notation) 产生式(BNF)

写自己的开发语言时&#xff0c;很多人都会拿JSON当第一个练习对象 开源net json FJSON 解析工具https://dbrwe.blog.csdn.net/article/details/107611540?spm1001.2014.3001.5502 <json> :: <object> | <array> <object> :: "{" [ <me…

操作系统 复习-计算题

一. 计算题&#xff08;共5题&#xff0c;100分&#xff09; 1.(计算题) 假设有4个进程需要在单CPU上运行&#xff0c;它们的执行时间如下表所示&#xff1a; 进程ID执行时间P18P25P32P44 现在我们需要按照抢占式优先级调度算法来安排这些进程的执行顺序。其中&#xff0c;进…

python代码加密方案

为何要对代码加密&#xff1f; python的解释特性是将py编译为独有的二进制编码pyc 文件&#xff0c;然后对pyc中的指令进行解释执行&#xff0c;但是pyc的反编译却非常简单&#xff0c;可直接反编译为源码&#xff0c;当需要将产品发布到外部环境的时候&#xff0c;源码的保护尤…

基于机器学习的内容推荐算法及其心理学、社会学影响闲谈

基于机器学习的内容推荐算法目前在各类内容类APP中使用的非常普遍。在购物、时尚、新闻咨询、学习等领域&#xff0c;根据用户的喜好&#xff0c;进行较为精准的用户画像与内容推荐。此类算法不但可以较为准确的分析用户的特征&#xff0c;如年龄、性别等&#xff0c;还能通过长…

特征点Features2D类介绍

文章目录 Features2D类介绍1. cv::AgastFeatureDetector2. cv::AKAZE3. cv::BRISK4. cv::FastFeatureDetector5. cv::GFTTDetector6. cv::KAZE7. cv::MSER8. cv::SimpleBlobDetector9. cv::StarDetector10. cv::SIFT11. cv::SURF12. cv::FastFeatureDetector13. cv::AgastFeatu…

最喜爱的编程语言——Python

一、编程语言发展 编程语言&#xff08;programming language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。一种能够让程序员准确地定义计算机所需数据的计算机语言&#xff0c;并精确地定义在不同情况下所应当采取的行动。 编程语言处在不断的发展和变化中&…

【c语言】 -- 详解数组篇

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章来学习数据的存储。 让我们开启c语言学…

考虑微网新能源经济消纳的共享储能优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C#异步详解

异步编程是指在程序执行过程中&#xff0c;不需要等待某个操作完成&#xff0c;就可以继续执行后续的代码。比如我们开发了一个web页面中有一个上传文件功能&#xff0c;我们上传文件时使用异步操作&#xff0c;就不用等待文件的上传时间&#xff0c;可以先在网页上进行其他操作…

JAVA_HOME变量的详细配置(图文)

用到Java项目的时候&#xff0c;有时候要用到Java_home&#xff0c;这个需要在系统配置中配置一下。如何操作呢&#xff1f;以下为详细的图文步骤。 1&#xff09;打开环境变量的窗口 2&#xff09;打开新建系统变量 3&#xff09;编辑JAVA_HOME 在变量名后输入JAVA_HOME,找到…

Ui自动化测试如何上传文件

前言 实施UI自动化测试的时候&#xff0c;经常会遇见上传文件的操作&#xff0c;那么对于上传文件你知道几种方法呢&#xff1f;今天我们就总结一下几种常用的上传文件的方法&#xff0c;并分析一下每个方法的优点和缺点以及哪种方法效率&#xff0c;稳定性更高 被测HTML代码…

centos直接部署express

centos直接部署express 以下是在CentOS上部署Express应用程序的一般步骤&#xff1a; 1.安装Node.js 在CentOS系统上安装Node.js。可以使用以下命令安装Node.js&#xff1a; sudo yum install nodejs2.安装npm 安装完Node.js后&#xff0c;还需要安装npm&#xff08;Node.…

Python爬虫被封ip解决方案

在使用 Python 程序进行网络爬虫开发时&#xff0c;可能因以下原因导致被封 IP 或封禁爬虫程序&#xff1a; 1、频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次&#xff0c;从而对目标网站造成较大的负担和压力&#xff0c;这种行为容易引起目标网站的注意并被封禁…

数据结构-队列

数据结构之队列 队列的概念顺序队列循环队列 顺序循环队列的ADT定义1、简单结构体定义2、初始化3、队列的清空4、计算队列的长度5、判断队列是否为空6、插入新的元素7、元素的删除8、遍历输出队列内的所有元素 链队列的ADT定义1、链队列简单结构体定义2、初始化链队列3、判断链…