Example #1
0
    protected override IEnumerator PerformAction()
    {
        GameObject explosion = Instantiate(explosionPrefab);

        explosion.transform.position = actor.transform.position;

        float adjOuterRadius = outerRadius * actor.AbilityRangeMultiplier.Current;

        Collider[] colliders = Physics.OverlapSphere(actor.transform.position, adjOuterRadius);
        foreach (Collider coll in colliders)
        {
            Vector3 delta = coll.transform.position - actor.transform.position;
            float   dist  = delta.magnitude;
            float   t     = Mathf.Clamp01((dist - innerRadius) / (adjOuterRadius - innerRadius));
            float   power = powerCurve.Evaluate(t);//Mathf.Clamp01((dist - innerRadius) / (adjOuterRadius - innerRadius));


            Rigidbody rb     = coll.GetComponentInParent <Rigidbody>();
            Unit      target = coll.GetComponentInParent <Unit>();
            if (rb != null && target != actor)
            {
                Vector3 force = delta.normalized * (power * (innerForce - outerForce) + outerForce);
                if (target != null)
                {
                    UnitMovement movement = target.GetComponent <UnitMovement>();
                    movement.AddForce(actor, force);
                }
                else
                {
                    rb.AddForce(force);
                }
            }

            Health health = coll.GetComponentInParent <Health>();
            if (health != null && target != actor)
            {
                float      damageAmount = power * (innerDamage - outerDamage) + outerDamage;
                DamageInfo damageInfo   = new DamageInfo(this, damageAmount, damageType);
                health.Damage(damageInfo);
            }
        }

        DamageInfo selfDamageInfo = new DamageInfo(this, selfDamage, damageType);

        actor.Health.Damage(selfDamageInfo);
        yield break;
    }
Example #2
0
    protected override IEnumerator PerformAction()
    {
        Transform origin = actor.transform;
        Meteor    meteor = Instantiate <Meteor>(meteorPrefab);

        meteor.RollDamage.DamageSource = this;

        // fall
        Vector3 fallStart = origin.position + meteorFallOffset;
        Vector3 fallEnd   = origin.position + direction * meteorFallTargetOffset + Vector3.up * meteorRadius;
        float   fallTime  = 0;

        while (fallTime < fallDuration)
        {
            float t = Mathf.Clamp01(fallTime / fallDuration);

            meteor.transform.position  = Vector3.Lerp(fallStart, fallEnd, t);
            meteor.transform.rotation *= Quaternion.AngleAxis(Time.deltaTime * rotationalSpeed, meteor.transform.right);

            yield return(new WaitForEndOfFrame());

            fallTime += Time.deltaTime;
        }
        meteor.transform.position = fallEnd;

        // impact
        if (impactVfxPrefab != null)
        {
            GameObject impactVfx = Instantiate <GameObject>(impactVfxPrefab);
            impactVfx.transform.position = fallEnd;
        }
        Collider[]    colliders = Physics.OverlapSphere(fallEnd, impactRange);
        List <Health> impacted  = new List <Collider>(colliders)
                                  .ConvertAll <Health>(c => c.GetComponentInParent <Health>())
                                  .FindAll(h => h != null && h != (actor.Health as Health));

        foreach (Health impactedHealth in impacted)
        {
            impactDamage.DoDamage(impactedHealth);
        }
        List <Rigidbody> impactedRbs = new List <Collider>(colliders)
                                       .ConvertAll <Rigidbody>(c => c.GetComponentInParent <Rigidbody>())
                                       .FindAll(rb => rb != null && rb != actor.GetComponent <Rigidbody>());

        foreach (Rigidbody impactedRb in impactedRbs)
        {
            UnitMovement movement = impactedRb.GetComponent <UnitMovement>();
            Vector3      force    = impactForce * (impactedRb.position - fallEnd).normalized;
            if (movement != null)
            {
                movement.AddForce(actor, force);
            }
            else
            {
                impactedRb.AddForce(force);
            }
        }

        // roll
        float   adjRollDuration = rollDuration * actor.AbilityRangeMultiplier.Current;
        Vector3 rollStart       = fallEnd;
        Vector3 rollEnd         = rollStart + direction * adjRollDuration * rollSpeed;
        float   rollTime        = 0;

        while (rollTime < adjRollDuration)
        {
            float t = Mathf.Clamp01(rollTime / adjRollDuration);

            Vector3 pos = Vector3.Lerp(rollStart, rollEnd, t);
            Vector3 mapPos, normal;
            map.GetMapPointFromWorldPoint(pos, out mapPos, out normal); // hug map floor
            meteor.transform.position  = mapPos + normal * meteorRadius;
            meteor.transform.rotation *= Quaternion.AngleAxis(Time.deltaTime * rotationalSpeed, meteor.transform.right);

            yield return(new WaitForEndOfFrame());

            rollTime += Time.deltaTime;
        }

        Destroy(meteor.gameObject);

        yield break;
    }