我在一个2D项目里面加入了主人公(Hero),想添加时长为1s的向右攻击的动画,并且在0.7秒前攻击的同时会向前移动一小段距离,剩余的0.3秒返回原位置。我在动画中加入了transform编辑了几个关键帧。
但是结果不出意料只记录了绝对坐标,但人物移动到其他地方开始执行向右攻击的动画的时候,他瞬移到编辑关键帧的位置了。
我在百度上找到有人说套上GameObject就可以记录相对坐标了,但是我没找到。
有没有办法能让人物不管移动到哪里,执行向右攻击动画时,都能从目前所在的位置出发,移动一段距离攻击再回来啊
你先在人物外面套个空物体,人物作为子物体
移动的时候移动空物体,那么子物体也会跟着动
而动画就控制子物体在自己的坐标系下移动
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;
}
}
像上面的人说的套个空物体就可以解决,这是最简单的方法,如果想要灵活性的话用代码实现也可以。