2
0
Fork 0

fix timeline 掉帧有概率跳过clip

master
cd 2 years ago
parent 10a37ca6f6
commit 9dd1340c5a

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

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

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

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

@ -1,63 +1,84 @@
using Entitas;
using UnityEngine;
using Game;
public class TimelineSystem : IExecuteSystem, IInitializeSystem
{
private IGroup<GameEntity> _entities;
public void Initialize()
{
_entities = Util.GetGroup(GameMatcher.Timeline);
}
public void Execute()
{
foreach (var entity in _entities)
{
var timeline = entity.timeline;
if (!timeline.IsRunning)
continue;
if (timeline.IsPause)
continue;
if (!timeline.IsRunning)
continue;
UpdateCheckEnd(entity);
if (!timeline.IsRunning)
continue;
UpdateTimeline(timeline);
}
}
public void UpdateCheckEnd(GameEntity entity)
private static void UpdateCheckEnd(GameEntity entity)
{
var timeline = entity.timeline;
timeline.TimePast += Time.deltaTime;
if (timeline.TimePast >= timeline.TimeMax)
{
Util.EndSkillTimeline(entity);
return;
}
}
public void UpdateTimeline(TimelineComponent timeline)
private static void UpdateTimeline(TimelineComponent timeline)
{
// if (timeline.timePast == 0)
// {
// 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)
foreach (var clip in timeline.Timeline.Clips)
{
var clipReal = clip.Clip;
var isOpenTime = timeline.TimePast >= clipReal.StartTime && timeline.TimePast < clipReal.EndTime;
if (!clipReal.IsAlive && isOpenTime)
var t = timeline.TimePast;
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();
}
}

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

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

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

Loading…
Cancel
Save