您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
111 行
3.1 KiB
111 行
3.1 KiB
using Unity.Entities;
|
|
using UnityEngine;
|
|
using UnityEngine.Animations;
|
|
using UnityEngine.Playables;
|
|
using UnityEngine.Profiling;
|
|
|
|
[RequireComponent(typeof(Animator))]
|
|
[DisallowMultipleComponent]
|
|
public class AnimStateController : MonoBehaviour
|
|
{
|
|
public bool fireAnimationEvents;
|
|
|
|
public AnimGraphAsset animStateDefinition;
|
|
|
|
void OnDisable()
|
|
{
|
|
Deinitialize();
|
|
}
|
|
|
|
public void Initialize(EntityManager entityManager, Entity owner)
|
|
{
|
|
m_Animator = entityManager.GetComponentObject<Animator>(owner);
|
|
|
|
m_Animator.fireEvents = fireAnimationEvents;
|
|
|
|
GameDebug.Assert(animStateDefinition != null,"No animStateDefinition defined for AnimStateController:" + this.name);
|
|
|
|
Profiler.BeginSample("Create graph");
|
|
m_PlayableGraph = PlayableGraph.Create(name);
|
|
Profiler.EndSample();
|
|
|
|
#if UNITY_EDITOR
|
|
GraphVisualizerClient.Show(m_PlayableGraph);
|
|
#endif
|
|
|
|
Profiler.BeginSample("Instantiate playables");
|
|
m_animGraph = animStateDefinition.Instatiate(entityManager, owner, m_PlayableGraph);
|
|
Profiler.EndSample();
|
|
|
|
m_animGraphLogic = m_animGraph as IGraphLogic;
|
|
|
|
m_PlayableGraph.Play();
|
|
|
|
var outputPlayable = Playable.Null;
|
|
var outputPort = 0;
|
|
m_animGraph.GetPlayableOutput(0, ref outputPlayable, ref outputPort);
|
|
|
|
// Set graph output
|
|
var animationOutput = AnimationPlayableOutput.Create(m_PlayableGraph, "Animator", m_Animator);
|
|
animationOutput.SetSourcePlayable(outputPlayable);
|
|
animationOutput.SetSourceOutputPort (outputPort);
|
|
}
|
|
|
|
public void Deinitialize()
|
|
{
|
|
if (m_PlayableGraph.IsValid())
|
|
{
|
|
m_animGraph.Shutdown();
|
|
m_PlayableGraph.Destroy();
|
|
}
|
|
}
|
|
|
|
public void UpdatePresentationState(GameTime time, float deltaTime)
|
|
{
|
|
if (m_animGraphLogic == null)
|
|
return;
|
|
|
|
m_animGraphLogic.UpdateGraphLogic(time, deltaTime);
|
|
}
|
|
|
|
public void ApplyPresentationState(GameTime time, float deltaTime) //
|
|
{
|
|
Profiler.BeginSample("CharacterAnimController.ClientUpdate");
|
|
|
|
if (m_animGraph == null)
|
|
return;
|
|
|
|
m_animGraph.ApplyPresentationState(time, deltaTime);
|
|
|
|
Profiler.EndSample();
|
|
}
|
|
|
|
IAnimGraphInstance m_animGraph;
|
|
IGraphLogic m_animGraphLogic;
|
|
Animator m_Animator;
|
|
PlayableGraph m_PlayableGraph;
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
public class HandleAnimStateCtrlSpawn : InitializeComponentSystem<AnimStateController>
|
|
{
|
|
public HandleAnimStateCtrlSpawn(GameWorld world)
|
|
: base(world) { }
|
|
|
|
protected override void Initialize(Entity entity, AnimStateController component)
|
|
{
|
|
component.Initialize(EntityManager, entity);
|
|
}
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
public class HandleAnimStateCtrlDespawn : DeinitializeComponentSystem<AnimStateController>
|
|
{
|
|
public HandleAnimStateCtrlDespawn(GameWorld world)
|
|
: base(world) { }
|
|
|
|
protected override void Deinitialize(Entity entity, AnimStateController component)
|
|
{
|
|
component.Deinitialize();
|
|
}
|
|
}
|