private void OnTriggerExit(Collider other) { IGravityBallTargetable target = other.GetComponent <IGravityBallTargetable>(); if (target == null) { return; } RemoveTarget(target); }
private void RemoveTarget(IGravityBallTargetable target) { bool wasTargeted = targets.Remove(target); if (wasTargeted) { target.OnEndPull(); } targetedByOther.Remove(target); }
private void AddTarget(IGravityBallTargetable target) { if (!target.IsBeingTargeted) { targets.Add(target); target.OnBeginPull(); } else { targetedByOther.Add(target); } }
private IEnumerator PullRoutine(float delay) { if (delay > 0) { yield return(new WaitForSeconds(delay)); } GameManager.S.Audio.GravHits(audioSource); activationVfx.SetActive(true); activationVfx.transform.localScale = Vector3.one * 2 * basePullRadius; rigidbody.isKinematic = true; collider.enabled = false; //Create gravity hitbox if necessary if (gravityHitbox == null) { gravityHitbox = gameObject.AddComponent <SphereCollider>(); } gravityHitbox.enabled = true; gravityHitbox.radius = basePullRadius; gravityHitbox.isTrigger = true; //OnTriggerEnter won't detect colliders already within gravityHitbox //So, get them via Physics.OverlapSphere Collider[] initialTargets = Physics.OverlapSphere(gravityHitbox.bounds.center, gravityHitbox.bounds.extents.x); foreach (Collider initialTarget in initialTargets) { IGravityBallTargetable t = initialTarget.GetComponent <IGravityBallTargetable>(); if (t == null) { continue; } AddTarget(t); } //Pull targets in over duration for (float timePassed = 0; timePassed < baseDuration; timePassed += Time.fixedDeltaTime) { UpdateTargetedByOther(); //Remove any destroyed targets targets.ExceptWith(targets.Where(t => t.Equals(null)).ToList()); //Pull targets to center foreach (IGravityBallTargetable target in targets) { target.Pull(gravityHitbox.bounds.center, basePullSpeed); } yield return(new WaitForFixedUpdate()); } isActive = false; Destroy(gameObject); }