2
0
Fork 0

fix timeline 掉帧有概率跳过clip

master
cd 2 years ago
parent 10a37ca6f6
commit 9dd1340c5a

@ -21,6 +21,6 @@ MonoBehaviour:
mLastUsedPackagesHash: 1177269412 mLastUsedPackagesHash: 1177269412
mLastUsedPackagesCount: 1 mLastUsedPackagesCount: 1
mLastBuildCode: 1 mLastBuildCode: 1
mLastEditorStartupTimeTicks: 638207960909662303 mLastEditorStartupTimeTicks: 638207960920283677
mNewVersionAvailable: 1 mNewVersionAvailable: 1
mLastAttachedFlowPlayerValue: 0 mLastAttachedFlowPlayerValue: 0

@ -88,7 +88,8 @@ namespace Game
CastSkill(entity, skillCfg.TechnicalName, skillTimeline, castDir); CastSkill(entity, skillCfg.TechnicalName, skillTimeline, castDir);
} }
public static void CastSkillBullet(GameEntity entity)
private static void CastSkillBullet(GameEntity entity)
{ {
if (!entity.hasBullet) if (!entity.hasBullet)
{ {

@ -132,7 +132,7 @@ public class MoveSystem : IExecuteSystem, IInitializeSystem
move.IsFlowing = false; move.IsFlowing = false;
//触地特效 //触地特效
Util.CastGroundStaticEffect(GameConst.EffectHitGround2, entity.ID()); Util.CastGroundStaticEffect(GameConst.EffectHitGround2, entity.ID());
Util.AddStaggerBuff(entity.ID(), 0.2f); Util.AddStaggerBuff(entity.ID(), 2f);
//缩放 //缩放
Util.EntityScale(entity, Vector3.right * 3); Util.EntityScale(entity, Vector3.right * 3);
} }

@ -137,7 +137,7 @@ public class PauseSystem : IExecuteSystem, IInitializeSystem
return; return;
timeline.IsPause = isPause; timeline.IsPause = isPause;
foreach (var clip in timeline.Timeline.MClips) foreach (var clip in timeline.Timeline.Clips)
{ {
var clipReal = clip.Clip; var clipReal = clip.Clip;
if (clipReal.IsAlive) if (clipReal.IsAlive)

@ -1,63 +1,84 @@
using Entitas; using Entitas;
using UnityEngine; using UnityEngine;
using Game; using Game;
public class TimelineSystem : IExecuteSystem, IInitializeSystem public class TimelineSystem : IExecuteSystem, IInitializeSystem
{ {
private IGroup<GameEntity> _entities; private IGroup<GameEntity> _entities;
public void Initialize() public void Initialize()
{ {
_entities = Util.GetGroup(GameMatcher.Timeline); _entities = Util.GetGroup(GameMatcher.Timeline);
} }
public void Execute() public void Execute()
{ {
foreach (var entity in _entities) foreach (var entity in _entities)
{ {
var timeline = entity.timeline; var timeline = entity.timeline;
if (!timeline.IsRunning)
continue;
if (timeline.IsPause) if (timeline.IsPause)
continue; continue;
if (!timeline.IsRunning)
continue;
UpdateCheckEnd(entity); UpdateCheckEnd(entity);
if (!timeline.IsRunning)
continue;
UpdateTimeline(timeline); UpdateTimeline(timeline);
} }
} }
public void UpdateCheckEnd(GameEntity entity)
private static void UpdateCheckEnd(GameEntity entity)
{ {
var timeline = entity.timeline; var timeline = entity.timeline;
timeline.TimePast += Time.deltaTime; timeline.TimePast += Time.deltaTime;
if (timeline.TimePast >= timeline.TimeMax) if (timeline.TimePast >= timeline.TimeMax)
{ {
Util.EndSkillTimeline(entity); Util.EndSkillTimeline(entity);
return;
} }
} }
public void UpdateTimeline(TimelineComponent timeline)
private static void UpdateTimeline(TimelineComponent timeline)
{ {
// if (timeline.timePast == 0) foreach (var clip in timeline.Timeline.Clips)
// {
// return;
// }
foreach (var clip in timeline.Timeline.MClips)
{
var clipReal = clip.Clip;
var isOpenTime = timeline.TimePast >= clipReal.StartTime && timeline.TimePast < clipReal.EndTime;
if (clipReal.IsAlive && !isOpenTime)
{
clipReal.OnLeave();
clipReal.IsAlive = false;
}
}
foreach (var clip in timeline.Timeline.MClips)
{ {
var clipReal = clip.Clip; var clipReal = clip.Clip;
var isOpenTime = timeline.TimePast >= clipReal.StartTime && timeline.TimePast < clipReal.EndTime; var t = timeline.TimePast;
if (!clipReal.IsAlive && isOpenTime) var t1 = clipReal.StartTime;
var t2 = clipReal.EndTime;
//没有到激活时间的
if (t < t1) continue;
//已经执行完毕的
if (clipReal.HasRun) continue;
if (t >= t2)
{ {
clipReal.OnEnter(); //超过结束时间的
clipReal.IsAlive = true; if (clipReal.IsAlive)
{
//从激活状态退出的
clipReal.OnLeave();
clipReal.IsAlive = false;
}
else
{
//没有激活过 直接退出的
clipReal.OnEnter();
clipReal.OnStay();
clipReal.OnLeave();
}
clipReal.HasRun = true;
} }
if (clipReal.IsAlive && isOpenTime) else
{ {
//case2 到激活时间、未到结束时间的
if (!clipReal.IsAlive)
{
clipReal.OnEnter();
clipReal.IsAlive = true;
}
clipReal.OnStay(); clipReal.OnStay();
} }
} }

@ -6,11 +6,13 @@ namespace Game
public class TimelineClipBase public class TimelineClipBase
{ {
public bool IsAlive; public bool IsAlive;
public bool HasRun;
public double StartTime; public double StartTime;
public double EndTime; public double EndTime;
protected double Speed; protected double Speed;
protected GameEntity Owner; protected GameEntity Owner;
protected Object Asset; protected Object Asset;
public void Create(TimelineClip clip, GameEntity owner) public void Create(TimelineClip clip, GameEntity owner)
{ {
Owner = owner; Owner = owner;
@ -18,22 +20,29 @@ namespace Game
StartTime = clip.start; StartTime = clip.start;
EndTime = clip.end; EndTime = clip.end;
Speed = clip.timeScale; Speed = clip.timeScale;
Reset();
}
public void Reset()
{
IsAlive = false; IsAlive = false;
HasRun = false;
} }
public virtual void OnEnter() public virtual void OnEnter()
{ {
} }
public virtual void OnStay() public virtual void OnStay()
{ {
} }
public virtual void OnLeave() public virtual void OnLeave()
{ {
} }
public virtual void OnPause(bool isPause) public virtual void OnPause(bool isPause)
{ {
} }
} }
} }

@ -48,6 +48,7 @@ namespace Game
{ {
item.Clip = new T(); item.Clip = new T();
}); });
ret.Clip.Reset();
return ret; return ret;
} }
} }

@ -5,17 +5,13 @@ namespace Game
{ {
public class TimelineObject public class TimelineObject
{ {
public List<TimelineClipPoolItem> MClips = new List<TimelineClipPoolItem>(); public readonly List<TimelineClipPoolItem> Clips = new List<TimelineClipPoolItem>();
} }
public class TimelineManager : ManagerBase<TimelineManager> public class TimelineManager : ManagerBase<TimelineManager>
{ {
private static readonly string MSkillTimelinePathRoot = "Timeline/"; private const string SkillTimelinePathRoot = "Timeline/";
public TimelineManager()
{
}
public override void OnCreate()
{
}
public void RunSkillTimeline(GameEntity entity, string skillName) public void RunSkillTimeline(GameEntity entity, string skillName)
{ {
var entityTimeline = entity.timeline.Timeline; var entityTimeline = entity.timeline.Timeline;
@ -28,49 +24,56 @@ namespace Game
clips.Clear(); clips.Clear();
foreach (var clip in track.GetClips()) foreach (var clip in track.GetClips())
{ {
var clipReal = TimelineClipPoolManager.Instance.CreateByClipType(clip.asset.GetType(), clip, entity); var clipReal =
TimelineClipPoolManager.Instance.CreateByClipType(clip.asset.GetType(), clip, entity);
if (clipReal == null) if (clipReal == null)
{ {
continue; continue;
} }
clips.Add(clipReal); clips.Add(clipReal);
if (clipReal.Clip.EndTime > timeMax) if (clipReal.Clip.EndTime > timeMax)
{ {
timeMax = clipReal.Clip.EndTime; timeMax = clipReal.Clip.EndTime;
} }
} }
//这里需要按时间排序 同类型clip时序问题 //这里需要按时间排序 同类型clip时序问题
clips.Sort((a, b) => (int)(a.Clip.EndTime - b.Clip.EndTime)); clips.Sort((a, b) => (int)((a.Clip.EndTime - b.Clip.EndTime) * 1000));
entityTimeline.MClips.AddRange(clips); entityTimeline.Clips.AddRange(clips);
} }
entity.timeline.TimePast = 0; entity.timeline.TimePast = 0;
entity.timeline.TimeMax = timeMax; entity.timeline.TimeMax = timeMax;
entity.timeline.IsRunning = true; entity.timeline.IsRunning = true;
} }
public void EndSkillTimeline(GameEntity entity) public void EndSkillTimeline(GameEntity entity)
{ {
var timeline = entity.timeline; var timeline = entity.timeline;
if (timeline.Timeline != null) if (timeline.Timeline != null)
{ {
foreach (var clip in timeline.Timeline.MClips) foreach (var clip in timeline.Timeline.Clips)
{ {
var clipReal = clip.Clip; var clipReal = clip.Clip;
if (clipReal.IsAlive) if (clipReal.IsAlive)
{ {
clipReal.OnLeave(); clipReal.OnLeave();
} }
clip.Destroy(); clip.Destroy();
} }
timeline.Timeline.MClips.Clear();
timeline.Timeline.Clips.Clear();
} }
timeline.IsRunning = false; timeline.IsRunning = false;
timeline.IsPause = false; timeline.IsPause = false;
} }
public TimelineAsset EnsureGetSkillTimeline(string path) public TimelineAsset EnsureGetSkillTimeline(string path)
{ {
var pathReal = $"{MSkillTimelinePathRoot}{path}"; var pathReal = $"{SkillTimelinePathRoot}{path}";
return Util.Load<TimelineAsset>(pathReal); return Util.Load<TimelineAsset>(pathReal);
} }
} }

Loading…
Cancel
Save