예제 #1
0
 public override void ResetNode()
 {
     if (m_listener_context != null)
     {
         Entity owner = m_context.GetData <Entity>(BTContextKey.OwnerEntity);
         for (int i = 0; i < m_signal_datas.Count; ++i)
         {
             owner.RemoveListener(m_signal_datas[i].m_signal_id, m_listener_context.ID);
         }
         SignalListenerContext.Recycle(m_listener_context);
         m_listener_context = null;
         m_context.GetLogicWorld().UnregisterBehaviorTree(this);
         m_register_id = 0;
     }
     ClearRunningTrace();
     base.ResetNode();
     if (m_context != null)
     {
         BTContext context = m_context;
         SetContext(null);
         RecyclableObject.Recycle(context);
     }
     m_current_running_entry_index = -1;
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
 }
예제 #2
0
        public override FixPoint GetVariable(ExpressionVariable variable, int index)
        {
            int vid = variable[index];

            if (vid == ExpressionVariable.VID_Target)
            {
                if (m_behavior_tree == null)
                {
                    return(FixPoint.Zero);
                }
                BTContext context = m_behavior_tree.Context;
                if (context == null)
                {
                    return(FixPoint.Zero);
                }
                int current_target_id = (int)(context.GetData(BTContextKey.CurrentTargetID));
                if (current_target_id <= 0)
                {
                    return(FixPoint.Zero);
                }
                Entity current_target = GetLogicWorld().GetEntityManager().GetObject(current_target_id);
                if (current_target == null)
                {
                    return(FixPoint.Zero);
                }
                return(current_target.GetVariable(variable, index + 1));
            }
            return(base.GetVariable(variable, index));
        }
예제 #3
0
        public override void InitializeComponent()
        {
            ObjectProtoData proto_data = ParentObject.GetCreationContext().m_proto_data;

            if (proto_data != null)
            {
                var variables = proto_data.m_component_variables;
                if (variables != null)
                {
                    string value;
                    if (variables.TryGetValue("ai_tree_id", out value))
                    {
                        m_bahavior_tree_id = int.Parse(value);
                    }
                }
            }

            m_behavior_tree = BehaviorTreeFactory.Instance.CreateBehaviorTree(m_bahavior_tree_id);
            if (m_behavior_tree != null)
            {
                m_behavior_tree.Construct(GetLogicWorld());
                BTContext context = m_behavior_tree.Context;
                context.SetData <IExpressionVariableProvider>(BTContextKey.ExpressionVariableProvider, this);
                context.SetData <Entity>(BTContextKey.OwnerEntity, GetOwnerEntity());
                context.SetData <AIComponent>(BTContextKey.OwnerAIComponent, this);
                m_behavior_tree.Active();
            }
        }
예제 #4
0
 public void SetContext(BTContext context)
 {
     m_context = context;
     if (m_children != null)
     {
         for (int i = 0; i < m_children.Count; ++i)
         {
             m_children[i].SetContext(context);
         }
     }
 }
 public override void InitializeComponent()
 {
     m_behavior_tree = BehaviorTreeFactory.Instance.CreateBehaviorTree(m_bahavior_tree_id);
     if (m_behavior_tree != null)
     {
         m_behavior_tree.Construct(GetLogicWorld());
         BTContext context = m_behavior_tree.Context;
         context.SetData <IExpressionVariableProvider>(BTContextKey.ExpressionVariableProvider, this);
         context.SetData <Entity>(BTContextKey.OwnerEntity, GetOwnerEntity());
         context.SetData <SkillComponent>(BTContextKey.OwnerSkillComponent, this);
         m_behavior_tree.Active();
     }
 }
예제 #6
0
 public void Construct(LogicWorld logic_world)
 {
     if (m_context == null)
     {
         BTContext context = RecyclableObject.Create <BTContext>();
         context.Construct(logic_world, this);
         SetContext(context);
     }
     if (m_task == null)
     {
         m_task = LogicTask.Create <BehaviorTreeTask>();
         m_task.Construct(this);
     }
 }