ProjectDDD/Packages/com.opsive.behaviordesigner/Runtime/Groups/BehaviorTreeSystemGroup.cs
2025-08-19 18:53:26 +09:00

80 lines
2.3 KiB
C#

#if GRAPH_DESIGNER
/// ---------------------------------------------
/// Behavior Designer
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.BehaviorDesigner.Runtime.Groups
{
using Opsive.BehaviorDesigner.Runtime.Systems;
using Unity.Entities;
using UnityEngine;
/// <summary>
/// System group which runs all of the behavior tree systems.
/// </summary>
[UpdateInGroup(typeof(SimulationSystemGroup))]
[UpdateAfter(typeof(BeginSimulationEntityCommandBufferSystem))]
public partial class BehaviorTreeSystemGroup : ComponentSystemGroup
{
private bool m_Alive;
public bool Alive { get => m_Alive; }
/// <summary>
/// Disable the group if there are no behavior trees.
/// </summary>
[RuntimeInitializeOnLoadMethod]
private static void Init()
{
if (BehaviorTree.BehaviorTreeCount > 0) {
return;
}
var worlds = World.All;
for (int i = 0; i < worlds.Count; ++i) {
var systemGroup = worlds[i].GetExistingSystemManaged<BehaviorTreeSystemGroup>();
if (systemGroup == null) {
continue;
}
systemGroup.Enabled = false;
}
}
/// <summary>
/// The group has been created.
/// </summary>
protected override void OnCreate()
{
base.OnCreate();
m_Alive = true;
}
/// <summary>
/// Update the system group.
/// </summary>
protected override void OnUpdate()
{
base.OnUpdate();
// Stop running if all trees have completed.
var systemHandle = World.GetExistingSystem<DetermineEvaluationSystem>();
var system = EntityManager.WorldUnmanaged.GetUnsafeSystemRef<DetermineEvaluationSystem>(systemHandle);
if (!system.Active) {
Enabled = false;
}
}
/// <summary>
/// The group has been destroyed.
/// </summary>
protected override void OnDestroy()
{
base.OnDestroy();
m_Alive = false;
}
}
}
#endif