Ejemplo n.º 1
0
    /// <summary>
    /// Handle bullet collision with other entities
    /// </summary>
    /// <param name="collider">Colliding game object</param>
    private void OnCollision(GameObject collider)
    {
        // Only detect collisions on appropriate layers
        if (!UnityExtensions.LayerContains(CollisionMask, collider.layer))
        {
            return;
        }

        // Apply damage to collider if appropriate
        Damageable damageableObject = collider.GetComponent <Damageable>();

        if (damageableObject != null)
        {
            damageableObject.TakeDamage(Data.Damage, gameObject);
        }

        // TODO: Does this logic belong in Damageable component?
        // Enemies react differently to being hit
        Enemy enemy = collider.GetComponent <Enemy>();

        if (enemy == null)
        {
            if (Data.HitEffect != null)
            {
                // Use collider material for hit effect
                Material collidingMaterial = collider.GetComponent <Renderer>().material;
                Data.HitEffect.GetComponent <Renderer>().material = collidingMaterial;

                Instantiate(Data.HitEffect, transform.position, Quaternion.identity, TemporaryManager.Instance.TemporaryChildren);
            }

            // QUESTION: Should audio be moved to hit object (in "Hit-able" component)?
            AudioManager.Instance.PlayEffect(Data.HitSound, transform.position);
        }
        else
        {
            if (enemy.Damageable.DamageEffect != null)
            {
                // Use collider material for hit effect
                Material collidingMaterial = collider.GetComponent <Renderer>().material;
                enemy.Damageable.DamageEffect.GetComponent <Renderer>().material = collidingMaterial;

                Instantiate(enemy.Damageable.DamageEffect, transform.position, Quaternion.identity, TemporaryManager.Instance.TemporaryChildren);
            }

            AudioManager.Instance.PlayEffect(enemy.Damageable.DamageSound, transform.position);
        }

        Destroy(gameObject);
    }