求助 我想问下 dotween oncomplete如何实现平滑移动物体

本文首发蛮牛,次发博客园。接系列 ,,本文为第三篇,再次感谢&&在前两篇无私且精彩的问题解答
写在最前,时光煮雨,为了怀念
以下引用曾今读过的一些教程文章
& 其实这3种动画都有它特定的使用场合。
&&& 第一种动画适合创建简单的对象位移及直接性质的属性更改(在后面的教程中,我还将更深入的挖掘Storyboard动画的潜力,动态创建更复杂的基于KeyFrame的关键帧动画)。
&&& 第二种动画适合全局属性的时时更改,例如我们后面要讲到的敌人或NPC以及地图等全体性的相对位移及属性更改时就要用到它了。
&&& 第三种动画则非常适合运用在Spirit(角色)的个人动画中,例如角色的移动,战斗,施法等动作。
&&& 小结:前三节分别讲解了Storyboard动画,CompositionTarget动画,DispatcherTimer动画,并横向分析了不同的场合对应不同的动画应用模式,这些将是构成WPF/Silverlight游戏引擎的基础。
这里的三种动画形式分别可以类比到Unity3d中的,
第一种,基于DoTween的各种MoveTo(Vector3,duration),或者是第一篇的直接移动;
第二种,基于Update的逐帧更新;
第三种,基于FixUpdate的定时更新,比如这里提到的战斗可能是有物理碰撞,或者是一种类似自定义的计时器的Timer(下篇会分析下)。
这些东西比较底层了,需要了解FixUpdate和Update的区别,以及UI线程和非UI线程之间的关系(wpf中的DispatcherTimer的概念)
这块东西有点深,我也不敢妄言,是否正确有大师路过,可以解惑一下。列出两篇参考文章,供延伸阅读吧
这三种动画形式,很多人都知道,但是如何使用和区别,却在博文中只字未提。
这里引用列出来只为怀念。
前两篇都比较基础,运用一些基础知识,其实早都有一些大牛封装好了插件和工具,不必大家再重复制造轮子。但各种封装难免有功能重叠,且可能用法也会有不同,这可能是我们需要稍微留意的东西。这篇主要罗列下基于DoTween插件UGUI的直接移动和Unity Native2D实现鼠标点击逐帧移动的功能实现,关于这两个插件和功能不再详解,因为有的是教程,若想学习自己搜索吧。图片还是一样的
基于DoTween的UGUI平移,这里自己计算了下 duration可能不对欢迎指正,代码如下:
using UnityE
using System.C
using UnityEngine.UI;
using DG.T
public class PanelContollerDoTween : MonoBehaviour {
// Use this for initialization
private float speed=2;
void Start ()
// Update is called once per frame
void Update () {
if (Input.GetButton("Fire1"))
//这里写的该坐标是像素坐标,也就是屏幕坐标的意思(比世界坐标小)
Vector3 mouseWorldPostion = Input.mouseP//Camera.main.ScreenToWorldPoint();
float duration = Vector3.Distance(mouseWorldPostion , sprite.transform.position) / speed * Application.targetFrameR
sprite.transform.DOMove(mouseWorldPostion, duration).SetEase(Ease.Linear);
这块稍微说一下,看过很多教程一般都是单讲UGUI或者单讲Natvie2D,很少有一起使用的,这里自己实验了下,直接建立一个Scene和UGUI一起使用即可,比较简单,深色的框是我给Panel设置的颜色便于区别,这里发现二者可以很好的共存的,效果图如下:
代码如下:
using UnityE
using System.C
public class PlayerController : MonoBehaviour
private Vector3 currentP
private Vector3 moveD
private float speed = 2;
private Vector3 targetP
Vector3 mouseWorldPositon = Vector3.
// Use this for initialization
void Start()
moveDirection = Vector3.
// Update is called once per frame
void Update()
currentPositon = transform.
//是鼠标左键点击
if (Input.GetButton("Fire1"))
mouseWorldPositon = Camera.main.ScreenToWorldPoint(Input.mousePosition);
moveDirection = mouseWorldPositon - currentP
moveDirection.z = 0;
moveDirection.Normalize();
//Debug.Log(string.Format("x1:{0},y1:{1},z1:{2},x2:{3},y2:{4},z2:{5},d:{6}", mouseWorldPositon.x, mouseWorldPositon.y,mouseWorldPositon.z, currentPositon.x, currentPositon.y,currentPositon.z, Vector3.Distance(mouseWorldPositon, currentPositon)));
if (Vector3.Distance(new Vector3( mouseWorldPositon.x,mouseWorldPositon.y,0), currentPositon) & 1)
targetPositon = moveDirection * speed + currentP
transform.position = Vector3.Lerp(currentPositon, targetPositon, Time.deltaTime);
transform.position = targetP
这里留下了一个小问题就是关于移动了某一点的判断问题,这里我简单的使用了两点的距离小与某个绝对值来做的,但在Natvie2D下发现移动有跳跃,主要是坐标系的单位问题,如果有高手路过可以帮忙提供更好的方法。
根据三篇的学习,这篇是收获比较大的,特别是通过这篇的学习,找到了上篇中遇到的问题,主要是
1、鼠标点击的坐标问题?
2、是关于Vecotr3.Lerp插值的问题
如果细心的朋友可能会发现2个函数我在UGUI中都是注释掉的 
Camera.main.ScreenToWorldPoint(Input.mousePosition)
Vector3.Lerp(currentPositon, targetPositon, Time.deltaTime);
主要的问题其实是在坐标系的值上,UGUI专门做了一次优化,使用的2D世界的屏幕坐标单位是像素,值都很大,而Native2D使用的是3D世界的坐标系统单位是浮点百分值,所以在转换和使用上有差异的。
这篇也留下了一个问题,就是UGUI和Native2D的鼠标事件的遮挡问题,现在看到的现象是鼠标事件是可以穿越的,这个问题等到以后再解决吧。
阅读(...) 评论()Unity3d中使用DoTween实现飘字的效果
DoTween是一款比较强大的补间动画插件,本篇文章我们来学习下,利用DoTween来实现下飘字的效果,首先我们看下DoTween中几个方法
Sequence.Append构建缓动序列,同时Join方法支持并行缓动。利用这个特性,可以实现ugui&Text的飘字缓动效果。
Append是在序列的末端插入一个Tweener,如果前面的Tweener都执行完了,就执行这个Tweener。
Join也是在序列末端插入一个Tweener,不同的是,这个Tweener将与前一个非Join加进来的Tweener并行执行。
飘字效果代码:
public static void FlyTo(Graphic graphic)
RectTransform rt = graphic.rectT
Color c = graphic.
graphic.color =
Sequence mySequence = DOTween.Sequence();
Tweener move1 = rt.DOMoveY(rt.position.y + 50, 0.5f);
Tweener move2 = rt.DOMoveY(rt.position.y + 100, 0.5f);
Tweener alpha1 = graphic.DOColor(new Color(c.r, c.g, c.b, 1), 0.5f);
Tweener alpha2 = graphic.DOColor(new Color(c.r, c.g, c.b, 0), 0.5f);
mySequence.Append(move1);
mySequence.Join(alpha1);
mySequence.AppendInterval(1);
mySequence.Append(move2);
mySequence.Join(alpha2);
Text text = gameObject.GetComponent&Text&();
FlyTo(text);
1.首先设置文字的alpha值为0
2.然后文字沿y轴向上缓动,同时alpha从0缓动到1,两个Tweener同时进行
3.停留1秒钟,让玩家看清楚字写的是什么
4.文字继续往上飘,同时alpha从1缓动到0,逐渐消失
注意:有同学想问,这个字体颜色渐变效果怎么弄,稍微修改设置color的部分,alpha值不能设进去,否则我们这里的渐变效果就出不来了。代码我就贴出来吧。另外,再加个Outline的效果就很好看了。
using System.Collections.G
using UnityEngine.UI;
namespace MyScripts
[AddComponentMenu(&UI/Effects/Gradient&)]
public class Gradient : BaseVertexEffect
[SerializeField]
private Color32 topColor = Color.
[SerializeField]
private Color32 bottomColor = new Color32(255, 153, 0, 255);
[SerializeField]
private bool useGraphicAlpha =
public override void ModifyVertices(List&UIVertex& vertexList)
if (!IsActive())
int count = vertexList.C
if (count & 0)
float bottomY = vertexList[0].position.y;
float topY = vertexList[0].position.y;
for (int i = 1; i & i++)
float y = vertexList[i].position.y;
if (y & topY)
else if (y & bottomY)
float uiElementHeight = topY - bottomY;
for (int i = 0; i & vertexList.C )
ChangeColor(ref vertexList, i, topColor);
ChangeColor(ref vertexList, i + 1, topColor);
ChangeColor(ref vertexList, i + 2, bottomColor);
ChangeColor(ref vertexList, i + 3, bottomColor);
private void ChangeColor(ref List&UIVertex& verList, int i, Color32 color)
UIVertex uiVertex = verList[i];
if (useGraphicAlpha)
uiVertex.color = new Color32(color.r, color.g, color.b, uiVertex.color.a);
uiVertex.color =
verList[i] = uiV
好了,本篇unity3d教程关于使用DoTween实现飘字的效果到此结束,下篇我们再会!
首发地址: Unity3d中使用DoTween实现飘字的效果__丝路教育
资源地址: (分享请保留)
关注微信,有惊喜!
Powered by SILUCG! X1.0
我们一直在努力!
在线客服01:
在线客服02:DOtween如何围绕一个可设定的点旋转? - 知乎4被浏览1934分享邀请回答0添加评论分享收藏感谢收起4792人阅读
Unity3D游戏开发(33)
& & & & 在项目开发中,我们通常都需要用到缓动动画系统,控制我们的目标对象从当前位置沿着特定曲线路径运动到指定的目标坐标点,在Unity 5.x中最常用的就是DoTween这个动画插件。
& & & & 下面是我常用的一个工具接口,其功能就是实现trans对象在time时间内,到达目标坐标点aimPos,并且在到达目标点之后回调callback回调方法,可以在回调方法中进行动画结束后相应的处理操作:
public delegate void AnimationCompeletCallBack(Transform mTrans);
/// &summary&
/// 缓动动画
/// &/summary&
/// &param name=&trans&&移动物体&/param&
/// &param name=&aimPos&&目标坐标&/param&
/// &param name=&time&&耗时长度(单位s)&/param&
/// &param name=&callback&&动画完成之后的回调&/param&
public void FlyTo(Transform trans,Vector3 aimPos,float time,AnimationCompeletCallBack callback){
Tweener tweener = trans.DOMove(aimPos, time);
//设置这个Tween不受Time.scale影响
tweener.SetUpdate(true);
//设置移动类型
tweener.SetEase(Ease.Linear);
if (callback != null)
tweener.onComplete = delegate()
callback(trans);
tweener.onComplete =
}& & & & 此接口的使用方法如下:
FlyTo(transform, new Vector3(0, 8f, 0), 0.6f, AnimationFinishCallback);
/// &summary&
/// 动画结束回调
/// &/summary&
/// &param name=&mTrans&&&/param&
private void AnimationFinishCallback(Transform mTrans)
//动画结束的操作
}& & & & 运动路径的类型从Ease枚举中进行挑选,可以有匀速运动、加速运动、减速运动等,具体每种类型的运动情况可以在一下网页中选择然后进行浏览:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:234758次
积分:3749
积分:3749
排名:第8286名
原创:134篇
转载:27篇
评论:146条
阅读:7267
文章:16篇
阅读:15317
文章:16篇
阅读:11095
阅读:46279
文章:23篇
阅读:53596
阅读:8411
阅读:15737
(3)(8)(8)(9)(7)(5)(4)(8)(1)(1)(7)(12)(9)(9)(15)(31)(12)(1)(5)(10)(1)

我要回帖

更多关于 dotween sequence 的文章

 

随机推荐