public static void AddBehaviorTree( this Entity entity , EntityManager dstManager , BlobAssetReference <NodeBlob> blobRef , BehaviorTreeThread thread = BehaviorTreeThread.ForceRunOnMainThread ) { var blob = new NodeBlobRef { BlobRef = blobRef }; switch (thread) { case BehaviorTreeThread.ForceRunOnMainThread: { var bb = new EntityBlackboard { EntityManager = dstManager, Entity = entity }; VirtualMachine.Reset(blob, bb); dstManager.AddComponentData(entity, new ForceRunOnMainThreadTag()); break; } case BehaviorTreeThread.ForceRunOnJob: { AddJobComponents(); dstManager.AddComponentData(entity, new ForceRunOnJobTag()); break; } case BehaviorTreeThread.ControlledByBehaviorTree: { AddJobComponents(); break; } default: throw new ArgumentOutOfRangeException(nameof(thread), thread, null); } dstManager.AddComponentData(entity, blob); void AddJobComponents() { var dataQuery = new BlackboardDataQuery { Value = blobRef.GetAccessTypes() }; var bb = new EntityBlackboard(); VirtualMachine.Reset(blob, bb); dstManager.AddComponentData(entity, new IsRunOnMainThread { Value = false }); dstManager.AddSharedComponentData(entity, dataQuery); } }
public static BehaviorTreeRuntimeThread ToRuntimeThread(this BehaviorTreeThread thread) { switch (thread) { case BehaviorTreeThread.ForceRunOnMainThread: return(BehaviorTreeRuntimeThread.ForceMainThread); case BehaviorTreeThread.ForceRunOnJob: return(BehaviorTreeRuntimeThread.ForceJobThread); case BehaviorTreeThread.ControlledByBehaviorTree: return(BehaviorTreeRuntimeThread.JobThread); default: throw new ArgumentOutOfRangeException(nameof(thread), thread, null); } }
public static void AddBehaviorTree( this Entity entity , EntityManager dstManager , NodeBlobRef blob , int order = 0 , AutoCreateType autoCreateType = AutoCreateType.None , BehaviorTreeThread thread = BehaviorTreeThread.ForceRunOnMainThread , string debugName = default ) { var bb = new EntityBlackboard { Entity = entity, EntityManager = dstManager }; VirtualMachine.Reset(ref blob, ref bb); dstManager.AddBuffer <BehaviorTreeBufferElement>(entity); dstManager.AddComponent <CurrentBehaviorTreeComponent>(entity); var behaviorTreeEntity = dstManager.CreateEntity(); #if UNITY_EDITOR dstManager.SetName(behaviorTreeEntity, $"[BT]{dstManager.GetName(entity)}:{order}.{debugName}"); #endif var query = blob.GetAccessTypes(); var dataQuery = new BlackboardDataQuery(query, components => dstManager.CreateEntityQuery(components.ToArray())); dstManager.AddSharedComponentData(behaviorTreeEntity, dataQuery); dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeComponent { Blob = blob, Thread = thread, AutoCreation = autoCreateType }); dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeTargetComponent { Value = entity }); dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeOrderComponent { Value = order }); }
public static void AddBehaviorTree( this Entity entity , EntityManager dstManager , NodeBlobRef blob , BehaviorTreeThread thread = BehaviorTreeThread.ForceRunOnMainThread ) { var bb = new EntityBlackboard { Entity = entity, EntityManager = dstManager }; VirtualMachine.Reset(blob, bb); dstManager.AddComponentData(entity, blob); var query = blob.GetAccessTypes(); var dataQuery = new BlackboardDataQuery(query, components => dstManager.CreateEntityQuery(components.ToArray())); dstManager.AddSharedComponentData(entity, dataQuery); switch (thread) { case BehaviorTreeThread.ForceRunOnMainThread: dstManager.AddComponentData(entity, new RunOnMainThreadTag()); dstManager.AddComponentData(entity, new ForceRunOnMainThreadTag()); break; case BehaviorTreeThread.ForceRunOnJob: dstManager.AddComponentData(entity, new ForceRunOnJobTag()); break; case BehaviorTreeThread.ControlledByBehaviorTree: break; default: throw new ArgumentOutOfRangeException(nameof(thread), thread, null); } }
public BehaviorTreeComponent(NodeBlobRef blob, BehaviorTreeThread thread, AutoCreateType autoCreation) { Blob = blob; Thread = thread; AutoCreation = autoCreation; }