Beispiel #1
0
        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);
            }
        }
Beispiel #3
0
        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
            });
        }
Beispiel #4
0
        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;
 }