Unity3d动画插件DoTween使用指南
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 updatevoid 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博客
相关文章:
Unity3d动画插件DoTween使用指南
1、DoTween是什么? DoTween是一款对象动画类插件,它是一款针对Unity 3D编辑器的、快速高效的、安全的、面向对象的补间动画引擎,并且对C#语言开发做出了很多的优化。另外,它使得开发者无需通过Unity内置的Animator或Coroutines即可…...
学习函数知识
学习函数是编程中的重要基础,以下是关于函数的详细知识点: 1. 函数的定义 函数是一组执行特定任务的代码块,可以重复使用。在 JavaScript 中,可以通过以下方式定义函数: 函数声明: function functionNam…...
案例-表白墙简单实现
文章目录 效果展示初始画面提交内容后画面(按键按下) 代码区 效果展示 初始画面 提交内容后画面(按键按下) 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…...
和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈
在科技迅猛发展的时代,人工智能(AI)无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术,试图借助其变革力量在竞争中突围,然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…...
基于函数计算FC 部署 ComfyUI实现AI生图 的优势
基于函数计算FC 部署 ComfyUI实现AI生图 的优势 部署ComfyUI实现AI生图使用函数计算FC 一键部署ComfyUI 绘画平台的优势有哪些? 在文章开始之前,先来看一下基于函数计算FC 部署 ComfyUI实现AI生图 的大概步骤,整个基础部署操作比较简单。即便…...
瑞萨IDE:CS+ for CC编译过程中执行脚本文件
最近发现使用CS for CC IDE发现一个很有意思的功能。编译工程过程中,IDE自动执行Python脚本和批处理脚本,极大地提高开发效率。 编写好脚本文件后,在IDE中选择CC-RH(Build Tool)->Common Options->Others。 Co…...
在 CentOS 上安装 Docker 的步骤
在 CentOS 上安装 Docker 的步骤如下: 步骤 1:更新系统包 sudo yum update -y步骤 2:安装依赖包 确保安装了 yum-utils、device-mapper-persistent-data 和 lvm2,这些是 Docker 运行所需的依赖项: sudo yum instal…...
【C#生态园】探索地理信息系统软件套件与库:功能、API和应用
探索地理信息系统:软件套件与库详解 前言 地理信息系统(GIS)是当今世界上广泛使用的技术之一,它以空间数据为基础,能够提供丰富的地理信息分析和可视化功能。在GIS领域,有许多优秀的软件套件和库…...
Jupyter的使用分享
文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候,发现大家对于pycharm更容易上手(可能是比较好设置中文的原因),在…...
24龙信比赛复现
案情简介: 近期,某公安机关接到受害人报案:通过微信添加认识一位相亲中介客服,客服邀约其与“相亲”对象进行选妃,受害人上钩后,整个过程被涉案团伙录音录像,同时,该客服以有更多的…...
PHP反射机制
HP反射机制是PHP语言中的一个强大特性,它允许程序在运行时检查、获取和操作类、方法、属性等元素的信息。这一机制极大地提高了PHP代码的灵活性和可维护性,使得开发者能够在不修改原有代码结构的情况下,动态地了解并操作代码。以下是对PHP反射…...
使用阿里云试用资源快速部署web应用-dofaker为例
本文介绍使用阿里云的试用资源部署dofaker的方法,本教程主要作学习在阿里云部署web应用之用,部署好应用之后,可以在任何地点通过公网ip访问web应用。 一、创建云主机 登录阿里云账户之后,点击控制台: 点击云服务器EC…...
需求11——解决字段无法清空的两个小bug
目录 背景 第一个小bug——问题阐述 第一个小bug——解决方案 第二个小bug——问题阐述 第二个小bug——解决方案 总结 背景 已经写了一个上午的文章了,写完这篇就可以去吃饭了。这也是这几个月的我写的最后一个小bug文章,把这篇文章写完就搞定了…...
mysql学习教程,从入门到精通,SQL 创建索引(CREATE INDEX 语句)(35)
1、SQL 创建索引(CREATE INDEX 语句) 在SQL中,创建索引(CREATE INDEX)是一种用于提高数据库查询性能的方法。索引类似于书的目录,通过它可以更快地定位到表中的特定行。以下是一个创建索引的示例,以及对其各部分的解释…...
Pikachu-Cross-Site Scripting-DOM型xss_x
查看代码,输入的内容,通过get请求方式,用text 参数带过去; 获取text内容,赋值给xss 然后拼接到 dom 里;构造payload的关键语句: <a href"xss">就让往事都随风,都随风吧</a&…...
Pikachu-Cross-Site Scripting-xss之htmlspecialchars
首先输入各种字符 查看页面元素,可以看到这里对一些符号做了转换,但是 单引号等几个符号没处理; 从代码上看;使用单引号做闭合; 构造payload a onclickalert(11) 提交,得到xss攻击...
CSS基础中padding详解
文章目录 CSS基础中padding详解一、引言二、Padding基础1、Padding属性1.1、Padding的四个方向 2、Padding的值类型3、代码示例 三、Padding简写方法1、简写顺序2、简写规则3、代码示例 四、Padding对元素大小的影响1、解决方案1.1、Box-sizing属性1.2、计算实际宽度 五、总结 …...
OpenGL笔记十九之相机系统
OpenGL笔记十九之相机系统 —— 2024-10-02 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十九之相机系统1.运行1.1.游戏相机1.2.轨迹球相机 2.游戏相机与轨迹球相机切换3.博主笔记本要运行需要更改的文件更改1:28_OpenGL_CameraSystem/applicat…...
P-Tuning v2:一种普遍有效的提示调整方法
人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型通过微调(fine-tuning)来适应特定任务虽然效果显著,但存在训练成本高、参数存储量大等问题。为了解决这些问题,清华大学的研究者们提出了一种名为P-Tuning v2的提示调整&am…...
微信小程序启动不起来,报错凡是以~/包名/*.js路径的文件,都找不到,试过网上一切方法,最终居然这么解决的,【避坑】命运的齿轮开始转动
app.json "resolveAlias": {"~/*": "/*"},文件代码也没有问题,网上的方法试过来了,大模型AI也问过遍,熬夜到凌晨2点半,最不可思议的是居然是因为微信开发者工具版本的问题,我真的是笑死…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
