# MiniAnimation **Repository Path**: keqikeqi/mini-animation ## Basic Information - **Project Name**: MiniAnimation - **Description**: 基于Unitask实现缓动动画插件 - **Primary Language**: C# - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-10-10 - **Last Updated**: 2026-03-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MiniAnimation缓动插件 #### 介绍 基于Unitask实现缓动动画插件 由于Dotween插件在关闭的时候有可能关闭不完全。 例如:在动画执行的过程中调用了Kill()并把位置归位,在Kill()没有执行完全的情况下,这个位置归位肯呢个会被未完的动画覆盖。 我再制作麻将的过程遇到过这种情况、、 以下是在我的操作 (关闭手牌的Dotween-> 对象池回收手牌->把这张牌发放给牌堆) 但是由于没有Kill完全,导致这张牌位置不对 但是解决方法是用await 等待了一帧再执行,解决了这个问题; 于是基于Unitask的协程写法实现了缓动动画插件 插件效果借鉴了Dotween插件 #### 安装教程 1. 确保工程中存在Unitask插件 2. 将此工程的Asset->Script中的MiniAnimation拷贝到目标工程 #### 使用说明 1. To的用法 传入初值,传入Setter函数,传入目标值,传入时长,传入曲线枚举 剩下的交给MiniAnim RegisterCompleted注册动画完成回调 ```c# float originValue=0; float targetValue=1; float value; //float数值缓动 MiniAnim miniAnim= MiniAnimate.MiniTo(originValue, (x) => { value = x; }, targetValue, duration, curve); //localPosition缓动 MiniAnim miniAnim= MiniAnimate.MiniTo(transform.localPosition, (x) => { transform.localPosition = x; }, targetPosi, duration, curve); ``` 2. 动画曲线 内置大部分场景使用的动画曲线,用下面两个方法都行,注意如果都有的话,第一种覆盖第二种回呗第一种覆盖 1) ```c# MiniAnim miniAnim= MiniAnimate.MiniTo(originValue, (x) => { value = x; }, targetValue, duration, curve); ``` 2) ```c# miniAnim.SetCurve(MiniCurve.OutBack); ``` 同时支持unity 引擎内的动画曲线 ```c# [SerializeField] AnimationCurve animationCurve; miniAnim.SetCurve(animationCurve); ``` 3. 注册动画结束 (1) ``` miniAnim.RegisterCompleted(()=>{ Debug.Log("动画结束"); }); ``` (2) ```c# await miniAnim.MiniTask; Debug.Log("Task结束"); ``` 4. 杀死动画(当场响应) ```c# miniAnim.Kill(); ``` 5. unity拓展 Transform SpriteRenter Image MeshRender CanvasGroup Material 基本和Dotween差不多 例:这是为了做一个按下响应的按钮动画 ```c# btnMiniAnim.transform.localScale = Vector3.one*0.5f; miniAnim?.Kill(true); miniAnim =btnMiniAnim.transform.MiniScale(1,.2f); miniAnim.SetCurve(MiniCurve.OutBack); ``` 6. 动画循环 ```c# rectTrans = GetComponent(); rectTrans.anchoredPosition = originPosi; miniAnim?.Kill(); miniAnim = rectTrans.MiniAncMove(new Vector3(originPosi.x + rectTrans.rect.width * 1, originPosi.y), 1f, MiniCurve.OutBack); miniAnim.SetCurve(MiniCurve.OutBack); miniAnim.RegisterCompleted(() => { Debug.Log("动画结束"); }); miniAnim.SetLoops(-1, LoopType.Yoyo); ``` 7. Sequence 序列器 ```c# if(Input.GetButton("Jump")){ //归位 rect.anchoredPosition = Vector2.zero; rect.localRotation = Quaternion.identity; //杀死动画序列 if (seq != null) { seq.Kill(); } //初始化 seq = MiniAnimate.Sequence(); //添加动画 seq.Append(rect.MiniAncMoveX(originPos.x - rect.rect.width * 1f, 0.6f, MiniCurve.OutBack)); //与上一个并行 seq.Join(rect.MiniRotate(new Vector3(0, 0, 190), 0.6f, MiniCurve.OutBack)); seq.Append(rect.MiniAncMoveX(originPos.x, 0.6f, MiniCurve.OutBack)); seq.Join(rect.MiniRotate(new Vector3(0, 0, 1000), 0.6f, MiniCurve.OutBack)); seq.Append(rect.MiniAncMoveX(originPos.x - rect.rect.width * 1f, 0.6f, MiniCurve.OutBack)); seq.Join(rect.MiniRotate(new Vector3(0, 0, 0), 0.6f, MiniCurve.OutBack)); //添加Action执行 seq.AppendAction(() => { Debug.Log("action 执行"); }); //插入Unitask回调 seq.AppendUnitaskFunc(Test); //插入Task回调 seq.AppendTaskFunc(Test1); //完成序列的回调 seq.OnCompleted += () => { Debug.Log("CallBack 执行"); }; //开始执行序列 seq.Excute(); //等待执行完毕 await seq.Task; Debug.Log("Await Over"); } async UniTask Test() { await UniTask.Delay(1000); Debug.Log("Test1"); } async Task Test1() { await UniTask.Delay(1000); Debug.Log("Test2"); } ``` ​