Unity物体移动动画,如何加入相对坐标?

我在一个2D项目里面加入了主人公(Hero),想添加时长为1s的向右攻击的动画,并且在0.7秒前攻击的同时会向前移动一小段距离,剩余的0.3秒返回原位置。我在动画中加入了transform编辑了几个关键帧。

img

但是结果不出意料只记录了绝对坐标,但人物移动到其他地方开始执行向右攻击的动画的时候,他瞬移到编辑关键帧的位置了。
我在百度上找到有人说套上GameObject就可以记录相对坐标了,但是我没找到。

img

img

有没有办法能让人物不管移动到哪里,执行向右攻击动画时,都能从目前所在的位置出发,移动一段距离攻击再回来啊

你先在人物外面套个空物体,人物作为子物体
移动的时候移动空物体,那么子物体也会跟着动
而动画就控制子物体在自己的坐标系下移动

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
    private Coroutine attackAnimationCoroutine;

    /// <summary>
    /// 攻击
    /// </summary>
    /// <param name="attackDirection">攻击方向</param>
    /// <param name="moveDistance">移动距离</param>
    public void Attack(Vector3 attackDirection, float moveDistance)
    {
        //TODO attack
        //播放攻击动画
        if (attackAnimationCoroutine != null)
        {
            StopCoroutine(attackAnimationCoroutine);
        }
        attackAnimationCoroutine = StartCoroutine(AttackAnimation(attackDirection, moveDistance));
    }

    private IEnumerator AttackAnimation(Vector3 attackDirection, float moveDistance)
    {
        //记录动画开始时间
        float beginTime = Time.time;
        //向前位移动画时长
        float duration = .7f;
        //缓存当前位置
        Vector3 cachePosition = transform.position;
        //计算位移目标位置
        Vector3 targetPostion = transform.position + attackDirection.normalized * moveDistance;
        for (; (Time.time - beginTime) < duration;)
        {
            //插值
            float t = (Time.time - beginTime) / duration;
            transform.position = Vector3.Lerp(transform.position, targetPostion, t);
            yield return null;
        }
        beginTime = Time.time;
        //回到缓存位置动画时长
        duration = .3f;
        for (; (Time.time - beginTime) < duration;)
        {
            //插值
            float t = (Time.time - beginTime) / duration;
            transform.position = Vector3.Lerp(transform.position, cachePosition, t);
            yield return null;
        }
        attackAnimationCoroutine = null;
    }
}

像上面的人说的套个空物体就可以解决,这是最简单的方法,如果想要灵活性的话用代码实现也可以。