Example #1
0
 private bool IsConditionMet(NodeData node)
 => IsConditionMet(_nodeTreeConditionMap[CurrentNodeTree.NodeTree.name][node.Id]());
Example #2
0
        private Func <T> GetBuildNodeFunc <T>(NodeData node)
        {
            List <Action <object> >           modifications = new List <Action <object> >();
            Dictionary <string, PropertyInfo> props         = Type.GetType(node.Type).GetProperties().Where(x => x.CanWrite).ToDictionary(x => x.Name, x => x);
            var type = Type.GetType(node.Type);

            foreach (var prop in node.Properties)
            {
                if (props[prop.Key].Name == "NodeTreeIds")
                {
                    modifications.Add(x => props[prop.Key].SetValue(x, node.NextIds.ToArray()));
                }
                else if (props[prop.Key].PropertyType == typeof(bool))
                {
                    var value = bool.Parse(prop.Value);
                    modifications.Add(x => props[prop.Key].SetValue(x, value));
                }
                else if (props[prop.Key].PropertyType == typeof(string))
                {
                    var value = prop.Value;
                    modifications.Add(x => props[prop.Key].SetValue(x, value));
                }
                else if (props[prop.Key].PropertyType == typeof(int))
                {
                    var value = int.Parse(prop.Value);
                    modifications.Add(x => props[prop.Key].SetValue(x, value));
                }
                else if (props[prop.Key].PropertyType == typeof(float))
                {
                    var value = float.Parse(prop.Value);
                    modifications.Add(x => props[prop.Key].SetValue(x, value));
                }
                else if (props[prop.Key].PropertyType == typeof(TextAsset))
                {
                    var value = NodeTrees.First(x => x.name == prop.Value);
                    modifications.Add(x => props[prop.Key].SetValue(x, value));
                }
                else if (typeof(ScriptableObject).IsAssignableFrom(props[prop.Key].PropertyType))
                {
                    if (!AssetMap.ContainsKey(prop.Value))
                    {
                        Debug.LogError($"AssetMap does not contain {prop.Value}");
                    }
                    var value = AssetMap[prop.Value];
                    modifications.Add(x => props[prop.Key].SetValue(x, value));
                }
            }
            var propsToPopulate = props
                                  .Where(x => typeof(INodeCommand[]).IsAssignableFrom(x.Value.PropertyType) ||
                                         typeof(INodeCondition[]).IsAssignableFrom(x.Value.PropertyType) ||
                                         typeof(INodeObject[]).IsAssignableFrom(x.Value.PropertyType))
                                  .Select(x => x.Value)
                                  .ToArray();

            if (propsToPopulate.Any())
            {
                modifications.Add(x => PopulateNodeTypes(node, x, propsToPopulate));
            }
            return(() =>
            {
                var instance = Activator.CreateInstance(type);
                modifications.ForEach(x => x(instance));
                return (T)instance;
            });
        }