Unity3d动画插件DoTween使用指南

news2024/11/24 11:09:38

1、DoTween是什么?

        DoTween是一款对象动画类插件,它是一款针对Unity 3D编辑器的、快速高效的、安全的、面向对象的补间动画引擎,并且对C#语言开发做出了很多的优化。另外,它使得开发者无需通过Unity内置的Animator或Coroutines即可创建流畅、灵活的动画效果。

2、下载插件

在Asset Store中下载DoTween的插件,

下载并import完成后会在Assets/Plugins目录下Demigiant目录,

同时界面也会出现DOTween Utility Panel,

点击Setup DoTween...跳转到另一个页面,以下是DOTween的设置面板。

点击Apply后即可退出。

3、第一个Demo

首先,在场景中创建一个ball(可以使用任何图像代替ball),如下图所示:

编写代码实现ball在x轴的平移:

using UnityEngine;
using DG.Tweening;

public class GameManager : MonoBehaviour
{
    public GameObject ballObj;

    // Start is called before the first frame update
    void Start()
    {
        ballObj.transform.DOMoveX(transform.position.x + 300, 2);
    }

}

注意:

1)如果使用DoTween需要引入using DG.Tweening;

2)一般是在物体的transform上使用DoTween的api方法

4、接口概述

DoTween包括Tweener(补间,控制值并为其生成动画)、Sequence(序列,控制多个补间作为组来处理)、Tween(通用词表示补间和序列)、NestedTween(嵌套补间,序列中包含的补间)四种命名法。

DO开头的方法:设置动画的方法

Set开头的方法:设置动画属性的方法

On开头的方法:设置动画的回调函数

5、Unity常用组件拓展方法

5.1 Transform位置拓展方法

5.1.1 Position-位移

DOMove:移动到某一指定点。(世界坐标)

DOLocalMove:移动自身坐标到指定位置。

transform.DOMove(new Vector3(10, 0, 0), 10, false);
transform.DOLocalMove(new Vector3(10,0.5f,0),10f,false);
参数:
     Vector3 to               要移动到的位置
     float   duration         所需要花费的时间
     bool    snapping         为true时平滑地将所有值变为整数。

DOMoveX / DOMoveY / DOMoveZ:沿着某一轴移动到指定位置。

DOLocalMoveX / DOLocalMoveY / DOLocalMoveZ:移动自身坐标到指定轴的指定位置。

transform.DOMoveX()/DOMoveY()/DOMoveZ(10, 10f,false);
transform.DOLocalMoveX()/DOLocalMoveY()/DOLocalMoveZ(10, 10f,false);
参数:
	 float   to				  要移动到的轴的坐标
	 float   duration         所需要花费的时间
	 bool    snapping         为true时平滑地将所有值变为整数。

DOJump:实现跳跃到指定位置。(世界坐标)

DOLocalJump:实现跳跃到指定位置(自身坐标)。

transform.DOJump(new Vector3(10, 0, 0),10,3,10,false);
transform.DOLocalJump(new Vector3(10, 0, 0),10,3,10,false);
参数:
	 Vector3 endValue         最终要跳跃到的位置
	 float   jumpPower        跳跃的强度,决定跳跃的高度(当前位置Y加上该值)
	 int     numJumps         跳跃的次数
	 float   duration         总持续时间
	 bool    snapping         为true时平滑地将所有值变为整数。(每次移动整数值)默认为false

5.1.2 Rotation-旋转

DORotate:旋转到指定的值(根据欧拉角)。

DOLocalRotate:自身坐标旋转。

transform.DORotate(new Vector3(0, 90, 0), 2);
transform.DOLocalRotate(new Vector3(0, 90, 0), 2);
参数:
	Vector3 to               旋转目标值
	float   duration         总旋转用时
	RotateMode
         ——Fast             旋转采用最短路线,切旋转不会超过360°
         ——FastBeyond360    旋转将超过360°
         ——WorldAxisAdd     类似于使用transform.Rotate(new Vector3(20, 0, 0),Space.World),最终值始终被视为相对值
         ——LocalAxisAdd     类似于使用transform.Rotate(new Vector3(20, 0, 0),Space.Self),最终值始终被视为相对值
    transform.DORotateQuaternion();

DOLookAt:旋转目标,使其朝向给定位置。

transform.DOLookAt(new Vector3(0, 0, 0), 2);      
参数:
		 Vector3 towards		旋转目标值
		 float duration			旋转总用时
		 AxisConstraint axisConstraint 	旋转最终轴约束,只旋转此轴
		 Vector3 up              定义向上方向的矢量

5.1.3 Scale-缩放

DOScale

transform.DOScale(new Vector3(2, 2, 2), 2);
参数:
	float/Vector3 to 	浮点数为倍数,向量为指定大小
	float duration 		放大/缩小总消耗时间

DOScaleX / DOScaleY / DOScaleZ:对某一轴方向进行放大缩小

transform.DOScaleX(3, 2);
参数:
	float to					放大到的倍数
	float duration			放大/缩小总消耗时间

5.1.4 Punch-物体颤动及振动

DOPunchPosition:受到冲击后的回弹效果

DOPunchRotation:受到冲击后旋转效果

DOPunchScale:实现一个弹性效果,反复弹,最终复原。

        //第一个参数 punch:表示方向及强度
        //第二个参数 duration:表示动画持续时间
        //第三个参数 vibrato:震动次数
        //第四个参数 elascity: 这个值是0到1的
        //                   当为0时,就是在起始点到目标点之间运动
        //                   不为0时,会把你赋的值乘上一个参数,作为你运动方向反方向的点,物体在这个点和目标点之间运动
        transform.DOPunchPosition(new Vector3(0, 1, 0), 2, 2, 0.1f);
        transform.DOPunchRotation(new Vector3(0, 90, 0), 2, 2, 0.1f);
        transform.DOPunchScale(new Vector3(2, 2, 2), 2, 2, 0.1f);

5.1.5 Shake

        //参数:持续时间,力量,震动,随机性,淡出   
        //参数1.持续时间   
        //参数2.方向的力大小  实际就是震动的幅度,可以理解成相机施加的力的大小 使用Vector3可以选择每个轴向不同的强度 
        //参数3.震动次数   
        //参数4.震动角度范围   改变震动方向的随机值(大小:0~180)
        //参数5.是否淡入淡出   就是运动最后是否缓慢移动回到原本位置 
        transform.DOShakePosition(1, 5, 10, 50, true);
        transform.DOShakeRotation(3);
        transform.DOShakeScale(3);

5.2 Text拓展方法

        text.DOColor(Color.black, 2);//颜色,2秒钟完成颜色变化
        text.DOFade(0, 2);//透明
        text.DOBlendableColor(Color.black, 2);//混合颜色

        //是把第一个参数传入的内容按照时间,一个字一个字的输入到文本框中
        text.DOText("Hello World", 3); 
        text.DOText("Hello World", 3).SetEase(Ease.Linear);  //匀速

5.3 Ease.某种运动曲线

运动曲线,用来调节运动速度的变化
如果需要匀速的动画速度的话,可以选择:linear
下面是一部分曲线的图示:

6、DoTween常用方法

6.1 Sequence方法

6.1.1 Append

Sequence sequence = DOTween.Sequence();
sequence.Append(transform.DOMove(Vector3.one, 3));//物体先3秒移动到(1,1,1)
sequence.AppendInterval(1);//然后在(1,1,1)停止运动1秒
sequence.Append(transform.DOMove(-Vector3.one , 2));//接着2秒时间运动到(-1,-1,-1)

6.1.2 Insert

//按时间点插入动画——Insert
//第一个参数为时间,此方法把动画插入到规定的时间点
//以这句话为例,它把DORotate动画添加到此队列的0秒时执行,虽然它不是最先添加进队列的
sequence.Append(transform.DOMove(Vector3.one, 3));//物体3秒移动到(1,1,1)
sequence.Insert(0, transform.DOMove(-Vector3.one, 2));//覆盖掉0到2秒的时间执行物体移动到(-1,-1,-1)的动画
sequence.Insert(0, transform.DOScale(Vector3.one*2, 2));//0到2秒的时间执行物体缩放到(2,2,2)的动画
sequence.Insert(4, transform.DOMove(Vector3.one * (3), 2));
//最终效果:
//0s-2s移动到(-1,-1,-1)并缩放到(2,2,2)
//2s-3s从(2/3,2/3,2/3)移动到(1,1,1)
//tip:中间(1,1,1)到(2/3,2/3,2/3)会直接跳过去,总时长不变;
//然后3s-4s不动,4-6移动到(3,3,3)

6.1.3 Prepend

//预添加动画——Prepend
        //预添加 会直接添加动画到Append的前面,也就是最开始的时候
        quence.Prepend(transform.DOScale(Vector3.one * 0.5f, 1));
        //这里需要特别说一下预添加的执行顺序问题
        //它这里也采取了队列的性质,不过,预添加与原本的的队列相比是一个反向队列
        quence.Append(transform.DOMove(Vector3.one, 2));
        quence.Prepend(transform.DOMove(-Vector3.one * 2, 2));
        quence.PrependInterval(1);
        //执行顺序是 PrependInterval----Prepend---- - Append
        //就是最后添加的会在队列的最顶端
        //预添加时间间隔
        quence.PrependInterval(1);

6.1.4 sequence的回调函数

//回调函数
quence.InsertCallback(2, () => { Debug.Log("在2秒处插入了回调"); });//在规定的时间点加入回调
quence.PrependCallback(() => { Debug.Log("在序列开始添加了回调"); });//在序列开始添加了回调
quence.AppendCallback(() => { Debug.Log("在序列末尾添加了回调"); });//在序列末尾添加了回调

6.2 Set方法

6.2.1 方法列表

SetLoops:设置动画循环

SetAs:设置参数

SetAutoKill:设置自动杀死动画

SetDelay:设置动画延时

SetSpeedBased:设置动画运动以速度为基准

SetId:设置动画ID

SetRecyclable:设置是否可回收

SetUpdate:设置动画的帧函数

6.2.2 参数说明

(1)循环方式

  • Restart 重新开始,为每次执行完毕后会返回原点
  • Yoyo 从起始点运动到目标点,再从目标点运动回来,这样循环
  • Incremental 一直向着运动方向运动,为递增,会朝着目标方向不返回的前进指定次数

(2)TweenParams

参数类,多用于多动画统一设置

6.2.3 示例

//设置动画循环
//参数1.循环次数(-1表示无限循环)
//参数2.循环方式
    //——Restart 重新开始,为每次执行完毕后会返回原点
    //——Yoyo 从起始点运动到目标点,再从目标点运动回来,这样循环
	//——Incremental 一直向着运动方向运动,为递增,会朝着目标方向不返回的前进指定次数
transform.DOMove(Vector3.one, 1).SetLoops(3, LoopType.Yoyo);
//定义TweenParams实例,多用于多动画统一设置
TweenParams tweenParams = new TweenParams();
tweenParams.SetLoops(-1, LoopType.Yoyo);
transform.DOMove(Vector3.one,1).SetAs(tweenParams);//设置参数
transform.DOMove(Vector3.one,1).SetAutoKill(true);//设置自动杀死动画
transform.DOMove(Vector3.one, 2).From(true);//from补间
//为true,传入的就是偏移量,即当前坐标 + 传入值 = 目标值
//为falese,传入的就是目标值,即传入值 = 目标值
transform.DOMove(Vector3.one, 2).SetDelay(1);//设置动画延时
transform.DOMove(Vector3.one, 1).SetSpeedBased();//设置动画运动以速度为基准
//使用SetSpeedBased时,移动方式就变成以速度为基准
//原本表示持续时间的第二个参数,就变成表示速度的参数,每秒移动的单位数
transform.DOMove(Vector3.one, 2).SetId("Id");//设置动画ID
transform.DOMove(Vector3.one, 2).SetRecyclable(true);//设置是否可回收——为true的话,动画播放完会被回收,缓存下来,不然播完就直接销毁

transform.DOMove(Vector3.one, 2).SetRelative(true);//设置动画为增量运动——为true,传入的就是偏移量,即当前坐标 + 传入值 = 目标值、为falese,传入的就是目标值,即传入值 = 目标值
transform.DOMove(Vector3.one,2).SetUpdate(UpdateType.Normal, true);//设置动画的帧函数
	//第一个参数 UpdateType :选择使用的帧函数
	//——UpdateType.Normal:更新每一帧中更新要求。 
	//——UpdateType.Late:在LateUpdate调用期间更新每一帧。 
	//——UpdateType.Fixed:使用FixedUpdate调用进行更新。 
	//——UpdateType.Manual:通过手动DOTween.ManualUpdate调用进行更新。
   	//第二个参数:为TRUE,则补间将忽略Unity的Time.timeScale

6.3 运动曲线的设置

//调用dotween预设动画曲线来进行直接设置
transform.DOMove(Vector3.one, 3).SetEase(Ease.Linear);//匀速运动到(1,1,1)

//使用AnimationCurve动画曲线组件自定义动画曲线的方式进行设置
public AnimationCurve  animationCurve;
transform.DOMove(Vector3.one, 4).SetEase(animationCurve);//以自定义曲线设置动画曲线
//AnimationCurve 横轴是时间, 不过不是具体的时间,而是时间比例
//AnimationCurve 纵轴是倍数
//假设纵轴的值为v,传入DOMove的第一个参数endValue是e,起始点坐标是s
//此物体最后动画结束时的实际坐标即为 v * (e - s)+s

//以回调函数为参数
transform.DOMove(Vector3.one * 2, 1).SetEase(MyEaseFun);
//返回值是运动距离的百分比 值应为0~1之间,最后的值需为1,不然停留的位置不会是目标位置
//自定义函数设置动画曲线:
    private float MyEaseFun(float time,float duration, float overshootOrAmplitude, float period)
    {
        return time / duration;//匀速的案例-》当前时间/总时间
    }

6.4 回调函数

OnComplete(() => { })://动画完成回调

OnStart(() => { })://动画开始播放

OnPlay(() => { })://动画播放时回调,暂停后重新播放也会调用

OnPause(() => { })://动画暂停时回调

OnRewind(() => { })://动画回退时回调

OnKill(() => { })://动画被销毁时回调

OnStepComplete(() => { })://完成单个循环周期时触发

OnUpdate(() => { })://帧回调

OnWaypointChange(() => { })://在路径动画时,改变目标点时的回调,参数为当前目标点的下标

transform.DOMove(Vector3.one, 4).OnComplete(() => { Debug.Log("动画播放完成"); });
transform.DOMove(Vector3.one, 4).OnStart(() => { Debug.Log("动画开始播放"); });//只在第一次播放动画时调用,在play之前调用
transform.DOMove(Vector3.one, 4).OnPlay(() => { Debug.Log("动画播放时回调,暂停后重新播放也会调用"); });
transform.DOMove(Vector3.one, 4).OnPause(() => { Debug.Log("动画暂停播放"); });
transform.DOMove(Vector3.one, 4).OnRewind(() => { Debug.Log("动画重新播放"); });//——使用DORestart重新播放时、使用Rewind倒播动画完成时、使用Rewind倒播动画完成时、 使用DOPlayBackwards反向播放动画完成时       
transform.DOMove(Vector3.one, 4).OnKill(() => { Debug.Log("动画被销毁时回调"); });	
transform.DOMove(Vector3.one, 4).OnStepComplete(() => { Debug.Log("完成单个循环周期时触发"); });	
transform.DOMove(Vector3.one, 4).OnUpdate(() => { Debug.Log("帧回调"); });	
transform.DOMove(Vector3.one, 4).OnWaypointChange(() => { Debug.Log("在路径动画时,改变目标点时的回调,参数为当前目标点的下标"); });	

6.5 获取数据方法

一、类方法

PausedTweens:所有暂停的动画

PausedTweens:所有正在播放的动画

TweensById:获取给定ID的数组

TweensByTarget:返回给定对象的数组

IsTweening:判断动画是否在运行

TotalPlayingTweens:正在播放的动画数量(包含正处于延迟中的动画)

二、实例方法

fullPosition:动画的位置,可读可写

CompletedLoops:动画执行完的次数

Delay:获取动画的延迟时间

Duration:获取动画不包含循环的时长

Elapsed:动画已播放的时间

ElapsedPercentage:返回动画进度的百分比

IsActive:动画是否在活动

IsBackwards:是否是反向动画

IsComplete:动画是否完成

IsInitialized:是否以初始化

IsPlaying:是否正在播放

CompletedLoops:返回循环次数, 无限循环为Infinity

//一、类方法
var list = DOTween.PausedTweens();//返回所有暂停的动画,没有则返回null
list = DOTween.PlayingTweens();//返回所有真正播放的动画,没有则返回null
DOTween.TweensById("id", true);//找到id为"id"并正在播放的动画——第一个参数是动画的ID、第二个参数是是否只收集正在播放的动画——返回满足条件的动画数组
DOTween.TweensByTarget(transform,true);//找到tranforn上正在播放的动画
DOTween.IsTweening(transform);//收集传入的对象是否有动画在活动——第一个参数为检测的对象、第二个参数为是否检测动画在播放状态——为true时,给定对象在播放状态时 返回true、为false时,只检测给定对象是否有动画(在pause状态时也算)有则返回true
DOTween.TotalPlayingTweens();//正在播放的动画的总数,目前处于延迟播放状态的动画也算

//二、实例方法
Tween tween= transform.DOMove(Vector3.one, 4).SetLoops(4);
Debug.Log(tween.fullPosition);//获取动画的位置
tween.fullPosition = 2;//设置动画的位置
Debug.Log(tween.CompletedLoops());//获取动画已经完成的循环次数,从0开始
Debug.Log(tween.Delay());//获取动画的延迟时间
Debug.Log(tween.Duration(false));//获取动画的持续时间——参数为true 表示计算循环的时间,无限循环为Infinity
Debug.Log(tween.Elapsed(false));//获取动画不包含循环已经执行完成的时间——参数为true 表示计算循环的时间
Debug.Log(tween.ElapsedPercentage(false));//获取动画不包含循环已经执行完成的时间的百分比——起始点为0 目标点为1——参数为 是否包含循环 为true时 返回值是循环总区间的已用百分比 若为无限循环 返回值为0
Debug.Log(tween.IsActive());//获取动画是否为活动状态
Debug.Log(tween.IsBackwards());//获取动画是否是反向动画
Debug.Log(tween.IsComplete());//获取动画是否完成
Debug.Log(tween.IsInitialized());//获取动画是否以初始化
Debug.Log(tween.IsPlaying());//获取动画是否正在播放
Debug.Log(tween.CompletedLoops());//返回循环次数,  无限循环为Infinity

6.6 例程方法

WaitForCompletion():等待动画执行完毕后

WaitForElapsedLoops():等待动画执行完3次循环之后

WaitForKill():等待动画销毁

WaitForPosition():等待动画执行到2秒位置

WaitForRewind():等待动画重新开始

WaitForStart():等待动画开始

Tween tween = obj.transform.DOMoveX(transform.position.x + 200, 3).SetEase(Ease.Linear).SetLoops(3, LoopType.Incremental).OnComplete(() => { Debug.Log("第一个动画播放完成!"); });
StartCoroutine(Func(tween));

public IEnumerator Func(Tween tween)
{
    yield return tween.WaitForCompletion();
    Debug.Log("Come here!");
}
Tween tween = transform.DOMove(Vector3.one, 4).SetLoops(4);
StartCoroutine("Func");
IEnumerator Func()
{
    yield return tween.WaitForCompletion();//等待动画执行完毕后
    yield return tween.WaitForElapsedLoops(3);//等待动画执行完3次循环之后——若是传入的次数大于动画的循环次数 则在动画结束时继续执行
    yield return tween.WaitForKill();//等待动画销毁
    yield return tween.WaitForPosition(2);//等待动画执行到2秒位置
    yield return tween.WaitForRewind();//等待动画重新开始
    yield return tween.WaitForStart();//等待动画开始
}

参考文档:

Unity插件DOTween_unity dotween插件-CSDN博客

【Unity精品插件】DOTween Pro:一行代码动乾坤-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 对 vue2 有什么优势

1、diff算法的优化--静态标记(PatchFlag) vue2中的虚拟dom是全量的对比(每个节点不论写死的还是动态的都会一层一层比较,这就浪费了大部分事件在对比静态节点上) vue3编译模板时,动态节点做标记 标记分为不…

给新手学ComfyUI的建议,以及几个免费工作流的分享!

前言 这是我学ComfyUI的经历,分享给你们,也许你们可以少走一些弯路。 给新手建议 刚开始学ComfyUI的时候,是想做AI写真的,但是SD一次AI写真都没做过,所以相当于SD零基础。然后我就去哔哩哔哩找教程看,跟…

日常记账:解锁生活财务管理的秘密钥匙

在日常生活的纷繁复杂中,我们往往容易忽视那些细微却重要的财务流动。每一笔支出,无论大小,都是生活乐章中的一个音符。而日常记账,就是那把能够解锁生活财务管理秘密的钥匙。它不仅仅是一种简单的记录行为,更是一种对…

【大学学习-大学之路-回顾-电子计算机相关专业-学习方案-自我学习-大一新生(1)】

【大学学习-大学之路-回顾-电子&计算机相关专业-学习方案-自我学习-大一新生(1)】 1-前言2-整体说明(1)打字训练(1)字母区分大小写:(2)自动换行&不自动换行&…

Vue3中提到的Tree-shaking

我们知道,Vue3中提到一个叫Tree-shaking的东西,其实也并不是一个新的东西,有人称之为"摇树优化",什么意思? 按照作者的原话解释,Tree-shaking其实就是:把无用的模块进行“剪枝”&…

小程序配置文件

Author:Dawn_T17🥥 目录 官方开发文档 配置文件 全局配置文件—app.json pages字段 window字段 tabBar字段 页面配置文件—*.json 项目配置文件 project.config.json 和 project.private.config.json 配置sass以及不同的*SS区别 预处理器…

学习Flask框架

Flask简介 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没…

ssm淘乐乐员工购物商城

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 目 录 III 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环境与技术 3 …

函数编程:让开发完全专注于代码

作为一名开发者,我过去常常被各种环境配置和部署问题困扰,特别是当项目依赖复杂时,总要花费大量时间在配置服务器、调试环境上。最近,我在使用 TitanIDE 后有了一些全新的开发体验,尤其是它的 函数编程 功能&#xff0…

七、安全运营—概念

控制特权帐号: 账号类型:

众数信科AI智能体智慧文旅解决方案——智能旅行助手

智慧文旅解决方案 智能旅行助手方案 利用先进的AI算法 提供个性化旅游体验的智能服务 众数信科AI智能体 产品亮点 旅游路线智能规划 旅游景点智能问答 旅行游记智能生成等 构建旅行实用指南 让旅游更加便捷、高效、智能化 关于我们 众数信科成立于2021年,由…

操作系统 | 学习笔记 | 王道 | 4.1 文件系统基础

4.文件管理 4.1 文件系统基础 4.1.1 文件的基本概念 定义 文件是以计算机硬盘为载体的存储在计算机上的信息集合,在用户进行的输入、输出中,以文件位基本单位。 文件管理系统是实现的文件的访问、修改和保存,对文件维护管理的系统。 文件的…

Ngx+Lua+Redis 快速存储POST数据

系统几万台设备有windows有安卓还有linux系统,每个设备三分钟就会向服务器post设备的硬件信息,数据格式json,后台管理界面只需要最新的数据,不需要历史数据,业务逻辑非常简单,PHP代码就几行,已经…

Python selenium库学习使用实操四

系列文章目录 Python selenium库学习使用实操 Python selenium库学习使用实操二 Python selenium库学习使用实操三 文章目录 系列文章目录[TOC](文章目录) 前言一、元素获取二、选项解析总结 前言 在Python selenium库学习使用实操二中提到了下拉框的操作,一种是标…

Redis持久化机制(RDBAOF详解)

目录 一、Redis持久化介绍二、Redis持久化方式1、RDB持久化(1) 介绍(2) RDB持久化触发机制(3) RDB优点和缺点(4) RDB流程 2、AOF(append only file)持久化(1) 介绍(2) AOF优点和缺点(3) AOF文件重写(4) AOF文件重写流程 三、AOF和RDB持久化注意事项 一、Redis持久化介绍 Redis…

YOLOv5复现(论文复现)

YOLOv5复现(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 YOLOv5复现(论文复现)概述模型结构正负样本匹配策略损失计算数据增强使用方式训练测试验证Demo 概述 YOLOv5是由Ultralytics公司于2020年6月开源的目标检…

uniapp顶部提示栏实现

效果: 用途:用于展示较短系统通知 实现逻辑: 1.通过请求获取该显示的通知内容,目前所考虑的字段有: {id: 200, // 通知标识,后续会用其阻止用户关闭后无休止开启message: "请勿以系统规定的其它…

与ZoomEye功能类似的搜索引擎还有哪些?(渗透课作业)

与ZoomEye功能类似的搜索引擎有: Shodan:被誉为“物联网的搜索引擎”,专注于扫描和索引连接到互联网的各种设备,如智能家居设备、工业控制系统、摄像头、数据库等。它提供全球互联网设备的可视化视图,帮助用户了解网络…

ssm图书管理系统的设计与实现

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题研究背景 1 1.2课题研究现状 1 1.3课题实现目的和意义 …

【C++】模拟实现hash_table(哈希表)

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 📌实现HashNode类模板 🎏构造HashNode类成员变量 🎏实现HashNode类构造函数…