Esempio n. 1
0
        public Coroutine Start(Coroutine coroutine)
        {
            if (_runningCoroutines.Contains(coroutine))
            {
                return(coroutine);
            }
            else if (_pausedCoroutines.Contains(coroutine))
            {
                coroutine.Resume();
                return(coroutine);
            }

            _runningCoroutines.Add(coroutine);
            return(coroutine);
        }
Esempio n. 2
0
        /// <summary>
        /// Adds a Transform as a child.
        /// A transform can already be a child from another parent, in that case the parent will be properly changed without side-effects (ie. triggering unwanted events from the same scene).
        /// </summary>
        /// <param name="transform">A transform to be added as a new child.</param>
        /// <param name="changeScene">Signalizes that transform.Entity.Scene can be changed to match parent Scene.</param>
        /// <param name="force">Indicates that scene change can be forced if necessary. When adding a child that already belongs to a Scene and the intention is to match the parent Scene.</param>
        public void AddChild(Transform transform, bool changeScene = true, bool force = false)
        {
            if (transform == this ||
                IsDetached || Entity.IsWiped ||
                transform.IsDetached || transform.Entity.IsWiped ||
                _children.Contains(transform))
            {
                return;
            }

            if (changeScene)
            {
                if (transform.Parent != null)
                {
                    if (transform.Entity.IsSceneFromTransformAncestor)
                    {
                        if (transform.Scene != Scene && transform.Scene != null)
                        {
                            transform.Entity.SceneRemoved(allowWipe: false);
                            transform.Entity.IsSceneFromTransformAncestor = false;
                        }
                    }
                    else if (force)
                    {
                        if (transform.Scene != Scene && transform.Scene != null)
                        {
                            transform.Scene.RemoveEntity(transform.Entity, wipe: false);
                        }
                    }

                    transform.OnParentRemoved();

                    transform.Parent._children.Remove(transform);
                    transform.Parent.OnChildRemoved(transform);
                }

                if (transform.Scene == null)
                {
                    if (Scene != null)
                    {
                        transform.Entity.SceneAdded(Scene);

                        if (Scene.HasStarted && !transform.Entity.HasStarted)
                        {
                            transform.Entity.Start();
                        }
                    }

                    transform.Entity.IsSceneFromTransformAncestor = true;
                }
                else if (force)
                {
                    if (transform.Scene != Scene)
                    {
                        transform.Scene.RemoveEntity(transform.Entity, wipe: false);

                        if (Scene != null)
                        {
                            transform.Entity.SceneAdded(Scene);

                            if (Scene.HasStarted && !transform.Entity.HasStarted)
                            {
                                transform.Entity.Start();
                            }
                        }
                    }

                    transform.Entity.IsSceneFromTransformAncestor = true;
                }
            }
            else
            {
                if (transform.Parent != null)
                {
                    transform.OnParentRemoved();

                    transform.Parent._children.Remove(transform);
                    transform.Parent.OnChildRemoved(transform);
                }

                if (transform.Entity.IsSceneFromTransformAncestor)
                {
                    transform.Entity.IsSceneFromTransformAncestor = false;
                }
            }

            transform._parent = this;
            transform.OnParentAdded();

            _children.Add(transform);
            OnChildAdded(transform);
        }