Unity PlayableDirector(Timeline) 正播倒播处理

控制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>
    
### Unity Timeline 放功能实现 在 Unity 中,Timeline放可以通过调整 `PlayableDirector` 组件的时间属性来实现。具体来说,通过设置时间轴的方向为负值,可以控制放头向反方向移动。这通常涉及修改 `time` 属性以及更新其增量。 以下是实现方法的一个示例: ```csharp using UnityEngine; using UnityEngine.Playables; public class ReversePlayback : MonoBehaviour { public PlayableDirector director; // 将此组件绑定到场景中的PlayableDirector对象上 private float lastTime = 0f; void Update() { if (director != null && director.state == PlayState.Playing) { // 如果当前时间为,则尝试反转它 if (lastTime > Time.time) { director.time -= Time.deltaTime * Mathf.Abs(director.playbackSpeed); } else { director.time += Time.deltaTime * director.playbackSpeed; } lastTime = Time.time; // 当需要强制放时,可直接设置playbackSpeed为负数 if (Input.GetKeyDown(KeyCode.R)) // 按下R键切换放速度 { director.playbackSpeed *= -1; // 反转放速度 } } } } ``` 上述脚本允许用户按下键盘上的 R 键来切换放方向。当 `playbackSpeed` 设置为值时,Timeline 常向前放;而将其设为负值时,则会触发放模式[^1]。 需要注意的是,在某些情况下可能还需要启用调试工具以排查潜在问题。例如,如果希望在开发过程中验证 Direct3D 调试层是否常工作,可以在启动参数中加入 `-debug` 开启额外的日志记录支持[^1]。 相关问题
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰尼杰尼丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值