您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
73 行
2.5 KiB
73 行
2.5 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Unity.Entities;
|
|
using UnityEngine.Experimental.PlayerLoop;
|
|
using UnityEngine.Playables;
|
|
|
|
|
|
public class ItemActionTimelineTrigger : MonoBehaviour
|
|
{
|
|
[Serializable]
|
|
public struct ActionTimelines
|
|
{
|
|
public CharacterPredictedState.StateData.Action action;
|
|
public PlayableDirector director;
|
|
}
|
|
public ActionTimelines[] actionTimelines;
|
|
|
|
public Dictionary<CharacterPredictedState.StateData.Action, PlayableDirector> m_actionTimelines = new Dictionary<CharacterPredictedState.StateData.Action, PlayableDirector>();
|
|
public PlayableDirector m_currentActionTimeline = null;
|
|
public CharacterPredictedState.StateData.Action m_prevAction;
|
|
public int m_prevActionTick;
|
|
|
|
void Awake()
|
|
{
|
|
foreach (var map in actionTimelines)
|
|
{
|
|
if(map.director != null)
|
|
m_actionTimelines.Add(map.action, map.director);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// System
|
|
[DisableAutoCreation]
|
|
public class UpdateItemActionTimelineTrigger : BaseComponentSystem<CharacterItem, ItemActionTimelineTrigger>
|
|
{
|
|
public UpdateItemActionTimelineTrigger(GameWorld world) : base(world) {}
|
|
|
|
protected override void Update(Entity entity, CharacterItem item, ItemActionTimelineTrigger behavior)
|
|
{
|
|
if (!item.visible)
|
|
return;
|
|
|
|
var animState = EntityManager.GetComponentData<CharAnimState>(item.character);
|
|
Update(behavior, animState);
|
|
}
|
|
|
|
public static void Update(ItemActionTimelineTrigger behavior, CharAnimState animState)
|
|
{
|
|
var newAction = behavior.m_prevAction != animState.charAction;
|
|
var newActionTick = behavior.m_prevActionTick != animState.charActionTick;
|
|
if (newAction || newActionTick)
|
|
{
|
|
PlayableDirector director;
|
|
if (behavior.m_actionTimelines.TryGetValue(animState.charAction, out director))
|
|
{
|
|
if (behavior.m_currentActionTimeline != null && director != behavior.m_currentActionTimeline)
|
|
{
|
|
behavior.m_currentActionTimeline.Stop();
|
|
}
|
|
|
|
behavior.m_currentActionTimeline = director;
|
|
behavior.m_currentActionTimeline.time = 0;
|
|
|
|
behavior.m_currentActionTimeline.Play();
|
|
}
|
|
}
|
|
behavior.m_prevAction = animState.charAction;
|
|
behavior.m_prevActionTick = animState.charActionTick;
|
|
}
|
|
}
|