private void Awake() { _nodeBlobRef = new NodeBlobRef(RootNode.ToBlob()); Destroy(RootNode.gameObject); _bb = new GameObjectBlackboard(gameObject); VirtualMachine.Reset(ref _nodeBlobRef, ref _bb); }
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { var blob = new NodeBlobRef(_source.GetBlobAsset()); var bb = new EntityBlackboard { Entity = entity, EntityManager = dstManager }; VirtualMachine.Reset(ref blob, ref bb); dstManager.AddBuffer <BehaviorTreeBufferElement>(entity); dstManager.AddComponent <CurrentBehaviorTreeComponent>(entity); var behaviorTreeEntity = conversionSystem.CreateAdditionalEntity(gameObject); #if UNITY_EDITOR dstManager.SetName(behaviorTreeEntity, $"[BT]{dstManager.GetName(entity)}:{_order}.{_debugName}"); #endif var query = blob.GetAccessTypes(); var dataQuery = new BlackboardDataQuery(query, components => // HACK: workaround for different world/dstManager in subscenes. // dstManager.CreateEntityQuery(components.ToArray())); World.DefaultGameObjectInjectionWorld.EntityManager.CreateEntityQuery(components.ToArray())); dstManager.AddSharedComponentData(behaviorTreeEntity, dataQuery); dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeComponent { Blob = blob, Thread = _thread, AutoCreation = _autoCreateTypes }); dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeTargetComponent { Value = entity }); dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeOrderComponent { Value = _order }); }
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 async void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { if (!enabled) { return; } var blob = await _source.GetBlobAsset(); var blobRef = new NodeBlobRef(blob); entity.AddBehaviorTree(dstManager, blobRef, _order, _autoCreateTypes, _thread, _debugName); }
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { if (!enabled) { return; } if (_rootNode != null && _rootNode.GetComponent <StopConvertToEntity>() == null) { _rootNode.gameObject.AddComponent <StopConvertToEntity>(); } var blob = _file != null?_file.ToBlob() : _rootNode.ToBlob(); var blobRef = new NodeBlobRef { BlobRef = blob }; entity.AddBehaviorTree(dstManager, blobRef, _thread); if (_autoCreateTypes != 0) { var accessTypes = dstManager.HasComponent <BlackboardDataQuery>(entity) ? dstManager.GetSharedComponentData <BlackboardDataQuery>(entity).Set : blobRef.GetAccessTypes() ; foreach (var componentType in accessTypes) { if (dstManager.HasComponent(entity, componentType)) { continue; } var shouldCreate = HasFlag(AutoCreateType.ReadOnly) && componentType.AccessModeType == ComponentType.AccessMode.ReadOnly || HasFlag(AutoCreateType.ReadWrite) && componentType.AccessModeType == ComponentType.AccessMode.ReadWrite || HasFlag(AutoCreateType.BehaviorTreeComponent) && TypeManager.GetType(componentType.TypeIndex)?.GetCustomAttribute <BehaviorTreeComponentAttribute>() != null ; if (shouldCreate) { dstManager.AddComponent(entity, componentType); } } } }
public void Execute <TCtx>(TCtx ctx) where TCtx : IGraphInstance { var instance = ctx as GraphInstance; Assert.IsNotNull(instance); if (instance == null) { return; } var definition = ctx.GetGraphDefinition(); var builder = BehaviorTree.ToBuilderNode(instance, definition).Single(); var dstManager = ctx.EntityManager; var entity = dstManager.CreateEntity(); var blob = new NodeBlobRef(builder.ToBlob()); var bb = new EntityBlackboard { Entity = entity, EntityManager = dstManager }; VirtualMachine.Reset(ref blob, ref bb); var query = blob.GetAccessTypes(); var dataQuery = new BlackboardDataQuery(query, components => dstManager.CreateEntityQuery(components.ToArray())); dstManager.AddSharedComponentData(entity, dataQuery); dstManager.AddComponentData(entity, new BehaviorTreeComponent { Blob = blob, Thread = Thread, AutoCreation = AutoCreation }); dstManager.AddComponentObject(entity, new GraphInstanceComponent { Value = instance }); #if UNITY_EDITOR var debugName = ctx.ReadString(DebugName); if (!string.IsNullOrEmpty(debugName)) { dstManager.SetName(entity, debugName); } #endif ctx.Write(BehaviorTreeEntity, entity); }
private void CreateViews(NodeBlobRef blob) { var views = new List <GameObject>(blob.Count); for (var i = 0; i < blob.Count; i++) { var nodeTypeId = blob.GetTypeId(i); var debugViewTypeList = DebugComponentLookUp.NODE_COMPONENTS_MAP[nodeTypeId]; var nodeGameObject = new GameObject(); views.Add(nodeGameObject); nodeGameObject.name = $"{DebugComponentLookUp.BEHAVIOR_NODE_ID_TYPE_MAP[nodeTypeId].Name}"; if (debugViewTypeList.Any()) { foreach (var viewType in debugViewTypeList) { var view = nodeGameObject.AddComponent(viewType) as BTDebugView; if (view != null) { view.Blob = blob; } } } else { nodeGameObject.name = $"?? {nodeGameObject.name}"; nodeGameObject.AddComponent <BTDebugView>().Blob = blob; } var parentIndex = blob.ParentIndex(i); var parent = parentIndex >= 0 ? views[parentIndex].transform : transform; nodeGameObject.transform.SetParent(parent); } for (var i = 0; i < views.Count; i++) { foreach (var view in views[i].GetComponents <BTDebugView>()) { view.Index = i; view.Blackboard = Blackboard; view.Init(); } } }
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { var blob = new NodeBlobRef(_source.GetBlobAsset()); var bb = new EntityBlackboard { Entity = entity, EntityManager = dstManager }; VirtualMachine.Reset(ref blob, ref bb); #if UNITY_EDITOR dstManager.SetName(entity, $"[BT]{_debugName}"); #endif var query = blob.GetAccessTypes(); var dataQuery = new BlackboardDataQuery(query, components => // HACK: workaround for different world/dstManager in subscenes. // dstManager.CreateEntityQuery(components.ToArray())); World.DefaultGameObjectInjectionWorld.EntityManager.CreateEntityQuery(components.ToArray())); dstManager.AddSharedComponentData(entity, dataQuery); dstManager.AddComponentData(entity, new BehaviorTreeComponent(blob, _thread, _autoCreateTypes)); }
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); } }