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); }
/// <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); }