void EjectChildren(Transform parent) { List <Transform> toEject = new List <Transform>(); foreach (Transform child in parent) { if (child.GetComponent <AttachedBall>()) { toEject.Add(child); } } //have to do two passes because we need to set parent to null //and this modifies what we're enumerating through foreach (Transform child in toEject) { GameObject ejected = PoolManager.Instance.GetPoolByRepresentative(ejectedBallPrefab).GetPooled(); Vector3 pos = child.position; Quaternion rot = child.rotation; ejected.transform.position = pos; ejected.transform.rotation = rot; ejected.GetComponent <SpriteRenderer>().sprite = child.GetComponent <SpriteRenderer>().sprite; foreach (Transform c in child) { c.parent = ejected.transform; } child.SendMessage("Destroy"); AttachedBall.AddStatusAllAttachedBalls(ejected.transform, BallStatus.EJECTED, ejected.GetComponent <SpriteRenderer>().sharedMaterial); ejected.SetActive(true); ejected.GetComponent <Rigidbody2D>().velocity = (pos - parent.position).normalized * ejectionForce; } }
public override void ApplyEffect(Transform target) { if (!(target.gameObject.layer == LayerMask.NameToLayer("Player"))) { //Debug.Log ("Delinker Ball Applying Effect - Target: " + target.GetInstanceID()); target.parent = transform; AttachedBall.AddStatusAllAttachedBalls(target, BallStatus.EJECTED, ejectedMat); } }
public void GetShocked(float duration, Material shockedMat) { if (!FlagsHelper.IsSet <BallStatus>(status, BallStatus.SHOCKED)) { GetComponent <Renderer>().sharedMaterial = shockedMat; AddStatus(BallStatus.SHOCKED, shockedMat); AttachedBall.AddStatusAllAttachedBalls(transform, BallStatus.SHOCKED, shockedMat); StartCoroutine(Timers.Countdown(duration, () => RemoveStatus(BallStatus.SHOCKED, shockedMat))); } }
public void GetFrozen(float duration, Material frozenMat) { if (!FlagsHelper.IsSet <BallStatus>(status, BallStatus.FROZEN)) { GetComponent <Renderer>().sharedMaterial = frozenMat; AddStatus(BallStatus.FROZEN, frozenMat); GetComponent <Rigidbody2D>().velocity = Vector2.zero; GetComponent <Rigidbody2D>().isKinematic = true; AttachedBall.AddStatusAllAttachedBalls(transform, BallStatus.FROZEN, frozenMat); StartCoroutine(Timers.Countdown(duration, () => { RemoveStatus(BallStatus.FROZEN, frozenMat); GetComponent <Rigidbody2D>().isKinematic = false; })); } }
public void GetGlooped(float duration, Material gloopMat) { if (!FlagsHelper.IsSet <BallStatus>(status, BallStatus.GLOOPED)) { GetComponent <Renderer>().sharedMaterial = gloopMat; AddStatus(BallStatus.GLOOPED, gloopMat); //we make copies so the delegate we create keeps its own state /* * Material oldMat = GetComponent<SpriteRenderer>().sharedMaterial; * Transform trans = transform; * GetComponent<SpriteRenderer>().sharedMaterial = gloopMaterial; * StartCoroutine(Timers.Countdown(duration,() => { * Debug.Log ("Resetting mat to " + oldMat.name + " " + oldMat.GetInstanceID()); * trans.GetComponent<SpriteRenderer>().sharedMaterial = oldMat; * })); */ AttachedBall.AddStatusAllAttachedBalls(transform, BallStatus.GLOOPED, gloopMat); StartCoroutine(Timers.Countdown(duration, () => RemoveStatus(BallStatus.GLOOPED, gloopMat))); } }