using System.Collections; using System.Collections.Generic; using UnityEngine; using QFramework; using System; using UnityEngine.Playables; public class TimeLineAction : IAction { public ulong ActionID { get; set; } public bool Deinited { get; set; } public bool Paused { get; set; } public ActionStatus Status { get; set; } private static readonly SimpleObjectPool mPool = new SimpleObjectPool(() => new TimeLineAction(), null, 10); string path; string isShow = string.Empty; string deviceName = string.Empty; string finishedEvent = string.Empty; string isWait = "true"; string frame; string endFrame; float curEndFrame = -1; string speed = "1"; GameObject obj = null; PlayableDirector play = null; float fps = 24; public static TimeLineAction Allocate(string path, Dictionary datas, System.Action onDelayFinish = null) { var retNode = mPool.Allocate(); retNode.ActionID = ActionKit.ID_GENERATOR++; retNode.Deinited = false; retNode.Reset(); retNode.path = path; retNode.isShow = datas.ContainsKey("isShow") ? datas["isShow"] : string.Empty; retNode.deviceName = datas.ContainsKey("deviceName") ? datas["deviceName"] : string.Empty; retNode.finishedEvent = datas.ContainsKey("finishedEvent") ? datas["finishedEvent"] : string.Empty; retNode.isWait = datas.ContainsKey("isWait") ? datas["isWait"] : "true"; retNode.frame = datas.ContainsKey("frame") ? datas["frame"] : string.Empty; retNode.endFrame = datas.ContainsKey("endFrame") ? datas["endFrame"] : string.Empty; retNode.speed = datas.ContainsKey("speed") ? datas["speed"] : string.Empty; retNode.curEndFrame = -1; retNode.play = null; return retNode; } public void Deinit() { if (!Deinited) { play?.Stop(); play = null; Deinited = true; mPool.Recycle(this); } } public void OnExecute(float dt) { if (curEndFrame != -1 && play.time * fps >= curEndFrame) { play.Stop(); play.time = curEndFrame / 24; } if (play.state != PlayState.Playing) { Finished(); } } public void OnFinish() { } public void OnStart() { if (string.IsNullOrEmpty(deviceName) == false) { obj = DeviceController.Instance.GetDeviceObj(deviceName); } else { obj = Utility.FindObj(path); } if (obj == null) { Debug.LogError("没有找到物体 :" + path); } else { bool isActive = true; bool.TryParse(isShow, out isActive); play = obj.GetComponent(); if (isActive) { float curFrame = 0; if (string.IsNullOrEmpty(frame) == false) { float.TryParse(frame, out curFrame); } play.time = curFrame / fps; float curSpeed = 1; if (float.TryParse(speed, out curSpeed) == false) { curSpeed = 1; } if (!play.playableGraph.IsValid()) { play.RebuildGraph(); } play.playableGraph.GetRootPlayable(0).SetSpeed(curSpeed); play.Play(); if (string.IsNullOrEmpty(endFrame) == false) { float.TryParse(endFrame, out curEndFrame); } bool iswait = true; bool.TryParse(isWait, out iswait); if (iswait == false) { Finished(); } } else { play.Stop(); } } } public void Finished() { this.Finish(); if (string.IsNullOrEmpty(finishedEvent) == false) { StringEventSystem.Global.Send(finishedEvent); } } public void Reset() { Status = ActionStatus.NotStart; Paused = false; } }