目录
Path Editor Options:轨迹编辑参数,就不介绍了
2.DoTween Pro中运动轨迹(DoTween Path)如何变为相对运动
1.基础属性
Scene View Commands
(1)SHIFT+CTRL:add a waypoint加一个轨迹点
(2)SHIFT+ALT:remove a waypoint移除一个轨迹点
INfo
(1)Path Length:轨迹长度
Tween Options
(1)AutoPlay:自动播放
(2)AutoKill:播放完自动销毁动画
(3)Duration:动画时长
SpeedBased:If selected ,the duration will count as units/degreex second;如果被选上,该时间作为单位时间。
(4)Delay:延时
(5)Ease:这是一个枚举,可以理解为动画播放速率曲线
(6)Loops:循环次数,动画循环播放的次数
-1:表示 一直循环
0:表示只播放一次
当该值>1时,检视面板出现LoopType,顾名思义就是指循环类型:
Restart:重新开始,后面的动画循环播放会从起点重新开始;
Yoyo:来回播放
Incremental:增加的,后面的path移动动画会在上一次循环的终点的基础上进行播放
(7)ID:动画ID
(8)UpdateType:这个枚举有三个值,指更新类型
Normal:正常更新,Update()
Late:晚于更新,LateUpdate()
Fixed:固定更新,FixedUpdate()
Path Tween Options
(1)Path Type:轨迹线类型
Linear:线型的
Catmull Rom:曲线
(2)Close Path:封闭曲线,将起点和终点相连
(3)Lock Rotation:锁旋转,xyzw
Path Editor Options:轨迹编辑参数,就不介绍了
ResetPath:重置轨迹
Events:
(1)OnStart:开始时
(2)OnPlay:播放时
(3)OnUpdate:更新时
(4)OnStep:单步完成时
(5)OnComplete:完成时
(6)OnCreated:动画创建时
事件顺序为:OnCreated->OnStart->OnPlay->OnUpdate(一直执行,直到完成),动画过程中单步完成时执行OnStep,整个动画完成后执行OnComplete
WayPoints:移动轨迹点
其中右边的Copy to clipboard,将坐标复制至剪贴板
加减按钮即指增加减少坐标点
DOPath
DOLocalPath
2.DoTween Pro中运动轨迹(DoTween Path)如何变为相对运动
- 声明类型时一定要声明类型为DOTweenPath(不要用Tween),因为DORestart只能用于DOTweenPath和DOTweenAnimation。
- 一般轨迹是固定的。但是——这里有个但是,如果你Restart之后,它会根据自身的当前位置,重新生成路径,这就解决了我们上面所述的问题
- 轨迹是世界坐标,在unity编辑器里勾选的(relative)相对运动,只在编辑器里有效?
3.代码动态添加点数
public Vector3[] vector3s;
public Transform[] targets;
public Transform earth;
private void Awake()
{
for (int i = 0; i < targets.Length; i++)
{
vector3s[i] = new Vector3(targets[i].position.x, targets[i].position.y, targets[i].position.z);
}
}
private void Start()
{
earth.DOPath(vector3s, 50, PathType.Linear).SetEase(Ease.Linear).SetLoops(-1);
}
4.ex
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices.WindowsRuntime;
using DG.Tweening;
using DG.Tweening.Plugins.Core.PathCore;
using UnityEngine;
public class DomoveSimpleScript : MonoBehaviour
{
//public Ease m_MoveType = Ease.Linear;
public float m_Speed = 5f;
public float m_CheckTime = 1f;
private List<Vector3> m_PointList;
private Action mf_Complete;
void Awake()
{
if (m_PointList==null)
{
m_PointList=new List<Vector3>();
}
}
//将所需的路径点信息添加
public void AddWayPoint(Vector3 V)
{
if (m_PointList==null)
{
m_PointList=new List<Vector3>();
}
m_PointList.Add(V);
}
//
public void DoMove(float Spd=1.0f,Action F=null,Action stepFunc=null,Ease moveType = Ease.Linear)
{
m_Speed = Spd;
//路径完成后的回调
mf_Complete = F;
if (m_PointList!=null)
{
var doAni= transform.DOPath(m_PointList.ToArray(), m_Speed);
doAni.SetEase(moveType);
//默认朝向
doAni.SetLookAt(0);
doAni.OnWaypointChange(
(s) =>
{
//Debug.LogError(s);
//单步完成后的回调
stepFunc();
});
doAni.OnComplete(OnComplete);
m_isStop = false;
}
}
public bool IsMoving()
{
return (!m_isStop);
}
private float Dtime = 0f;
private bool m_isStop = true;
private void Update()
{
if (m_isStop)
return;
Dtime += Time.deltaTime;
if (Dtime > m_CheckTime)
{
Dtime = 0;
}
}
void OnComplete()
{
m_isStop = true;
m_PointList.Clear();
if (mf_Complete!=null)
{
mf_Complete();
}
}
}