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

Unity学习笔记(七)使用状态机重构角色攻击

前言

本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记

攻击状态重构

首先我们重构攻击状态的动画

之前的动画,我们是使用状态(isAttacking)+攻击次数(comboCounter)完成动画的过渡,这样虽然能完成功能,但是如果状态多了之后非常难维护。现在我们用子状态来处理攻击的动画

在这里插入图片描述

首先创建子状态机,将 playerAttack1、playerAttack2、playerAttack3 拷贝到子状态机里面,之后就跟普通的动画连线过程没什么区别了

在这里插入图片描述
最终完成的状态、Attack-攻击状态,ComboCounter -连招次数
在这里插入图片描述
需要注意的是要记得取消过渡时间
在这里插入图片描述

创建攻击状态脚本(PlayerPrimaryAttackState)

PlayerPrimaryAttackState

public class PlayerPrimaryAttackState : PlayerState
{private int comboCounter;private float lastTimeAttacked;private float comboWindow = 2;public PlayerPrimaryAttackState(Player3 _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName){}public override void Enter(){base.Enter();xInput = 0; // 修复移动后按攻击时,攻击方向相反的问题if (comboCounter > 2 || Time.time >= lastTimeAttacked + comboWindow)comboCounter = 0;player.anim.SetInteger("ComboCounter", comboCounter);float attackDir = player.facingDir;if (xInput != 0){attackDir = xInput;}player.SetVelocity(player.attackMovement[comboCounter].x * attackDir, player.attackMovement[comboCounter].y);stateTimer = .1f;}public override void Exit(){base.Exit();lastTimeAttacked = Time.time;comboCounter++;}public override void Update(){base.Update();if (stateTimer < 0){player.SetZeroVelocity();}if (triggerCalled){stateMachine.ChangeState(player.idleState);}}
}

PlayerAnimationTriggers 动画结束脚本

public class PlayerAnimationTriggers : MonoBehaviour
{private Player3 player => GetComponentInParent<Player3>();private void AnimationTrigger(){player.AnimationTrigger();}
}

在这里插入图片描述

Player 脚本,这里只展示变化

public class Player3 : MonoBehaviour{[Header("Attack details")]// 这个是来设置攻击时移动的 x,y 轴,通过这个来调整动画的展示效果public Vector2[] attackMovement;public float counterAttackDuration = 0.2f;public PlayerPrimaryAttackState attackState { get; private set; }private void Awake(){...attackState = new PlayerPrimaryAttackState(this, stateMachine, "Attack");}public void AnimationTrigger() => stateMachine.currentState.AnimatorFinishTrigger();
}

最终效果

请添加图片描述

当前版本的问题

攻击时突然转向

bug 效果

请添加图片描述

我们可以观察上面状态的变化,player在攻击的间隔会转为 Idle 状态,这个时候突然相反方向,那么就会转换方向

修复问题

使用一个变量表示玩家正在进行某个动作(isBusy),玩家这个状态时,不可以进行方向变化

只展示改动代码

Player3

public class Player3 : MonoBehaviour{public bool isBusy { get; private set; }// 这个方法是修复玩家攻击时突然转向的问题public IEnumerator BusyFor(float _seconds){isBusy = true;yield return new WaitForSeconds(_seconds);isBusy = false;}
}

PlayerIdleState

public class PlayerIdleState : PlayerGroundedState
{public override void Update(){base.Update();if(xInput != 0 && !player.isBusy){stateMachine.ChangeState(player.moveState);}}
}

PlayerPrimaryAttackState

public override void Exit()
{...player.StartCoroutine("BusyFor", .15f);
}
最终效果

请添加图片描述

拓展

Blend Tree & Sub-State Machine 区别

在 Unity 的动画系统中,混合树(Blend Tree)子状态(Sub-State Machine) 是两种不同的功能,分别用于实现动画的不同效果和组织动画的逻辑结构。以下是它们的区别和用途:

  1. 混合树(Blend Tree)
  • 概念: 混合树是一种特殊的动画状态,用于在多段动画之间实现平滑过渡。通过混合参数的调整,Unity 会根据权重动态地混合多个动画剪辑或子混合树,从而生成实时动画。
  • 主要功能:
    • 实现动画的动态混合,例如:
      • 行走、奔跑、冲刺等动作的平滑过渡。
      • 不同方向(前、后、左、右)动作的流畅衔接。
    • 通过输入参数(如速度、方向)控制混合比例,从而生成适应当前状态的动画。
  • 使用场景:
    • 角色的运动状态(如行走和跑步)。
    • 需要在多个动画之间平滑转换的情况。
  • 优点:
    • 动态控制动画混合,非常适合多方向或多状态动画。
    • 减少状态机的复杂度,避免过多的状态和过渡线。
  • 结构:
    • 混合树中的每个动画剪辑(或子混合树)都有对应的权重,权重通过参数(如 SpeedDirection)实时调整。
    • 可以嵌套子混合树,进一步分层混合。
  1. 子状态机(Sub-State Machine)
  • 概念: 子状态机是一种逻辑分组机制,用于将动画状态机中的多个动画状态和它们的过渡逻辑组织到一个独立的子状态机中。
  • 主要功能:
    • 提高动画状态机的组织性和可读性。
    • 将复杂的状态机分解为更小、更易于管理的模块。
  • 使用场景:
    • 拥有复杂动画逻辑的角色(如战斗角色)的状态机。
    • 将状态机按照功能或逻辑分组,例如:
      • 一个子状态机管理移动相关的动画(行走、跑步、跳跃)。
      • 另一个子状态机管理攻击相关的动画(轻击、重击、连击)。
  • 优点:
    • 提高状态机的可维护性,减少主状态机的混乱。
    • 子状态机可以嵌套,支持递归组织逻辑。
  • 结构:
    • 每个子状态机可以包含若干状态(动画剪辑)和它们的过渡线。
    • 子状态机之间可以通过入口和出口连接到主状态机或其他状态。

主要区别

特性混合树(Blend Tree)子状态机(Sub-State Machine)
作用动态混合多个动画,生成实时动画组织和分组动画状态,简化状态机逻辑
适用场景需要平滑过渡的多动画混合(如行走和跑步)复杂动画逻辑分组(如战斗、移动等模块化状态)
控制方式通过参数实时调整混合权重通过状态之间的过渡和触发条件切换状态
复杂度管理简化动画混合逻辑,但本身是一个状态简化状态机结构,适合管理复杂的动画状态
嵌套性支持嵌套子混合树支持嵌套多个子状态机

总结

  • 混合树: 专注于动画的实时混合(如平滑的方向切换、行走到跑步的动态过渡)。
  • 子状态机: 专注于逻辑分组和组织(将状态机模块化,便于管理复杂动画逻辑)。

在实际项目中,可以将两者结合使用:

  • 混合树用于处理连续性较强的动画(如运动状态的混合)。

  • 子状态机用于对动画状态机的逻辑分组(如区分移动逻辑和攻击逻辑)。

    • C# 协程(Coroutine)

      在 Unity 中,StartCoroutine 是一个用于执行 协程(Coroutine) 的方法。协程是 Unity 提供的一种方式,用来在多帧中断执行代码,而不是一次性运行整个方法。通过协程,你可以实现延迟、等待或分阶段的逻辑操作,而无需阻塞主线程。

      1. 协程的特点
      • 异步行为:协程允许代码在一定条件下暂停执行,并在后续某个时间点继续运行。
      • 基于帧更新:协程通过 yield 语句返回控制权,可以在多帧之间执行操作。
      • 与主线程同步:协程不是多线程,它与 Unity 主线程(游戏主循环)一起运行。

      2. StartCoroutine 的用法

      基本语法

      StartCoroutine(IEnumerator coroutineMethod);
      
      • 参数:IEnumerator 是一个迭代器,用来定义协程的行为。
      • 返回值:协程的引用(可以用来停止协程,详见 StopCoroutine)。

      示例 1:等待几秒后执行操作

      using UnityEngine;
      public class CoroutineExample : MonoBehaviour
      {void Start(){// 启动一个协程StartCoroutine(WaitAndPrint());}// 定义协程方法IEnumerator WaitAndPrint(){Debug.Log("开始等待...");// 等待 3 秒(暂停)yield return new WaitForSeconds(3f);Debug.Log("3 秒后继续执行!");}
      }
      

      示例 2:连续多步操作

      IEnumerator MultiStepProcess()
      {Debug.Log("Step 1");yield return new WaitForSeconds(2f); // 等待 2 秒Debug.Log("Step 2");yield return new WaitForSeconds(1f); // 等待 1 秒Debug.Log("Step 3");
      }
      

      示例 3:无限循环协程

      协程可以实现循环逻辑,例如每帧或固定时间间隔执行某些操作。

      IEnumerator ContinuousAction()
      {while (true){Debug.Log("每 2 秒执行一次!");yield return new WaitForSeconds(2f); // 等待 2 秒}
      }
      // 在某些时候启动,例如 Start()
      StartCoroutine(ContinuousAction());
      

      3. yield 的作用

      在协程中,yield 用于暂停协程的执行,并指定暂停条件。以下是一些常见的 yield 语句:

    常用 yield 表达式

    语句说明
    yield return null;暂停到下一帧再继续执行。
    yield return new WaitForSeconds(float time);等待指定时间(以秒为单位),然后继续执行。
    yield return new WaitUntil(() => condition);等待直到条件满足(返回 true),然后继续执行。
    yield return new WaitWhile(() => condition);等待直到条件不再满足(返回 false),然后继续执行。
    yield break;提前退出协程,后续代码不会执行。

    停止协程

    可以通过 StopCoroutineStopAllCoroutines 停止协程。

    停止指定协程

    Coroutine myCoroutine;
    void Start()
    {// 保存协程引用myCoroutine = StartCoroutine(MyCoroutineMethod());
    }
    void StopMyCoroutine()
    {// 停止协程StopCoroutine(myCoroutine);
    }
    

    停止所有协程

    void StopAll()
    {StopAllCoroutines(); // 停止当前脚本中所有运行的协程
    }
    
    1. 协程的局限性
    • 协程不是线程
      • 协程运行在主线程上,不适用于多线程并发处理。
      • 如果主线程阻塞,协程也会暂停。
    • 耗时操作问题
      • 不适合处理非常长时间的操作(如加载大文件),因为它会阻塞 Unity 的主线程。
    • 需要注意生命周期
      • 如果一个对象销毁了,它附加的协程也会自动停止。
    1. 常见用例
    • 延迟操作:在游戏中实现延迟(如攻击冷却、技能施放)。
    • 动画控制:在动画或粒子系统中等待一定时间后触发事件。
    • 网络请求:等待网络响应完成后处理结果。
    • 阶段处理:分帧处理复杂计算或加载操作,避免主线程卡顿。
    1. 总结
    • StartCoroutine 是 Unity 中一种优雅的异步机制,用于执行多帧操作。
    • 它的本质是基于 IEnumeratoryield 来实现的逻辑暂停。
    • 虽然简单易用,但需要注意它并不是真正的多线程,不适合所有异步场景。

    如果你需要更高性能的异步处理,可以结合 Unity 的 异步任务(Async/Await 来使用,例如配合 Task 和 UnityWebRequest 等功能。

相关文章:

Unity学习笔记(七)使用状态机重构角色攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画&#xff0c;我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡&#xff0c;这样虽然能完成功能&#xff0c;但是如…...

【整理集合大全】MySQL(4) 数据库增删改查SQL语句

查看数据库 show databases; 使用数据库 use 数据库名;创建数据库 CREATE DATABASE 数据库名;删除数据库 DROP DATABASE 数据库名;创建表 create table 表名(列名1 类型(长度) [约束],列名2 类型(长度) [约束],…… );长度区别 int类型带长度&#xff1a;不影响存取值&…...

Flutter 鸿蒙化 flutter和鸿蒙next混和渲染

前言导读 这一个节课我们讲一下PlatformView的是使用 我们在实战中有可能出现了在鸿蒙next只加载一部分Flutter的情况 我们今天就讲一下这种情况具体实现要使用到我们的PlatformView 效果图 具体实现: 一、Native侧 使用 DevEco Studio工具打开 platform_view_example\oho…...

Flask返回浏览器无乱码方法

# -*- coding: utf-8 -*- from flask import Flask, request, jsonify, Response import os import json import re from datetime import datetime import logging import sys import crawling_web_knowledgeapp Flask(__name__)app.json.ensure_ascii False # 解决中文乱码…...

Tauri教程-基础篇-第二节 Tauri的核心概念下篇

“如果结果不如你所愿&#xff0c;就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持&#xff0c;而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第四章 Tauri的基础教程 第二节…...

直播预告|StarRocks 3.4,打造 AI 时代的智能数据基座,应用场景全面扩展

随着新年的到来&#xff0c;StarRocks 3.4 即将上线&#xff0c;为 AI Workload 和更多应用场景提供强大支持&#xff01;此次升级聚焦于提升 AI 场景支持&#xff0c;并扩展更多应用场景&#xff0c;全方位提升数据分析体验。 更强的 AI 场景支持&#xff1a; 引入 Vector In…...

Maven的基本使用

Maven apache 旗下的开源项目&#xff0c;是一款用于管理构建Java的项目的工具 一 作用 1依赖管理&#xff1a;管理jar包&#xff0c;避免依赖冲突 2统一项目结构 &#xff1a; 3项目构建&#xff1a; 二 安装 下面是全球唯一的中央仓库 https://repo1.maven.org/maven2…...

【深度学习入门_基础篇】线性代数本质

开坑本部分主要为基础知识复习&#xff0c;新开坑中&#xff0c;学习记录自用。 学习目标&#xff1a; 熟悉向量、线性组合、线性变换、基变换、矩阵运算、逆函数、秩、列空间、零空间、范式、特征指、特征向量等含义与应用。 强烈推荐此视频&#xff1a; 【官方双语/合集】…...

数据库模型全解析:从文档存储到搜索引擎

目录 前言1. 文档存储&#xff08;Document Store&#xff09;1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库&#xff08;Graph DBMS&#xff09;2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库&#xff08;Native XML DBMS&#xff09;3.1 概念与…...

LED背光驱动芯片RT9293应用电路

一&#xff09;简介&#xff1a; RT9293 是一款高频、异步的 Boost 升压型 LED 定电流驱动控制器&#xff0c;其工作原理如下&#xff1a; 1&#xff09;基本电路结构及原理 RT9293的主要功能为上图的Q1. Boost 电路核心原理&#xff1a;基于电感和电容的特性实现升压功能。当…...

Ubuntu挂载云盘操作步骤

1. 查看磁盘分区情况 使用 fdisk -l 命令查看当前系统中所有磁盘的分区情况&#xff0c;找到需要挂载的云盘设备&#xff0c;例如/dev/vdc。 2. 创建新分区 使用 fdisk /dev/vdc 命令对云盘进行分区操作&#xff1a; 输入n创建新分区。 输入p选择创建主分区。 输入1指定分区…...

【中间件】docker+kafka单节点部署---zookeeper模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控&#xff0c;先在测试环境部署单节点kafka验证…...

Arduino IDE刷微控制器并下载对应固件的原由

在使用Arduino IDE刷写某个微控制器时&#xff0c;下载对应的固件通常是为了确保微控制器能够正确识别和执行Arduino IDE中编写的代码。以下是对这一过程的详细解释&#xff1a; 一、固件的作用 固件是微控制器或嵌入式设备上运行的软件&#xff0c;它负责控制硬件设备的操作…...

深兰科技董事长陈海波应邀为华东师大心理学专业师生做AI专题讲座

12月28日&#xff0c;应上海华东师范大学的邀请&#xff0c;上海市科协常委、上海交通大学博士生导师、深兰科技创始人兼董事长陈海波专程到校&#xff0c;为该校心理学专业的全体师生做了一场关于人工智能推动个人数字化未来的专题讲座。 他在演讲中&#xff0c;首先详细讲述了…...

iOS - 引用计数(ARC)

1. 基本数据结构 // 对象结构 struct objc_object {isa_t isa; // isa 指针&#xff0c;包含引用计数信息 };// isa 的位域结构 union isa_t {uintptr_t bits;struct {uintptr_t nonpointer : 1; // 是否启用优化的 isa 指针uintptr_t has_assoc : 1; // 是…...

【物联网原理与运用】知识点总结(上)

目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性&#xff08;五大功能域&#xff09; 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …...

Flux“炼丹炉”——fluxgym安装教程

一、介绍 这个炼丹炉目前可以训练除了flux-dev之外的其它模型&#xff0c;只需更改一个配置文件内容即可。重要的是训练时不需要提前进行图片裁剪、打标等前置工作&#xff0c;只需下图的三个步骤即可开始训练。它就是——fluxgym。 fluxgym&#xff1a;用于训练具有低 VRAM &…...

【Jsoncpp】manipulating JSON data in C++

源代码 #include <iostream> // 引入输入输出流库&#xff0c;用于标准输入输出操作 #include <fstream> // 引入文件流库&#xff0c;用于文件读写操作 #include <json/json.h> // 引入JSON库&#xff0c;用于解析和操作JSON数据using namespace std; …...

Ardupilot开源无人机之Geek SDK进展2024

Ardupilot开源无人机之Geek SDK进展202501 1. 源由2. 状态3. TODO3.1 跟踪目标框3.2 onnxruntime版本3.3 CUDA 11.8版本3.4 pytorch v2.5.1版本3.5 Inference性能3.6 特定目标集Training 4. 参考资料 1. 源由 前期搭建《Ardupilot开源无人机之Geek SDK》&#xff0c;主要目的是…...

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…...

配置数据的抗辐照加固方法

SRAM 型FPGA 的配置存储器可以看成是由0 和1 组成的二维阵列&#xff0c;帧的高度为矩阵阵列的高度&#xff0c;相同结构的配置帧组成配置列&#xff0c;如CLB 列、IOB 列、输入输出互联(Input Output Interconnect,IOI)列、全局时钟(Global Clock, GCLK)列、BRAM 列和BRAM 互联…...

【linux系统之redis6】处理可视化工具无法连接服务器端的redis

redis跑在虚拟机上的linux系统是可以正常的&#xff0c;但是用宿主机的可视化工具链接就连不上 可视化工具无法连接 问题排查 确保配置文件开启了bind 0.0.0.0,允许外部任何终端的链接密码确保正确要关闭linux系统的防火墙(我的属于这种) systemctl stop firewalld.servic…...

云计算操作系统的核心-OpenStack框架全解析

文章目录 一、OpenStack简介二、OpenStack架构1.认证服务Keystone2.镜像服务Glance3.计算服务Nova4.块存储服务Clinder5.对象存储服务Swift6.网络服务Neutron7.计量服务Ceilometer 三、服务简介3.1 OpenStack界面管理3.2 Keystone 认证3.3 Glance3.3 Nova3.4 存储服务3.5 Neutr…...

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域&#xff0c;设计模式是解决常见设计问题的经典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人帮&#xff0c;GoF&#xff09;在《设计模式&#xff1a;可复用面向对象软件的基础》一书中系统性地总结了…...

记录一下Coding一直不能clone

配置 下载git客户端&#xff0c;进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit&#xff0c;配置这几个参数 配置凭据管理器 注意 这里用户名是…...

Backend - C# EF Core 执行迁移 Migrate

目录 一、创建Postgre数据库 二、安装包 &#xff08;一&#xff09;查看是否存在该安装包 &#xff08;二&#xff09;安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行&#xff08;针对visual studio&#xff09; 查看迁移功能的常用命令&#xff1a; 查看…...

检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313 Github地址&#xff1a;https://github.com/CraftJarvis/RAT 想象一下&#xff0c;一个人工智能助手可以像莎士比亚一样写作&#xff0c;像专家一样推理。这听起来很了不起&#xff0c;对吧&#xff1f;但是&#xff0…...

第四届电子信息与通信工程国际学术会议(EICE 2025)

第四届电子信息与通信工程国际学术会议&#xff08;EICE 2025&#xff09;定于2025年1月10日至12日在中国广州举行。大会交流全球相关领域科技学术最新发展趋势&#xff0c;链接重点领域国内外顶尖、活跃、最新学术资源&#xff0c;通过经验分享和智慧碰撞&#xff0c;推动科研…...

Hbuilder ios 离线打包sdk版本4.36,HbuilderX 4.36生成打包资源 问题记录

1、打包文档地址https://nativesupport.dcloud.net.cn/AppDocs/usesdk/ios.html#%E9%85%8D%E7%BD%AE%E5%BA%94%E7%94%A8%E7%89%88%E6%9C%AC%E5%8F%B7 2、配置应用图标 如果没有appicon文件&#xff0c;此时找到 Assets.xcassets 或者 Images.xcassets(看你sdk引入的启动文件中…...

HarmonyOS开发:传参方式

一、父子组件传参 1、父传子&#xff08;Prop方式&#xff09; 父组件代码 Entry Component struct ParentComponent {State parentMessage: string Hello from Parent;build() {Column() {ChildComponent({ message: this.parentMessage });}} } 子组件代码 Component s…...

Tomcat(116) 如何在Tomcat中解决缓存问题?

在Tomcat中解决缓存问题涉及多个方面的优化和处理&#xff0c;包括优化缓存配置、监控缓存状态、处理缓存失效和一致性问题等。以下是详细的步骤和代码示例&#xff0c;帮助你在Tomcat中解决缓存问题。 1. 优化缓存配置 Tomcat内置了一些静态资源的缓存机制&#xff0c;可以通…...

2.STM32F407ZGT6-外部中断

参考&#xff1a; 1.正点原子。 前言&#xff1a; MCU最重要的一个领域–中断。总结下嵌套向量和外部中断的概念。达到&#xff1a; 1.NVIC是什么&#xff0c;了解中断的整体管理理念。 2.中断里面最简单的外部中断&#xff0c;怎么配置处理。 3.使用STM32CubeMX配置外部中断的…...

C# 之某度协议登录,JS逆向,手机号绑定,获取CK

.NET兼职社区 .NET兼职社区 .NET兼职社区 .NET兼职社区 有需要指导&#xff0c;请私信我留言V或者去社区找客服。...

0基础学前端-----CSS DAY12

视频参考&#xff1a;B站Pink老师 今天是CSS学习的第十二天&#xff0c;今天开始的笔记对应Pink老师课程中的CSS第七天的内容。 本节重点&#xff1a;CSS高级技巧 本章目录 本节目标1. 精灵图1.1 为什么需要精灵图1.2 精灵图使用案例&#xff1a;拼出自己的名字 2. 字体图标2.…...

STM32——系统滴答定时器(SysTick寄存器详解)

文章目录 1.SysTick简介2.工作原理3.SysTick寄存器4.代码延时逻辑5.附上整体代码6.一些重要解释 1.SysTick简介 Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生 SysTick异常(异常类型#15)。SysTick为简单的向下计数的24位计数…...

HTML5 弹跳动画(Bounce Animation)详解

HTML5 弹跳动画&#xff08;Bounce Animation&#xff09;详解 弹跳动画是一种动态效果&#xff0c;使元素在出现或消失时看起来像是在跳动。这种效果可以通过 CSS 动画或 JavaScript 来实现&#xff0c;增强用户体验。 1. 使用 CSS 实现弹跳动画 可以使用 CSS 的 keyframes…...

Python 模拟登录网页,或者编写爬虫时模拟登录的详细总结

参考 Python模拟登陆网页的三种方法_python模拟登录-CSDN博客 python-模拟登陆多种方法总结_python模拟登录-CSDN博客 Python模拟登录的几种方法_实现模拟登录的方式有哪些?-CSDN博客 Python爬虫——模拟登录_python 模拟登录-CSDN博客 Python3 爬虫 模拟登录_python模拟登录网…...

若依框架简介

若依&#xff08;RuoYi&#xff09;框架是一个基于Java语言的后台管理系统快速开发框架&#xff0c;它结合了多种前端和后端技术&#xff0c;提供了高效的开发工具。以下是对若依框架的详细解析&#xff1a; 一、技术架构 后端&#xff1a;若依框架后端采用了Spring Boot、My…...

Linux中rsync命令使用

一、rsync简介 rsync 是一种高效的文件复制和同步工具&#xff0c;常用于在本地或远程计算机之间同步文件和目录 主要特性增量同步&#xff1a;rsync 会检测源和目标文件之间的差异&#xff0c;只传输发生变化的部分&#xff0c;而不是重新传输整个文件。这样就能有效减少数据…...

opencv 学习(1)

文章目录 opencv导学部分opencv的作用ffmpeg和 opencv的关系opencv的未来 计算机视觉是什么&#xff1f; opencv导学部分 opencv的作用 1 : 目标识别 人脸识别 车辆识别 2 : 自动驾驶技术 – 计算机视觉 进行车道的检测 3 : 医学图像分析 通过分析光片 来分析人到底得了什么病…...

中高级运维工程师运维面试题(十一)之 Docker

目录 往期回顾前言基础知识1. 什么是 Docker&#xff1f;2. Docker 的核心组件有哪些&#xff1f;3. Docker 镜像和容器有什么区别&#xff1f;4. 什么是 Dockerfile&#xff1f; 高级知识5. 什么是多阶段构建&#xff1f;如何使用&#xff1f;6. Docker 网络有哪些模式&#x…...

Kafka如何实现顺序消费?

Kafka的消息是存储在指定的topic中的某个partition中的。并且一个topic是可以有多个partition的。同一个partition中的消息是有序的&#xff0c;但是跨partition&#xff0c;或者跨topic的消息就是无序的了。 为什么同一个partition的消息是有序的? 因为当生产者向某个parti…...

通过 ulimit 和 sysctl 调整Linux系统性能

目录 一&#xff1a;资源限制管理工具&#xff1a;ulimit1、ulimit 作用介绍2、ulimit 常用选项3、ulimit 配置文件 二&#xff1a;内核参数调整工具&#xff1a;sysctl1、sysctl 作用介绍2、sysctl 常用选项3、sysctl 配置文件 一&#xff1a;资源限制管理工具&#xff1a;uli…...

pandas基础使用

pandas基础使用 基本介绍 类似于字典形式的numpy&#xff0c;可以给它的不同行和不同列进行重命名。 import numpy as np import pandas as pd # 创建一个序列 s pd.Series([1,4,True,np.nan,55.0])创建date format日期矩阵 import numpy as np import pandas as pd dates…...

2024.1.5总结

今日不开心:这周本来想花点时间学习的&#xff0c;没想到全都花在刷视频&#xff0c;外出消费去了。 今日思考: 1.找对象这件事确实不能强求&#xff0c;顺其自然吧&#xff0c;单身和不单身&#xff0c;其实&#xff0c;各有各的利弊。在一次坐地铁的过程中&#xff0c;我一…...

解释一下:运放的输入偏置电流

输入偏置电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…...

Federation机制的实现

1.关闭Hadoop的HDFS和YARN&#xff0c;依次执行“stop-yarn.sh”和“stop-dfs.sh”命令关闭Hadoop的YARN和HDFS。 2.删除3台虚拟机上的临时文件&#xff1a; 3.修改hdfs-site.xml配置文件&#xff0c;进入虚拟机liumengting1的/export/servers/hadoop-3.3.4/etc/hadoop目录&…...

120.Jenkins里的Pipeline Script

目录 1. **Declarative Pipeline** 主要部分 示例 2. **Scripted Pipeline** 主要部分 示例 3. **常用指令和功能** 环境变量 工具管理 文件操作 构建触发器 并行执行 异常处理 用户交互 4.**两种类型的特点** 1. **声明式 Pipeline (Declarative Pipeline)** 中…...

SpringBoot3-整合WebSocket指南

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ SpringBoot3-整合WebSocket指南 1. 什么是WebSocket?2. 环境准备2.1 项目依赖 3. WebSocket配置3.1 WebSocket配置类3.2 自定义WebSocket处理器 4. 控制器5. 前端实现5.…...

【npm依赖包介绍】借助rimraf依赖包,在用npm run build构建项目时,清空dist目录,避免新旧混合

文章目录 背景如何使用附上rimraf的介绍和说明主要作用使用场景安装使用示例异步删除同步删除 参考资料 背景 在npm run build时&#xff0c;一般都会清空项目中已有的dist目录再构建&#xff0c;避免新旧混合。 如何使用 可以简单使用rimraf这个npm依赖包。 目前rimraf的最…...