示例#1
0
    private void OnTriggerExit(Collider other)
    {
        IGravityBallTargetable target = other.GetComponent <IGravityBallTargetable>();

        if (target == null)
        {
            return;
        }
        RemoveTarget(target);
    }
示例#2
0
    private void RemoveTarget(IGravityBallTargetable target)
    {
        bool wasTargeted = targets.Remove(target);

        if (wasTargeted)
        {
            target.OnEndPull();
        }
        targetedByOther.Remove(target);
    }
示例#3
0
 private void AddTarget(IGravityBallTargetable target)
 {
     if (!target.IsBeingTargeted)
     {
         targets.Add(target);
         target.OnBeginPull();
     }
     else
     {
         targetedByOther.Add(target);
     }
 }
示例#4
0
    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);
    }