前几天在itch上玩到这个游戏,感觉很有趣,叫做It's a wrap

玩家扮演一个“导演”,在时间轴上拖动带有不同动画的影片剪辑来控制场景中的物品,有点类似于pr的操作

所以这次尝试做一个用时间轴来控制动画播放的小demo

难点是如何通过时间轴标尺以及动画剪辑的位置来控制动画播放

我们使用UGUI内置的slider组件来制作标尺和剪辑

给上面黄色的标尺添加脚本

public class TimeController : MonoBehaviour {
    public float timeValue;
    private Slider slider;
    void Start () {
        slider = GetComponent<Slider> ();
    }
    void Update () {
        timeValue = slider.value;
    }
}

给下面的剪辑添加脚本

public class Clip : MonoBehaviour {
    private TimeController timeController;
    private Player player;
    private Slider slider;
    //片段与总长度的比例
    private float scale;
    void Start () {
        player = GameObject.FindGameObjectWithTag ("Player").GetComponent<Player> ();
        timeController = GameObject.FindGameObjectWithTag ("TimeController").GetComponent<TimeController> ();
        slider = transform.parent.parent.GetComponent<Slider> ();
        scale = GetComponent<RectTransform> ().rect.width / slider.GetComponent<RectTransform> ().rect.width;
    }
    void Update () {
        //计算播放的进度
        player.anim.Play ("sword_defend", 0, timeController.timeValue / scale - slider.value * (1 / scale - 1));
    }
}

注意要把橙色剪辑的锚点设置在左中心,不然拖动时会漂移

然后随便添加一个带有动画的人物

在起始时设定animator的speed为0,来冻结动画的播放

public class Player : MonoBehaviour {
    public Animator anim;
    void Start () {
        anim = GetComponent<Animator> ();
        anim.speed = 0;
    }
}

最后的效果

Last modification:February 3rd, 2021 at 02:00 am