public override void HandleCollision(Collider collider, Collision collision)
    {
        if (shootInstigator == collider.gameObject)
        {
            return;
        }

        GameObject hitObject = collider.gameObject;

        DamageableEntity hitDamageableEntity = hitObject.GetComponent <DamageableEntity>();

        if (hitDamageableEntity)
        {
            if (hitDamageableEntity.GetDamageTag != damageTag && damageTag != DamageTag.Environment)
            {
                hitDamageableEntity.ReceiveDamage(projectileDamages, gameObject);
            }
        }
        else
        {
            AudioManager.PlaySound(defaultDestroySound);
        }

        DestroyProjectile();
    }
Пример #2
0
    public void HandleCollision(RaycastHit hit, Vector3 initialMovementDirection)
    {
        InterruptTrajectory();
        DemandeFx(hit.point);

        if (hit.collider.gameObject.layer == 12)
        {
            SoundManager.Instance.PlaySound(Sound.ShieldGetHit, hit.transform.position);
            FxManager.Instance.CreateFx(FxType.genericImpact, hit.point);
        }
        else if (hit.collider.gameObject.layer == 14)
        {
            SoundManager.Instance.PlaySound(Sound.WallGetHit, hit.transform.position);
            FxManager.Instance.CreateFx(FxType.genericImpact, hit.point);
        }

        Vector3 horizontalNormal = hit.normal;

        horizontalNormal.y = 0;
        horizontalNormal.Normalize();

        // Place disc as close from the hit point as possible
        Vector3 newPos = hit.point + horizontalNormal * (myCollider.radius + 0.01f);

        newPos.y           = 0;
        transform.position = newPos;

        // Gives the disc a knockback to simulate a rebound
        Vector3 reflectedDirection = Vector3.Reflect(initialMovementDirection, horizontalNormal);

        knockbackSystem.ReceiveKnockback(DamageTag.Environment, GetReboundOnObjectKnockback(), reflectedDirection);

        DamageableEntity hitDamageableEntity = hit.collider.GetComponent <DamageableEntity>();

        if (hitDamageableEntity != null)
        {
            hitDamageableEntity.ReceiveDamage(damageTag, new DamagesParameters(currentDamagesAmount, numberOfStunedTurns));

            lastObjTouch = hitDamageableEntity.gameObject;
            SoundManager.Instance.PlaySound(Sound.EnemyDamaged, hitDamageableEntity.transform.position);
        }

        if (effectZoneToInstantiateOnHit != EffectZoneType.None)
        {
            EffectZone newEffectZone = EffectZonesManager.Instance.GetEffectZoneFromPool(effectZoneToInstantiateOnHit);
            newEffectZone.StartZone(GetColliderCenter);

            if (destroyOnHit)
            {
                DiscManager.Instance.DestroyDisc(this);
            }
        }
    }
Пример #3
0
    /// <summary>
    /// Returns true if something was hit, and therefore the movement needs to stop
    /// </summary>
    /// <param name="startPosition"></param>
    /// <param name="endPos"></param>
    /// <returns></returns>
    public bool TryToMoveFromTo(Vector3 startPosition, Vector3 endPos)
    {
        Vector3 direction = endPos - startPosition;
        float   distance  = direction.magnitude;

        direction.Normalize();

        startPosition += myCollider.center;
        endPos        += myCollider.center;

        RaycastHit hit = new RaycastHit();

        if (Physics.SphereCast(startPosition, myCollider.radius, direction, out hit, distance, GetTrajectoryCheckLayerMask))
        {
            if (hit.collider.gameObject.layer != 10 || blockedByEnemies)
            {
                // test bouclier
                if (hit.collider.gameObject.layer == 12)
                {
                    Transform hitParent = hit.transform.parent;
                    if (hitParent != null)
                    {
                        ShieldManager objShielManager = hit.transform.parent.GetComponent <ShieldManager>();

                        if (objShielManager != null)
                        {
                            if (objShielManager.myObjParent == lastObjTouch)
                            {
                                return(false);
                            }
                        }
                    }
                }

                HandleCollision(hit, direction);

                return(true);
            }
            else
            {
                DamageableEntity hitDamageableEntity = hit.collider.GetComponent <DamageableEntity>();
                if (hitDamageableEntity != null)
                {
                    hitDamageableEntity.ReceiveDamage(damageTag, new DamagesParameters(currentDamagesAmount, numberOfStunedTurns));

                    lastObjTouch = hitDamageableEntity.gameObject;
                }
            }
        }

        return(false);
    }
    public override void HandleCollision(Collider collider, Collision collision)
    {
        GameObject hitObject = collider.gameObject;

        if (shootInstigator == hitObject)
        {
            return;
        }

        bool mustDestroy          = false;
        bool preventDestroyOnWall = false;

        ProjectileBase hitProjectile = hitObject.GetComponent <ProjectileBase>();

        if (hitProjectile)
        {
            preventDestroyOnWall = true;
        }

        if (!preventDestroyOnWall && collision != null)
        {
            Vector3        averageNormal = Vector3.zero;
            ContactPoint[] points        = collision.contacts;
            foreach (ContactPoint point in points)
            {
                averageNormal += point.normal;
            }
            averageNormal /= points.Length;

            if (Mathf.Abs(Vector3.Dot(averageNormal, Vector3.up)) < 0.5f)
            {
                mustDestroy = true;
            }
        }

        DamageableEntity hitDamageableEntity = hitObject.GetComponent <DamageableEntity>();

        if (hitDamageableEntity)
        {
            if (hitDamageableEntity.GetDamageTag != damageTag && damageTag != DamageTag.Environment)
            {
                hitDamageableEntity.ReceiveDamage(projectileDamages, gameObject);
            }

            mustDestroy = true;
        }

        if (mustDestroy)
        {
            DestroyProjectile();
        }
    }
Пример #5
0
    void CollisionAttack()
    {
        List <GameObject> _objsTouched = GetListOfObjsTouched();

        foreach (GameObject _obj in _objsTouched)
        {
            DamageableEntity hitDamageableEntity = _obj.GetComponent <DamageableEntity>();
            if (hitDamageableEntity != null && hitDamageableEntity.gameObject != player)
            {
                hitDamageableEntity.ReceiveDamage(DamageTag.Enemy, new DamagesParameters(damage));
            }
        }
    }
Пример #6
0
    public void CastEffectZone()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.position, currentRadius, effectMask);
        foreach (Collider hitCollider in hitColliders)
        {
            if (alreadyHitColliders.Contains(hitCollider))
            {
                continue;
            }

            alreadyHitColliders.Add(hitCollider);

            if (damaging)
            {
                DamageableEntity hitDamageable = hitCollider.GetComponent <DamageableEntity>();
                if (hitDamageable != null)
                {
                    hitDamageable.ReceiveDamage(sourceTag, new DamagesParameters(damageAmount, numberOfStunedTurns));
                }
            }

            if (knockbacking)
            {
                KnockbackableEntity hitKnockable = hitCollider.GetComponent <KnockbackableEntity>();
                if (hitKnockable != null)
                {
                    Vector3 hitPosition        = hitCollider.transform.position;
                    Vector3 knockbackDirection = hitCollider.transform.position - transform.position;
                    knockbackDirection.y = 0;
                    knockbackDirection.Normalize();

                    hitKnockable.ReceiveKnockback(sourceTag, GetKnockbackParametersWithDistance(hitPosition), knockbackDirection);
                }
            }
        }
    }