예제 #1
0
        public void GetComponentsFrom(GameObject gameObject)
        {
            foreach (var component in gameObject.GetComponents <Widget>())
            {
                if (component is MaterialWidget)
                {
                    ((MaterialWidget)component).UpdateWidgetState();
                }
                else if (component is LightWidget)
                {
                    ((LightWidget)component).UpdateWidget();
                }
                else if (component is ParticleWidget)
                {
                    ((ParticleWidget)component).UpdateWidget();
                }

                if (string.IsNullOrEmpty(component.InstanceID))
                {
                    component.GenerateInstanceID();
                }

                var widget = new NodeWidget(component);

                if (widget.NeedsReferenceSerialization())
                {
                    NodeReferenceMap.AddNodeWidget(widget);
                }

                widget.Serialize();

                NodeReferenceMap.AddReference(component, widget);
                widgetMap.Add(widget);
            }
        }
예제 #2
0
        public void SetWidgetsFor(GameObject gameObject, bool overwriteWidgetSettings = true)
        {
            var usedWidgets = new List <Component>();

            foreach (var widget in widgetMap)
            {
                var  widgetType     = System.Type.GetType(widget.Type);
                bool existingWidget = false;

                if (widgetType == null)
                {
                    Debug.LogWarning(this.name + " [Widget Type Unknown] " + widget.Type);
                    continue;
                }

                var reconstitutedWidget = gameObject.GetComponents(widgetType).FirstOrDefault(w => !usedWidgets.Contains(w));

                if (reconstitutedWidget)
                {
                    existingWidget = true;
                }
                else
                {
                    reconstitutedWidget = gameObject.AddComponent(widgetType);
                }

                usedWidgets.Add(reconstitutedWidget);
                NodeReferenceMap.AddReference(reconstitutedWidget, widget);

                if (!overwriteWidgetSettings && existingWidget)
                {
                    continue;
                }

                if (widget.NeedsReferenceSerialization())
                {
                    NodeReferenceMap.AddNodeWidget(widget);
                }

                if (reconstitutedWidget)
                {
                    JsonUtility.FromJsonOverwrite(widget.Value, reconstitutedWidget);
                }

                if (reconstitutedWidget is Widget && string.IsNullOrEmpty(((Widget)reconstitutedWidget).InstanceID))
                {
                    ((Widget)reconstitutedWidget).GenerateInstanceID();
                }
            }
        }
예제 #3
0
        public Node CreateChild(GameObject gameObject)
        {
            var child = CreateChild(gameObject.name);

            child.id = gameObject.GetInstanceID();
            NodeReferenceMap.AddReference(gameObject, child);

            child.localPosition = gameObject.transform.localPosition;
            child.localRotation = gameObject.transform.localRotation;
            child.localScale    = gameObject.transform.localScale;

            child.GetComponentsFrom(gameObject);

            return(child);
        }
예제 #4
0
        public Node(GameObject gameObject)
        {
            Initialize();

            instanceID = System.Guid.NewGuid().ToString();
            id         = gameObject.GetInstanceID();
            name       = gameObject.name;
            NodeReferenceMap.AddReference(gameObject, this);

            localPosition = gameObject.transform.position;
            localRotation = gameObject.transform.rotation;
            localScale    = gameObject.transform.lossyScale;

            GetComponentsFrom(gameObject);
            CreateChildrenFrom(gameObject);

            //TODO: test for references
            NodeReferenceMap.UpdateReferenceIDs();
        }
예제 #5
0
        public static GameObject RenderToGameObject(Node node, GameObject target = null)
        {
            if (!target)
            {
                target = new GameObject(node == null ? "Root" : node.name);
            }
            else
            {
                target.name = node.name;
            }

            target.transform.position   = node.localPosition;
            target.transform.rotation   = node.localRotation;
            target.transform.localScale = node.localScale;

            node.SetWidgetsFor(target);
            NodeReferenceMap.AddReference(target, node);

            return(target);
        }
예제 #6
0
        public static IEnumerator RenderNodeTree(Node node, GameObject gameObject = null)
        {
            var nodeQueue = new Queue <Node>();

            nodeQueue.Enqueue(node);

            var gameObjectQueue = new Queue <GameObject>();

            if (gameObject)
            {
                gameObjectQueue.Enqueue(gameObject);
                NodeReferenceMap.AddReference(gameObject, node);
            }
            else
            {
                gameObjectQueue.Enqueue(RenderToGameObject(node, gameObject));
            }

            while (gameObjectQueue.Count > 0)
            {
                var currentNode       = nodeQueue.Dequeue();
                var currentGameObject = gameObjectQueue.Dequeue();

                foreach (Node childNode in currentNode.GetChildren())
                {
                    nodeQueue.Enqueue(childNode);
                    var childGO = RenderToGameObject(childNode);
                    childGO.transform.SetParent(currentGameObject.transform, false);
                    gameObjectQueue.Enqueue(childGO);
                }

                yield return(null);
            }

            NodeReferenceMap.UpdateObjectReferences();
        }
예제 #7
0
 public NodeWidget(Widget widget)
 {
     ID         = widget.GetInstanceID();
     InstanceID = widget.InstanceID;
     NodeReferenceMap.AddReference(widget, this);
 }