Files
Project-M/Packages/com.rukhanka.animation/Rukhanka.Runtime/RukhankaSystemsBootstrap.cs
T
2026-05-31 14:27:52 -07:00

113 lines
4.1 KiB
C#

using Unity.Entities;
using UnityEngine;
#if RUKHANKA_WITH_NETCODE
using Unity.NetCode;
#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Rukhanka
{
[CreateAfter(typeof(RukhankaAnimationSystemGroup))]
#if RUKHANKA_WITH_NETCODE
[CreateAfter(typeof(PredictedSimulationSystemGroup))]
#endif
public partial class RukhankaSystemsBootstrap: SystemBase
{
protected override void OnCreate()
{
#if RUKHANKA_DEBUG_INFO
Debug.LogWarning("RUKHANKA_DEBUG_INFO is defined. Performance may be reduced. Do not forget remove it in release builds.\nFor debug and logging functionality configuration please see documentation");
#endif
#if !UNITY_BURST_EXPERIMENTAL_ATOMIC_INTRINSICS
Debug.LogError($"'UNITY_BURST_EXPERIMENTAL_ATOMIC_INTRINSICS' script symbol is not defined. It is required for proper functioning of Rukhanka. Please add it by hand, or just restart editor and Rukhanka's bootstrap will add it automatically");
return;
#endif
#if RUKHANKA_WITH_NETCODE
bool isClient = World.IsClient();
bool isServer = World.IsServer();
#else
bool isClient = IsClientOrLocalSimulationWorld(World);
#endif
var sysGroup = World.GetOrCreateSystemManaged<RukhankaAnimationSystemGroup>();
var acs = World.CreateSystem<AnimatorControllerSystem<AnimatorControllerQuery>>();
var facs = World.CreateSystem<FillAnimationsFromControllerSystem>();
var aees = World.CreateSystem<AnimationEventEmitSystem>();
var aps = World.CreateSystem<AnimationProcessSystem>();
var aas = World.CreateSystem<AnimationApplicationSystem>();
var cs = World.CreateSystem<AnimationCullingSystem>();
var ikGroup = World.GetOrCreateSystemManaged<RukhankaAnimationInjectionSystemGroup>();
var actxus = World.GetOrCreateSystemManaged<AnimationCullingContextUpdateSystem>();
#if UNITY_EDITOR
var wbmrsg = World.GetOrCreateSystemManaged<WaybackMachineRecordSystemGroup>();
var wbmrs = World.GetOrCreateSystem<WaybackMachineRecordSystem>();
var wbmps = World.GetOrCreateSystem<WaybackMachinePlaybackSystem>();
wbmrsg.AddSystemToUpdateList(wbmrs);
#endif
// Add client animator controller systems
if (isClient)
{
sysGroup.AddSystemToUpdateList(acs);
sysGroup.AddSystemToUpdateList(facs);
sysGroup.AddSystemToUpdateList(actxus);
sysGroup.AddSystemToUpdateList(cs);
sysGroup.AddSystemToUpdateList(aees);
#if UNITY_EDITOR
sysGroup.AddSystemToUpdateList(wbmrsg);
sysGroup.AddSystemToUpdateList(wbmps);
#endif
sysGroup.AddSystemToUpdateList(aps);
sysGroup.AddSystemToUpdateList(ikGroup);
sysGroup.AddSystemToUpdateList(aas);
#if RUKHANKA_WITH_NETCODE
var acsForPrediction = World.CreateSystem<AnimatorControllerSystem<PredictedAnimatorControllerQuery>>();
var sysGroupPrediction = World.GetOrCreateSystemManaged<RukhankaPredictedAnimationSystemGroup>();
sysGroupPrediction.AddSystemToUpdateList(acsForPrediction);
#endif
}
// Server systems only for Netcode enabled version
#if RUKHANKA_WITH_NETCODE
if (isServer)
{
sysGroup.AddSystemToUpdateList(acs);
sysGroup.AddSystemToUpdateList(facs);
sysGroup.AddSystemToUpdateList(aees);
sysGroup.AddSystemToUpdateList(aps);
sysGroup.AddSystemToUpdateList(ikGroup);
sysGroup.AddSystemToUpdateList(aas);
sysGroup.AddSystemToUpdateList(actxus);
sysGroup.AddSystemToUpdateList(cs);
var acsForPrediction = World.CreateSystem<AnimatorControllerSystem<PredictedAnimatorControllerQuery>>();
var sysGroupPrediction = World.GetOrCreateSystemManaged<RukhankaPredictedAnimationSystemGroup>();
sysGroupPrediction.AddSystemToUpdateList(acsForPrediction);
}
#endif
// Remove bootstrap system from world
this.Enabled = false;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
public static bool IsClientOrLocalSimulationWorld(World w)
{
var rv =
(w.Flags & WorldFlags.GameClient) == WorldFlags.GameClient ||
(w.Flags & WorldFlags.Game) == WorldFlags.Game;
return rv;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
protected override void OnUpdate() {}
}
}