【零基础入门unity游戏开发——动画篇】新动画Animator的使用 —— AnimatorController和Animator的使用
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了
C#篇、unity通用篇、unity3D篇、unity2D篇
。
- 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的同学入门。
- 【unity通用篇】:主要讲解unity的基础通用的知识,包括unity界面、unity脚本、unity资源管理、unity动画、unity摄像机等,适合unity初学者入门。
- 【unity3D篇】:主要讲解unity3D的知识,unity3D角色、unity3D物理系统、unity3D光照等,适合只想做2D游戏的开发者学习。
- 【unity2D篇】unity2D篇:主要讲解unity2D的知识,包括unity2D角色、unity2D物理系统、unity2D光照等,适合只想做3D游戏的开发者学习。
这样方便大家按需选择性的去学习,比如有编程基础的大概率可以直接从unity通用篇开始入门,没有编程基础的建议从C#篇开始学习。只想做2D游戏的话,可以直接从unity2D篇开始学习,3D篇大概率就不需要看了,节约学习时间成本。
文章目录
- 前置知识
- 一、使用新动画Animator
- 方法一 自动关联动画
- 1、打开动画窗口
- 2、创建Animation动画文件
- 方法二 手动创建关联动画
- 1、创建动画器控制器
- 2、拖入动画
- 4、绑定控制器
- 二、Animator动画器组件参数
- 1、Controller 控制器
- 2、Avatar 绑定骨骼
- 3、Apply Root Motion 应用根运动
- 4、Animate Physics 动画物理
- 5、Update Mode 更新模式(一般不修改它)
- 6、Culling Mode 剔除模式
- 三、AnimatorController面板参数
- 1、Layers 图层
- 2、Parameters 参数
- 3、网格化布局区域
- 3.1 系统自带的默认动作
- 3.2 自定义的动作
- 四、动画状态的基本属性
- 1、Tag 标签
- 2、Motion
- 3、speed 速度
- 4、Motion Time
- 5、Mirror 镜像
- 6、CycleOffset
- 7、Foot IK
- 8、Write Defaults
- 五、状态切换连线
- 1、自定义关联动画
- 2、切换默认播放动画
- 3、创建过渡
- 4、添加状态切换条件
- 5、设置动画间切换条件
- 六、状态切换连线参数
- 1、HasExitTime(是否有退出时间) 和 ExitTime(退出时间)
- 3、FixedDuration(固定持续时间) 和 TrnaitionDuration 过渡持续时间
- 4、Transition Offset 过渡偏移
- 5、Interruption Source 中断源
- 6、Ordered Interruption 有序中断
- 7、Conditions:过渡条件
- 8、AnyState和动作之间连线参数
- 8.1 Can Transition To self 可以过渡到自己
- 8.2 Preview source state
- 七、Animator动画器代码控制
- 1、获得Animator组件
- 2、通过状态机条件切换动画
- 3、获得动画参数状态
- 4、直接切换动画
- 八、Animator本质上是一个有限状态机
- 1、有限状态机(FSM)核心概念
- 2、为什么Unity的Animator是FSM?
- 九、实战
- 1、实现角色播放说话动画
- 1.1 导入动画人物资源
- 1.2 给人物绑定默认动画
- 1.3 绑定两个动画切换
- 1.4 循环播放两个动作
- 1.5 参数控制动作的切换
- 1.6 写脚本控制动作的切换
- 1.7 动画切换延迟问题
- 2、实现角色从站立到跑步动画的来回切换
- 2.1 配置动画控制器
- 2.2 编写代码控制人物
- 2.3 结果
- 2.4 过渡时间
- 专栏推荐
- 完结
前置知识
学习本章知识,得先去看看Animation动画相关知识:【零基础入门unity游戏开发——动画篇】Animation动画窗口,创建编辑动画
一、使用新动画Animator
方法一 自动关联动画
适合没有动画,想通过unity自定义创建编辑动画
1、打开动画窗口
2、创建Animation动画文件
在场景中选择需要创建动画的对象,在 Animation 窗口创建一个动画文件。
通过为场景中物体创建动画时会自动创建animator组件,并且关联 AnimatorController动画控制器文件。
双击AnimatorController动画控制器文件,打开 Animator 窗口可以看到刚刚添加的 Animation 文件已经添加到窗口中了。
方法二 手动创建关联动画
适合已有动画,为特定模型绑定对应动画
1、创建动画器控制器
在 Project 窗口右键创建动画器控制器
2、拖入动画
新建的 AnimatorController 文件是空的,可以拖 Animation 文件进去。双击动画器控制器,编辑动画控制器,拖入准备好的动画。
4、绑定控制器
新建cube,添加animator组件,拖入绑定动画控制器
二、Animator动画器组件参数
1、Controller 控制器
动画状态机控制器。我们需要在这里放置一个AnimatorController,也就是动画状态机控制器,它是我们组织并管理动画片段的工具,只有放置了animator controller才能播放动画
2、Avatar 绑定骨骼
如果我们要播放的是使用了avatar系统的人形动画,这里要注意一点,如果我们没有使用avatar,那么animator组件会严格按照动画片段里记录的path,去寻找相应的游戏对象并播放动画。
3、Apply Root Motion 应用根运动
是否启用动画位移。有些动画本身带位移,勾选Apply Root Motion,就会使用动画的位移。
如果我们希望通过自己编写脚本来控制角色的位移和旋转,那么这里就不用勾选。
4、Animate Physics 动画物理
通知物理系统动画变换。
5、Update Mode 更新模式(一般不修改它)
- Normal:正常更新。update模式同步刷新
- Fixed:物理更新。FixedUpdate模式同步刷新
- Unscaled Time:不受时间缩放影响。这个unscaled time和normal一样都是与update的方法同步刷新,但是这个模式下会忽略当前的时间标尺time scale 。
如果修改time scale 会发现只有第三个模式动画不受影响
6、Culling Mode 剔除模式
所谓剔除原本是图形学上的一个概念,也就是指当某个物体并没有被摄像机看到时,那么我们就不需要去渲染它。那么同理在动画里就是指当这个游戏对象,没有被摄像机所看到时,那么我们应该做如何的处理。
- Always Animate:始终播放动画,即使在屏幕外也不剔除。就是不进行剔除,不管摄像机有没有看到它,我们的动画不受影响。
- Cull Update Transforms:摄像机没有渲染该物体时,停止位置、IK的写入。这是指如果该游戏对象并没有被摄像机看到,那么animator还是会计算当前的动画状态等到摄像机再次看到该物体时,你会发现这里和上面的always animate并没有什么区别,但是选择这个选项会剔除诸如IK之类的操作。
- Cull Completely:摄像机没有渲染物体时,整个动画被完全禁用,等被看到时再重新播放动画。
下面的例子,播放动画时,如果我们旋转一圈摄像机,可以看到前两个的动作还是同步的,但最后一个已经明显不一样了,这说明刚才摄像机没有看到它的时候,它的动画组件实际上是被禁用了的
我们再来看一下有IK的情况,比如下面头部IK一直看向这个球,当我们摄像机不看他们时,会发现第二和第三的头部都不会转动了
三、AnimatorController面板参数
1、Layers 图层
动画层级页签,为动画添加更多的层级,层级权重高的动画播放会覆盖层级低的。
- 可以点击加号添加层级。
- 点击层级的设置按钮对层级进行设置,实战参考:动画混合。
2、Parameters 参数
参数页签,为动画状态机添加控制状态切换的参数。点击加号添加四种参数变量条件。
3、网格化布局区域
主要用于编辑状态之间的切换关系。窗口中的每一个矩形表示一个状态,每一个箭头表示一个切换条件。
3.1 系统自带的默认动作
每个图层有三个默认状态
状态 | 解释 | 介绍 |
---|---|---|
Any State | 任何状态 | 从他创建的过渡连接到新动画,给个条件,无论处于当前场景里的什么状态,只要满足条件,都可以过渡为相连的新动画(比如人物站立跑步动画,正常游戏应该是所有的动画最终都可以切换到站立跑步动画,如果不靠Any State,那么一个动画就需要连一次站立跑步动画,100个动画就得连100次,工作量可想而知) |
Entry | 入口状态 | 进入状态机流程。角色开始的默认状态 |
Exit | 出口状态 | 退出状态机流程。这个用于子状态机的使用,这个我们一般很少用它。 |
3.2 自定义的动作
- 橙色矩形:一开始的默认状态动画,和 Entry 相连,表示一开始播放的动画。
- 灰色矩形:自己添加的某一种动作状态。
注意:Animator 窗口的动画矩形的名字可以自由定义,他已经关联了 Animation 动画文件,默认会和动画文件的名字一样,可以自行修改。
四、动画状态的基本属性
1、Tag 标签
通过打标签,我们可以给不同的动画状态进行分类,以便于我们通过代码进行管理。
比如
//获取状态机
var animator = GetComponent<Animator>();//获取状态机的当前状态,参数为层级序号,0表示BaseLayer
AnimatorStateInfo stateInfo=animator.GetCurrentAnimatorStateInfo(0);
//也可以这样写,注意这个stateInfo每一帧都在更新
// AnimatorStateInfo stateInfo=animator.GetCurrentAnimatorStateInfo(animator.GEtLayerINdex("Base Layer"));//判断当前状态机的状态的tag是否是tagName
bool flag = stateInfo.IsTag("tagName");
2、Motion
该状态所管理的动画片段。如果这个状态是由混合数BlendTree建立的话,那么这里放的就是它所管理的那颗混合树。
3、speed 速度
动画的播放速度。1是正常速度,超过1就是加速,小于1就是减速,如果是负值就是倒放
这个Speed属性是不可以通过脚本更改的,如果我们需要修改游戏中的动画播放速度的话,就需要集合下面这个属性Multiplier,动画的实际播放速度将会是Speed与Multiplier的乘积,我们需要选择一个关联Multiplier的浮点的新变量。
如图只需要我们在脚本里更改animSpeed的大小就可以更改动画播放的速度
//设置动画的播放速度
animator.SetFloat("animSpeed",1);
int speedHash=Animator.StringToHash("animSpeed");
//这行代码与第一行效果一致
animator.SetFloat(speedHash,1);
4、Motion Time
播放动画片段定在一个特定时间点。它也需要关联一个float参数,新建一个变量Process
如果我们给Process的值为0.5,那么这个状态就会一直播放在它所管理的那个动画片段的最中间的那一帧,并且定在那一帧就不动了。如果为0那么状态机就会播放这个动画片段的第一帧也定在那里不动
5、Mirror 镜像
镜像动画。只对人形动画有用
6、CycleOffset
动画偏移。比如0.5就是从动画中间开始播放。
7、Foot IK
它是一种使用了IK的动画校正机制,比如当我们把骨骼系统转化为肌肉系统之后,人形角色的双手和双脚的位置会出现一定的偏移,unity为了解决这个问题,提前为我们保存了骨骼系统下手和脚的正确位置,并把这些位置放置在了四个IK Goal上,把我们脚部的实际位置向这里的IK Goal的位置拉近一点
我们把它勾上看一下
这里有两点需要注意
- 首先,Foot IK只是略微的调整脚部的位置,它可以在一定程度上改善脚部动画的不自然,但是不一定能够满足高质量的动画需求。
- 其次,我们调整IK Goall的位置并不会更改Foot IK的效果,Foot IK所参照的其实并不是这个IK Goalf的本体,而是这个IK Goal当前的或者说初始的位置
8、Write Defaults
从A到B动画的过渡,如果B的动画曲线不包含Scale属性,如果没有勾选WriteDefault,会集成A动画的Scale属性。
如图A动画将cube的scale修改为(3,3,1),如果B状态的属性没有勾选WriteDefault,那么cube在执行B动画时会以scale为(3,3,1)的数值做平移动画,也就是说会继承A播放完成时的动画属性,注意仅限B动画没有Scale变化的动画曲线。如果勾选了WriteDefault,那么cube在执行B动画时scale是(1,1,1),不会继承前动画属性,而是使用一个默认值
那么Unity是在什么时候设置的这个默认值呢?
是在Animator组件调用OnEnable方法时,获取Cube的Scale作为默认值,也就是说Cube的enable属性被反复勾选时,Animator会多次读取cube的状态作为默认值。
这可能就会出现一个问题,如果cube在scale为(2,2,2)时setActive(false),然后setActive(true)后,scale的默认值会变成(2,2,2),下次在播放b动画时,会以(2,2,2)的属性做平移(B勾选了WriteDefault的前提)。
所以如果动画出现莫名其妙的bug,试试查看是不是WriteDefault导致的。
五、状态切换连线
1、自定义关联动画
我们可以在面板右键创建状态,再关联动画。
2、切换默认播放动画
游戏一运行会直接播放默认状态连线的动画,我们可以手动进行切换。
效果
3、创建过渡
对一个矩形右键选择创建过渡。
创建后会出现连线,选择另一个矩形进行连接。点击连接线可以看到右侧多了很多参数。
添加连线后意味着这两个矩形状态可以进行状态切换,可以给连线设置切换的条件。没有连线的话两个状态不能进行切换。
4、添加状态切换条件
把左侧面板切换成参数标签,
5、设置动画间切换条件
选择一个连线,点击下方条件列表添加切换条件,点击下拉框会出现我们刚刚设置好的切换条件参数进行选择。同理选择条件框后按减号可以删除。
注意:连线上的这些条件要同时满足才能完成状态的切换。
-
Float: 一个带有小数部分的数,可以选择大于或者小于和后面设置好的数比较判断是否满足条件。
-
Int:一个整数,可以选择大于,小于,等于,不等于和后面设置好的数比较判断是否满足条件。
-
Bool:真或假的值(用复选框表示),和设置好的真假进行比较判断是否满足条件。
-
Trigger:一个布尔参数,当被转换消耗时,由控制器重置(用圆形按钮表示)。可以理解为特殊的 bool 值,当设置为 true 完成切换条件后马上会自动设置为 false。
六、状态切换连线参数
1、HasExitTime(是否有退出时间) 和 ExitTime(退出时间)
如果勾选HasExitTime,当切换动画时,动画一定是播放到下方的Exit Time(百分比)的时间时才过渡到下一个动画,没什么特殊需求的话,想立刻切动画,就不勾选这个选项。
当勾选上方的Has Exit Time时,ExitTime值决定了过渡生效的确切时间。该值可以大于1,如果小于1,比如0.85,表示当动画播放到了85%的动画时,就会过渡。如果大于1,比如4.5,那么动画将循环4.5次后过渡到下一个动画。
3、FixedDuration(固定持续时间) 和 TrnaitionDuration 过渡持续时间
选中后,下方的TrnaitionDuration过渡持续时间将以秒为单位
解读过渡时间,如果不选中,则以百分比
解读过渡时间。
TrnaitionDuration 相当于从该状态切换到下一状态的过渡动画持续的时间,对应下方两个蓝色箭头包裹区域。
4、Transition Offset 过渡偏移
过渡到目标状态的起始播放的时间偏移。如果是0则从要切换到的目标状态开头开始播放,如果是0.5则从要切换到的目标状态的一半开始播放,你可以理解为切入下一个状态的切入点。
5、Interruption Source 中断源
该过渡中断的情况。
- None:不在添加任何过渡
- Current State:将当前状态过渡排队
- Next State:使下一个状态的过渡进行排队
- Current State Then Next State:将当前状态的过渡和下一个状态的过渡都依次排队
- Next State Thne Current State:将下一状态的过渡和当前状态的过渡依次排队
6、Ordered Interruption 有序中断
当前过渡是否可在不考虑顺序的情况下被其它过渡中断
- 选中时,找到有效过渡或当前过渡时,会中断
- 不选中时,找到有效过渡,会中断
7、Conditions:过渡条件
如果没有过渡条件,只会考虑Exit Time
8、AnyState和动作之间连线参数
如果是AnyState和动作之间连线的话会多出两个参数
8.1 Can Transition To self 可以过渡到自己
是否可以过渡到自己,如果希望自己不要打断自己,取消该选项。一般取消勾选
8.2 Preview source state
预览各种过渡状态,可以查看从任意状态切换到当前状态的过渡效果
七、Animator动画器代码控制
1、获得Animator组件
animator = this.GetComponent<Animator>();
2、通过状态机条件切换动画
Animator.SetXXX方法
我们用代码控制状态机切换主要使用的就是Animator提供给我们的API,我们知道一共有四种切换条件 int float bool trigger,所以对应的API也有4种。
//设置动画参数状态
animator.SetFloat("条件名", 1.2f);
animator.SetInteger("条件名", 5);
animator.SetBool("条件名", true);
animator.SetTrigger("条件名");
哈希处理字符串(重要
)
使用哈希的主要原因是提高效率。状态机中的标签和参数通常用字符串表示,但字符串比较在性能上可能较慢。通过使用哈希值,可以将字符串转换为唯一的整数值,进行更快速的比较操作。这避免了每帧都进行昂贵的字符串比较操作,从而提升了状态机查询的性能。
比如
# 普通切换动画状态
anim.SetTrigger("attack");# 对字符串进行哈希处理
private int _attackTrigger = Animator.StringToHash("attack");
anim.SetTrigger(_attackTrigger);
注意:字符串先转哈希值,再使用,这是一个好习惯,希望实际项目中大家能多多应用。
3、获得动画参数状态
Animator.GetXXX方法
//获得动画参数状态
animator.GetFloat("条件名");
animator.GetInteger("条件名");
animator.GetBool("条件名");
4、直接切换动画
除非特殊情况,不然一般不使用。
注意:状态名和动画名不一定一样。动画名拖进来默认名字就是状态名,但是可以修改。
//直接切换动画
animator.Play("状态名");
八、Animator本质上是一个有限状态机
Unity 的 Animator是一个典型的有限状态机实现,因为它严格遵循 FSM 的核心定义,Animator本质上是把动画逻辑用状态机的形式可视化呈现,完美符合FSM的核心特征。
1、有限状态机(FSM)核心概念
- 有限状态:系统拥有明确且数量有限的状态集合(如待机、移动、攻击)。
- 状态转换规则:通过条件(如按键输入、时间阈值)触发状态切换。
- 单一活跃状态:同一时间只能处于一个状态。
比如
假设你有一个智能台灯,它有3种状态:关闭、弱光、强光。
-
状态:3种明确的模式(关闭/弱光/强光)
-
转换条件:单击开关切到弱光,再单击切到强光,长按2秒关闭
-
规则:任何时候只能处于其中一种状态
2、为什么Unity的Animator是FSM?
-
状态集合:比如游戏中角色有站立、奔跑、跳跃、攻击等明确的动画状态
-
转换箭头:Animator窗口中那些连接状态的箭头就是状态转换条件
-
触发机制:通过设置参数(如"Speed>1"或"按下空格键")控制状态切换
-
单一状态:角色同一时间只能播放一个基础动画(比如不能同时处于站立和跳跃状态)
九、实战
1、实现角色播放说话动画
1.1 导入动画人物资源
前往unity资源商城购买免费资源,下载导入
- 人物资源:Adventure Character
- 动画资源:Basic Motions FREE
拖入角色
预览动画
1.2 给人物绑定默认动画
注意,这里我们想学习动画的使用,所以我们就不用资源自带的动画器控制器了,新建ManController控制器
拖入绑定控制器
编辑控制器
1.3 绑定两个动画切换
拖入新的动画,说话动画
创建过渡,连接两个动画
运行查看效果,站立动画执行完就会执行说话动画(只会执行一次说话动画)
1.4 循环播放两个动作
再创建一条过渡,当说话动作执行完,又会执行站立,实现无限循环
1.5 参数控制动作的切换
实现参数按钮控制动画过渡,添加Trigger(触发器)
过渡绑定条件参数,选择F,当F被触发时才会过渡为说话动画
点击F参数,触发一次说话动作
1.6 写脚本控制动作的切换
写脚本控制F参数的触发
void Update()
{//按下一次键盘F按钮,触发一次参数F事件if(Input.GetKeyDown(KeyCode.F)){GetComponent<Animator>().SetTrigger("F");}}
1.7 动画切换延迟问题
实操过程中,你会发现动作切换有延迟,原因是每个动作都有他的读条时间,一个动作读条结束才会执行下一个动作
如何解决延迟问题?取消勾选过渡动画的退出时间即可
最终效果,动作切换非常的丝滑
2、实现角色从站立到跑步动画的来回切换
2.1 配置动画控制器
拖入角色站立和跑步动画
因为跑步是持续性的,和前面说话动画不一样,所以应该使用前面的三个参数控制都可以,我这里用的bool值,修改参数名为isRun
绑定过渡条件,isRun=true切换为奔跑状态,isRun为false变为站立状态
记得去掉两个过渡条件退出时间
的勾选,不然动作切换会有延迟
2.2 编写代码控制人物
代码实现按键控制人物朝向,移动和播放不同动作
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ManScript : MonoBehaviour
{private Animator animator;// Start is called before the first frame updatevoid Start(){animator = GetComponent<Animator>();}// Update is called once per framevoid Update(){//水平轴float horizontal = Input.GetAxis("Horizontal");//垂直轴float vertical = Input.GetAxis("Vertical");//向量Vector3 dir = new Vector3(horizontal, 0,vertical);//当用户按下方向按键if(dir != Vector3.zero){//人物一直面向向量transform.rotation = Quaternion.LookRotation(dir);//播放跑步动画animator.SetBool("isRun", true);//如果动画不带移动效果,还得控制人物进行移动(我这里动画有移动效果所以不需要),因为人物一直面向向量,所以直接控制人物朝前方行走即可//transform.Translate(Vector3.forward*2*Time.deltaTime);//每秒朝前方移动2米}else{//播放站立动画animator.SetBool("isRun", false);}}
}
2.3 结果
2.4 过渡时间
如果你实际操作,会感觉稍微有一点不跟手
,因为动作过渡默认会设置一个过渡时间,如果你不想要可以把它设置为0(注意:没有过渡时间可能导致动作切换有点生硬
,所以具体还是看自己的选择)
专栏推荐
地址 |
---|
【零基础入门unity游戏开发——C#篇】 |
【零基础入门unity游戏开发——unity通用篇】 |
【零基础入门unity游戏开发——unity3D篇】 |
【零基础入门unity游戏开发——unity2D篇】 |
【制作100个Unity游戏】 |
【推荐100个unity插件】 |
【实现100个unity特效】 |
【unity框架/工具集开发】 |
完结
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
相关文章:
【零基础入门unity游戏开发——动画篇】新动画Animator的使用 —— AnimatorController和Animator的使用
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
npx vite 可以成功运行,但 npm run dev 仍然报错 Missing script: “dev“
npx vite 可以成功运行,但 npm run dev 仍然报错 Missing script: "dev",说明问题可能出在 npm 的脚本解析 或 项目配置 上。以下是具体解决方案: 1. 检查 package.json 的物理位置 可能原因: 你当前运行的目录下可能有一个 无效的 package.json,而真正的 packa…...
Java 泛型的逆变与协变:深入理解类型安全与灵活性
泛型是 Java 中强大的特性之一,它提供了类型安全的集合操作。然而,泛型的类型关系(如逆变与协变)常常让人感到困惑。 本文将深入探讨 Java 泛型中的逆变与协变,帮助你更好地理解其原理和应用场景。 一、什么是协变与…...
C语言核心知识点整理:结构体对齐、预处理、文件操作与Makefile
目录 结构体的字节对齐预处理指令详解文件操作基础Makefile自动化构建总结 1. 结构体的字节对齐 字节对齐原理 内存对齐:CPU访问内存时,对齐的地址能提高效率。操作系统要求变量按类型大小对齐。对齐规则: 每个成员的起始地址必须是min(成…...
深度学习|注意力机制
一、注意力提示 随意:跟随主观意识,也就是指有意识。 注意力机制:考虑“随意线索”,有一个注意力池化层,将会最终选择考虑到“随意线索”的那个值 二、注意力汇聚 这一部分也就是讲第一大点中“注意力汇聚”那个池化…...
特权FPGA之乘法器
完整代码如下: timescale 1ns / 1ps// Company: // Engineer: // // Create Date: 23:08:36 04/21/08 // Design Name: // Module Name: mux_16bit // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: …...
安全的企业局域网聊天工具哪个好用?
在当今数字化时代,企业对于局域网聊天工具的需求日益增长,尤其是在对数据安全和定制化服务有较高要求的大中型政企单位中。安全的企业局域网聊天工具哪个好用?虽然市面上有很多即时通讯软件,今天来介绍一下已经拥有十年行业经验的…...
如何应对客户频繁变更需求
如何应对客户频繁变更需求?要点包括: 快速响应、深入沟通、灵活规划、过程记录、风险管控。这些策略既能降低项目失控风险,也能帮助团队在变动环境中保持高效率。其中深入沟通尤为关键,它不仅能够让团队第一时间了解客户意图&…...
R语言进行聚类分析
目录 简述6种系统聚类法 实验实例和数据资料: 上机实验步骤: 进行最短距离聚类: 进行最长距离聚类: 进行中间距离聚类: 进行类平均法聚类: 进行重心法聚类: 进行ward.D聚类:…...
1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序)
1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序) 如果要使用抓包软件,基本上第一步都是要安装证书的。原因如下: 客户端(浏览器或应用)会检测到证书不受信任,并弹出 证书错误࿰…...
DAPP实战篇:使用web3.js连接合约
说明 本系列内容目录:专栏:区块链入门到放弃查看目录 如果你还没有创建好项目请先查看:《DApp实战篇:先用前端起个项目》,如果你还不知道web3.js是什么请先查看:《DApp实战篇:前端技术栈一览》。 安装 点此查看web3.js官方文档 打开项目根目录,并唤起终端: 键入w…...
用 Python 构建一个简单的本地视频流媒体服务器
你是否曾经想过在本地网络上轻松地将电脑上的视频分享给手机或平板电脑观看?也许你下载了一部电影,想在客厅的智能电视上播放,却不想费力地拷贝文件。今天,我们将深入分析一个 Python 脚本,它使用 wxPython 创建图形用…...
汇丰xxx
1. Spring Boot 的了解,解决什么问题? 我的理解: Spring Boot 是一个基于 Spring 框架的快速开发脚手架,它简化了 Spring 应用的初始搭建和开发过程。解决的问题: 简化配置: 传统的 Spring 应用需要大量的…...
ruby基础语法
以下是 Ruby 基础语法的简明总结,适合快速入门: 一、变量与常量 局部变量 小写字母或下划线开头,作用域为当前代码块。 name "Alice" _age 20实例变量 以 开头,属于对象实例。 name "Bob"类变量 以 开头…...
智体OS-V3.1版:新增了rt-datalink底层数据链通讯,实现【无网络】本机使用
##智体OS-V3.1版本发布 更新简介 dtns.os智体OS-V3.1版:新增了rt-datalink底层数据链通讯(使用本地局域网的websocket端口通讯),解决了本机【无网络】正常使用的问题。 更新内容 dtns.connector支持使用新的rt-datalink与智体…...
Windows系统安装Git以及Git常用命令介绍
本文主要介绍Windows系统安装Git的方法,以及Git常用命令介绍。 一、下载Git 官网: Git - Downloads (git-scm.com) 根据自己的系统选择 我的是64位的Windows系统,选择对应的安装包,点击后开始下载 等待下载完成 二、安装Git 双…...
HTML 开发者的智能助手:通义灵码在 VSCode 中的应用
引言 在 HTML 开发领域,提高编码效率和质量是每位开发者追求的目标。通义灵码,作为一款由阿里云技术团队开发的智能编码助手,能够通过其强大的 AI 能力,为 HTML 开发者提供包括代码自动补全、智能注释、代码优化等多方面的支持。…...
MySQL随机获取记录之方法(The Method of Randomly Obtaining Records in MySQL)
MySQL中如何随机获取一条记录 随机获取一条记录是在数据库查询中常见的需求,特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中,有多种方法可以实现随机获取一条记录,每种方法都有其适用的情况和性能特点。在本文中,我们将…...
ngx_core_module 的 create_conf
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module-CSDN博客 定义在 src\core\nginx.c ngx_module_t ngx_core_module {NGX_MODULE_V1,&ngx_core_module_ctx, /* module context */ngx_core_commands, /* module directives */…...
41--华为IPSec主备链路实验:当加密隧道遇上“双保险“
🚦 华为IPSec主备链路实验:当加密隧道遇上"双保险" “如果你的IPSec隧道只有一条路,那就像走钢丝不系安全带——刺激但危险!” —— 本文将用华为设备打造主备双加密通道,结合IP-link智能检测,让…...
Reactive编程框架与工具
文章目录 6.2 后端 Reactive 框架6.2.1 Spring WebFlux核心架构核心组件实际应用高级特性性能优化适用场景与限制 6.2.2 Akka(Actor模型)Actor模型基础基本用法高级特性响应式特性实现性能优化实际应用场景优势与挑战 6.2.3 Vert.x(事件驱动&…...
vi/vim常用快捷键
那么今天我们继续昨天没有介绍完的vi编辑器,来看看常用的一些快捷键,方便我们对文件的编辑. 1.拷贝当前行yy,拷贝当前行向下的5行5yy,并粘贴(输入p) 2.删除当前行dd,删除当前行向下的5行5d 3.在文件中查找某个单词[命令模式/关键字,回车查找,输入n就是查找下一个] ⭐️&…...
初始JavaEE篇 —— SpringBoot 统一功能处理
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 前言 拦截器 基本使用 拦截器的路径配置 统一数据返回格式 统一异常处理 前言 在实际开发中,某些功能需要强…...
Spring AI Alibaba 文档检索使用
一、文档检索 (Document Retriever)简介 1、核心概念 文档检索(DocumentRetriever)是一种信息检索技术,旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线(online)方式运行。 DocumentRetriever通…...
遍历算法及其应用详解
李升伟 整理 什么是遍历? 遍历是指按照某种规则或顺序,系统地访问数据结构(如树、图等)中的每个节点一次且仅一次的过程。遍历是算法设计中的基本操作,用于访问、检查或修改数据结构中的所有元素。 主要遍历算法 1…...
.NET-EFCore基础知识
.NET EF Core(Entity Framework Core)是微软开发的一款开源的对象关系映射(ORM)框架,用于在.NET 应用程序中与数据库进行交互。以下是一些.NET EF Core 的基础知识: 1. 什么是 EF Core EF Core 是.NET 平…...
R语言基础包可视化(一:axis函数)
R语言基础包可视化(一:axis函数) 背景axis函数(坐标轴函数)各参数的图片示例hadj和padjline和poslty,lwd,lwd.ticksgap.axis总结背景 之前在介绍正态Q-Q图的过程中,画过标准正态分布的随机数、分数数、分布函数、密度函数的图像,相关的文章连接参考此处:R语言正态Q-Q图…...
Axure疑难杂症:垂直菜单折叠与展开(玩转垂直菜单)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:垂直菜单折叠与展开 主要内容:折叠与展开效果 应用场景:PC后台菜单、动态下拉菜单、商品分类选择等折叠与展开场景 案例展示: 案例视频: 垂直菜单折叠与展开效果 正文内容: 关于垂直菜单的折叠与…...
docker 中跑faster-whisper 教程(1050显卡)
之前我本地机器运行faster-whisper 会报错类似 Could not load library libcudnn_ops_infer.so.8github 上也有类似的情况 :https://github.com/SYSTRAN/faster-whisper/issues/516#issuecomment-2785038635 缺少.so.8 文件,我通过以下方式,…...
MySQL 在 CentOS 7 环境安装完整步骤
1. 卸载已有环境(MariaDB/旧版MySQL) 1.停止 MariaDB 服务 systemctl stop mariadb.service 2.检查并卸载 MariaDB/MySQL 安装包 rpm -qa | grep mariadb # 检查 MariaDB 相关包 rpm -qa | grep mysql # 检查 MySQL 相关包 sudo yum remo…...
下一代智能爬虫框架:ScrapeGraphAI 详解
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、ScrapeGraphAI 概述1.1 ScrapeGraphAI介绍1.2 核心特点1.3 工作流程1.4 关键模块1.5 对比传统爬虫框架1.6 安装二、基础操作2.1 自定义解析规则2.2 数据后处理2.3 分布式爬取三、高级功能3.1 多步骤交互采集3.2 动态…...
C++-ffmpeg-2-3-工厂模式封装SDL-9-7
1.接口设计 2.窗口渲染器和材质初始化 3.渲染Draw并测试渲染YUV 4.渲染画面随窗口大小自动缩放并抗锯齿 5.清理接口和接收窗口退出事件 1.接口设计:原则 主要的实现步骤: main的流程: 1打开文件 yuv_file.open("400_300_25.yuv&quo…...
下载极客漫画——Beautiful Soup实用案例
文章目录 一、背景介绍 二、实现思路 三、效果图 四、构思 五、实现细节 1. 第一步下载网页 2. 寻找和下载漫画图像 3. 保存图像,找到前⼀张漫画 六、完整代码 七、程序输出 八、附录 九、总结 一、背景介绍 XKCD网站是一个关于浪漫、隐喻、数字、以及…...
【大模型理论篇】SWIFT: 可扩展轻量级的大模型微调基础设施
1. 背景 大模型(LLM)和多模态大模型(MLLM)利用基于Transformer的架构获得了很迅速的发展。为满足对这些模型的训练和轻量级微调需求,目前已有一些开源框架,如LLaMA-Factory、Firefly、FastChat、Axolotl和LMFlow等。但这些框架在支持的模型、技术和功能上…...
利用 schedule 模块在每日上午每 3 秒执行任务
一、schedule 模块基础原理与功能概述 schedule 模块维护了一个任务队列,每个任务都关联着一个特定的时间触发器和对应的执行函数。当系统时间到达任务设定的触发时间时,模块会从队列中取出相应的任务并执行其关联的函数。这种设 计模式使得开发者无需过多关注底层的时间处理…...
ruby超高级语法
以下是 Ruby 中一些 极度硬核 的语法和底层特性,涉及元编程的深渊、虚拟机原理、语法黑魔法等,适用于追求极限的 Ruby 开发者: 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def foo; "B…...
Java Stream API:现代化集合处理的艺术
Java Stream API:现代化集合处理的艺术 引言 在Java 8中引入的Stream API彻底改变了我们处理集合数据的方式。它不仅仅是一个新的工具集,更代表了一种声明式、函数式的编程范式。本文将深入探讨Java Stream的核心概念、使用场景和最佳实践。 一、什么是Stream? Stream(…...
ruby高级语法
以下是 Ruby 高级语法的详细总结,涵盖元编程、模式匹配、闭包、并发模型等核心主题: 一、元编程(Metaprogramming) 1. 动态定义方法 class DynamicClass# 使用 define_method 动态定义方法["foo", "bar"].e…...
特权FPGA之UART串口
0.简介 通用异步收发器(Universal Asynchronous Receiver/Transmitter,UART)可以和各种标准串行接口,如RS 232和RS 485等进行全双工异步通信,具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250,1645…...
oracle 索引失效
在 Oracle 11g 中,索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等,解决方法需结合版本特性(如虚拟列、索引跳跃扫描)。通过执行计划分析、统计信息维护和合理使用提示(Hints),…...
MySQL查看binlog执行情况
因数据丢失,被要求使用binlog查看 执行SQL的具体情况。 拿到数据库压缩包,解压缩获得文件和文件夹若干。 如图,有17个binlog文件,目标数据库名应为corr。 已知这个数据库是安装在windows下,版本8.0. 先下载一个mysq…...
kotlin,Android,jetpack compose,日期时间设置
AI生成,调试出来学习,这些小组件会用了,就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…...
sql-labs靶场 less-2
文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
ssh密钥连接远程服务器并用scp传输文件
ssh密钥连接远程服务器 私钥的权限必须是600chmod 600 id_rsa连接时在命令中加上私钥的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH...
【锂电池SOH预测】PSO-BP锂电池健康状态预测,锂电池SOH预测(Matlab完整源码和数据)
预测效果 基于PSO-BP算法的锂电池健康状态预测研究 一、引言 1.1 研究背景与意义 在当今社会,锂电池凭借其高能量密度、长寿命及环境友好等特性,在现代能源系统中占据着举足轻重的地位。从消费电子领域如智能手机、笔记本电脑,到动力领域中…...
找搭子系统 搭子经济新风口 基于精准匹配的社交新生态探索
一、市场前景:为什么现在需要"找搭子"? 孤独经济爆发 超60%年轻人存在"精准陪伴"需求(2024社交报告) 传统社交App无法满足"非婚恋、非熟人"的中间态需求 线下活动复苏 剧本杀/飞盘等兴趣活动年增…...
《Spring Boot+策略模式:企业级度假订单Excel导入系统的架构演进与技术实现》
前言 在数字化时代背景下,订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细剖析了一个基于 策略模式 的度假订单导入系统,通过分层架构设计实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架,结合 MyBatis …...
软件需求分析习题汇编
需求工程练习题 一、选择题 1. 软件需求规格说明书的内容不应包括对( )的描述。 A. 主要功能B. 算法的详细过程C. 用户界面及运行环境D. 软件的性能 *正确答案:*B:算法的详细过程; 2. 需求分析最终结果是产生( ) A. 项目开发…...
51单片机的汇编伪指令
目录 一、ORG 汇编起始地址命令 1、功能 2、语法格式 3、使用示例 4、注意事项 二、END 汇编终止命令 1、功能 2、语法格式 3、使用示例 4、注意事项 三、EQU 赋值命令 1、功能 2、语法格式 3、使用示例 4、注意事项 四、BIT 位定义命令 1、功能 2、语法格式…...
深入探究Python的re模块及其在爬虫中的应用
深入探究Python的re模块及其在爬虫中的应用 一、引言 在Python的强大生态系统中,re模块作为处理正则表达式的核心工具,发挥着举足轻重的作用。正则表达式是一种描述文本模式的强大语言,能够高效地进行字符串的匹配、查找、替换等操作。无论…...