控制Timeline的播放状态,官方API中只有正播方法,没有倒播的接口。
自己原本有一个使用协程的方式,每一帧中进行更新,但是协程在处理中途暂停继续播放上比较难处理。所以使用Dotween的方式重新编辑一个。
TimelineHelper.cs :主要是提供了两个静态接口,用来实现挂TimelineDirector组件
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
namespace Tools
{
public static class PlayableExpansion
{
/// <summary>
/// 为director添加自定义控制器
/// </summary>
/// <param name="director"></param>
/// <returns></returns>
public static PlayableController AddPlayableController(this PlayableDirector director)
{
return director.gameObject.AddComponent<TimelineDirector>();
}
/// <summary>
/// 为obj添加自定义控制器
/// </summary>
/// <param name="director"></param>
/// <returns></returns>
public static PlayableController AddPlayableController(this GameObject obj)
{
return obj.AddComponent<TimelineDirector>();
}
}
public class TimelineHelper
{
/// <summary>
/// 创建Timeline控制器
/// </summary>
/// <param name="director">PlayableDirector 组件</param>
public static TimelineDirector CreateTimelineDirector(PlayableDirector director)
{
Debug.Assert(null != director, "null is director");
return director.GetComponent<TimelineDirector>() ?? director.gameObject.AddComponent<TimelineDirector>();
}
/// <summary>
/// 创建Timeline控制器
/// </summary>
/// <param name="directorPath">PlayableDirector 路径</param>
public static TimelineDirector CreateTimelineDirector(string directorPath)
{
var director = GameObject.Find(directorPath);
Debug.Assert(null != director, "null is directorPath");
return director.GetComponent<TimelineDirector>() ?? director.gameObject.AddComponent<TimelineDirector>();
}
}
}
TimelineDirector.cs :Timeline的相关控制封装,没有用官方播放的API,只用到了PlayableDirector时间和采样(PlayableDirector.time和PlayableDirector.Evaluate())
using System;
using DG.Tweening;
using UnityEngine;
using UnityEngine.Playables;
[RequireComponent(typeof(PlayableDirector))]
public class TimelineDirector : MonoBehaviour
{
#region ENUM
public enum Status
{
NULL,
PLAYING,
PAUSED,
STOPPED,
}
public enum Direction
{
NULL,
FORWARD,
BACKWARD
}
#endregion
[SerializeField]
private PlayableDirector m_playableDirector;
[Range(0f, 1f)]
public float PlaySpeed = 1f;
/// <summary>
/// 播放模式
/// </summary>
public WrapMode WrapMode = WrapMode.Once;
/// <summary>
/// 开始播放事件, 返回时 时间点,和触发时方向
/// </summary>
public Action<double, Direction> OnPlay;
/// <summary>
/// 暂停播放事件, 返回时 时间点,和触发时方向
/// </summary>