示例#1
0
 public static BehaviorNodeConfig AddChild(this BehaviorTreeConfig treeConfig, BehaviorNodeConfig parent, BehaviorNodeConfig child)
 {
     child.transform.parent = parent.transform;
     child.transform.SetAsLastSibling();
     child.GetComponent <BehaviorNodeConfig>().id = treeConfig.RootNodeId + treeConfig.AutoId;
     return(child.GetComponent <BehaviorNodeConfig>());
 }
示例#2
0
        private static BehaviorNodeConfig CreateNodeConfig(this BehaviorTreeConfig treeConfig, string name)
        {
            NodeMeta   proto = BTEditor.Instance.GetComponent <BTNodeInfoComponent>().GetNodeMeta(name);
            GameObject go    = new GameObject()
            {
                name = name
            };

            go.transform.parent = treeConfig.gameObject.transform;
            BehaviorNodeConfig node = go.AddComponent <BehaviorNodeConfig>();

            node.name     = name;
            node.describe = proto.describe;

            foreach (NodeFieldDesc args in proto.new_args_desc)
            {
                Type type = BTTypeManager.GetBTType(args.type);
                UnityEngine.Component comp = go.AddComponent(type);
                FieldInfo             info = type.GetField("fieldName");
                info.SetValue(comp, args.name);
                FieldInfo info1 = type.GetField("fieldValue");
                info1.SetValue(comp, args.value);
            }
            return(node);
        }
示例#3
0
        public BehaviorTree CreateTree(Scene scene, long ownerId, GameObject treeGo)
        {
            try
            {
                if (treeGo == null)
                {
                    return(null);
                }
                BehaviorTree tree;
                if (this.treeCache.TryGetValue(treeGo, out tree))
                {
                    return(tree);
                }


                BehaviorTreeConfig behaviorTreeConfig = treeGo.GetComponent <BehaviorTreeConfig>();
                Node node = this.CreateTreeNode(behaviorTreeConfig.RootNodeProto);

                tree = new BehaviorTree(scene, ownerId, node)
                {
                    GameObjectId = treeGo.GetInstanceID()
                };
                if (Define.IsAsync)
                {
                    this.treeCache.Add(treeGo, tree);
                }
                return(tree);
            }
            catch (Exception e)
            {
                throw new Exception($"行为树配置错误: {treeGo.name}", e);
            }
        }
示例#4
0
        public static BehaviorNodeConfig AddChild(this BehaviorTreeConfig treeConfig, BehaviorNodeConfig parent, string name)
        {
            BehaviorNodeConfig child = treeConfig.CreateNodeConfig(name);

            AddChild(treeConfig, parent, child);
            return(child);
        }
示例#5
0
        public static void Serialize(this Node root, BehaviorTreeConfig config)
        {
            config.Clear();
            BehaviorNodeConfig         rootNp = config.AddRootNode(root.GetType().Name);
            Queue <Node>               queue  = new Queue <Node>();
            Queue <BehaviorNodeConfig> npQue  = new Queue <BehaviorNodeConfig>();

            rootNp.describe = root.Description;
            queue.Enqueue(root);
            npQue.Enqueue(rootNp);
            while (queue.Count > 0)
            {
                Node cur = queue.Dequeue();
                BehaviorNodeConfig np = npQue.Dequeue();
                foreach (Node child in cur.GetChildren)
                {
                    BehaviorNodeConfig childNp = GetNodeConfigFromNode(child);
                    queue.Enqueue(child);
                    npQue.Enqueue(childNp);
                    config.AddChild(np, childNp);
                }
            }
            //             PrintNode(root);
            //             PrintConfigNode(config.RootNodeConfig);
        }
示例#6
0
        public BTEditorTree(BehaviorTreeConfig config)
        {
            Type rootType = typeof(Game).Assembly.GetType($"Model.{config.RootNodeProto.Name}");
            Node root     = (Node)Activator.CreateInstance(rootType, config.RootNodeProto);

            root.Id = BTEditor.NodeIdStartIndex;
            Queue <NodeProto> protoStack = new Queue <NodeProto>();
            Queue <Node>      nodeStack  = new Queue <Node>();

            protoStack.Enqueue(config.RootNodeProto);
            nodeStack.Enqueue(root);
            while (protoStack.Count > 0)
            {
                NodeProto p    = protoStack.Dequeue();
                Node      node = nodeStack.Dequeue();

                foreach (KeyValuePair <string, object> argsItem in p.Args.Dict())
                {
                    FieldInfo fieldInfo = node.GetType().GetField(argsItem.Key, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                    fieldInfo.SetValue(node, argsItem.Value);
                }
                foreach (NodeProto child in p.Children)
                {
                    Type t         = typeof(Game).Assembly.GetType($"Model.{child.Name}");
                    Node childNode = (Node)Activator.CreateInstance(t, child);
                    AddChild(childNode, node);
                    protoStack.Enqueue(child);
                    nodeStack.Enqueue(childNode);
                }
            }
            this.BTConfig = config;
            _root         = root;
        }
示例#7
0
        public static BehaviorNodeConfig AddRootNode(this BehaviorTreeConfig treeConfig, string rootName)
        {
            BehaviorNodeConfig go = treeConfig.CreateNodeConfig(rootName);

            treeConfig.RootNodeConfig    = go.GetComponent <BehaviorNodeConfig>();
            treeConfig.RootNodeConfig.id = BTEditor.NodeIdStartIndex;
            go.gameObject.name           = rootName;
            return(go);
        }
示例#8
0
        public static BTEditorTree OpenFromGameObject(GameObject source)
        {
            BehaviorTreeConfig sourceTree = source.GetComponent <BehaviorTreeConfig>();

            if (sourceTree == null)
            {
                throw new Exception($"{source.name}预制中不包含行为树");
            }
            return(new BTEditorTree(sourceTree));
        }
示例#9
0
        public static BTEditorTree CreateTree <T>(GameObject source)
        {
            BehaviorTreeConfig sourceTree = source.GetComponent <BehaviorTreeConfig>();

            if (sourceTree == null)
            {
                sourceTree = source.AddComponent <BehaviorTreeConfig>();
            }
            Node         root = (Node)Activator.CreateInstance(typeof(T), new NodeProto());
            BTEditorTree tree = new BTEditorTree(root, sourceTree);

            return(tree);
        }
示例#10
0
 public void Save()
 {
     if (IsPrefab(this.BTConfig.gameObject))
     {
         GameObject go = UnityEngine.Object.Instantiate(this.BTConfig.gameObject);
         go.name = this.BTConfig.gameObject.name;
         BehaviorTreeConfig newConfig = go.GetComponent <BehaviorTreeConfig>();
         _root.Serialize(newConfig);
         PrefabUtility.ReplacePrefab(go, this.BTConfig, ReplacePrefabOptions.ReplaceNameBased);
         UnityEngine.Object.DestroyImmediate(go);
     }
     else
     {
         _root.Serialize(this.BTConfig);
     }
 }
示例#11
0
 private BTEditorTree(Node root, BehaviorTreeConfig config)
 {
     _root         = root;
     _root.Id      = BTEditor.NodeIdStartIndex;
     this.BTConfig = config;
 }
示例#12
0
 public void SaveToBehaviorTreeConfig(BehaviorTreeConfig config)
 {
     _root.Serialize(config);
 }