c1_unity/Assets/Scripts/Common/TimeLine/TimeLineManager.cs
2023-04-03 11:04:31 +08:00

186 lines
5.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
namespace BF
{
public class TimeLineManager : ManagerBase
{
private List<int> gameObjectIds;
private List<TimeLineItem> timeLineItems;
private List<int> removeTimelineIdxs;
static TimeLineManager instance;
public static TimeLineManager Create()
{
BFLog.LogAssert(instance == null, "This method only allows BFMain to call once");
instance = new TimeLineManager();
instance.Init();
return instance;
}
public override void Init()
{
gameObjectIds = new List<int>();
timeLineItems = new List<TimeLineItem>();
removeTimelineIdxs = new List<int>();
}
public override void Update()
{
removeTimelineIdxs.Clear();
int count = timeLineItems.Count;
for (int i = 0; i < count;)
{
timeLineItems[i].FrameMove(Time.deltaTime);
if (!removeTimelineIdxs.Contains(i))
i++;
else
count--;
}
}
public override void LateUpdate() { }
public override void Destroy()
{
gameObjectIds.Clear();
timeLineItems.Clear();
removeTimelineIdxs.Clear();
}
public TimeLineItem Load(GameObject tlObject)
{
int gameObjectId = tlObject.GetInstanceID();
int idx = gameObjectIds.IndexOf(gameObjectId);
if (idx >= 0)
return timeLineItems[idx];
var playableDirector = tlObject.GetComponent<PlayableDirector>();
if (null == playableDirector)
return null;
TimeLineItem tlItem = new TimeLineItem(playableDirector);
gameObjectIds.Add(gameObjectId);
timeLineItems.Add(tlItem);
return tlItem;
}
public bool Unload(GameObject tlObject)
{
int gameObjectId = tlObject.GetInstanceID();
int idx = gameObjectIds.IndexOf(gameObjectId);
if (idx >= 0)
{
timeLineItems[idx].Clear();
gameObjectIds.RemoveAt(idx);
timeLineItems.RemoveAt(idx);
removeTimelineIdxs.Add(idx);
return true;
}
return false;
}
public void Binding(GameObject tlObject, string trackName, Object obj)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.Binding(trackName, obj);
}
public void Unbinding(GameObject tlObject, string trackName)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.UnBinding(trackName);
}
public void ClearBinding(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.ClearAllBinding();
}
public void Play(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.Play();
}
public void Pause(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.Pause();
}
public void Resume(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.Resume();
}
public void Stop(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.Stop();
}
public void Reset(GameObject tlObject, double timePoint)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.Reset(timePoint);
}
public void ResetAndPlay(GameObject tlObject, double timePoint)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.ResetAndPlay(timePoint);
}
public void Reset(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.Reset();
}
public void ResetAndPlay(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.ResetAndPlay();
}
public void RegisterCompleteCallback(GameObject tlObject, System.Action action)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.onComplete = action;
}
public void RegisterCallback(GameObject tlObject, double time, System.Action action)
{
var tlItem = Load(tlObject);
if (null != tlItem)
tlItem.RegisterEvent(time, action);
}
public double GetTimelineTime(GameObject tlObject)
{
var tlItem = Load(tlObject);
if (null != tlItem)
return tlItem.Duration;
return 0;
}
}
}