Make Player take damage when he collides with the bullet (RigidBody)

Hello!

I am currently a beginner in unity C# programming and i actually have an issue.
I want to make a program that damages the player when my Enemy AI shoots him.
So i made with some tutorials those 2 programs.

First one, The enemy script :

using UnityEngine;
using UnityEngine.AI;

public class EnemyAi : MonoBehaviour
{
    public NavMeshAgent agent;

    public Transform player;

    public LayerMask whatIsGround, whatIsPlayer;

    public int damage = 10;



    //Patroling
    public Vector3 walkPoint;
    bool walkPointSet;
    public float walkPointRange;

    //Attacking
    public float timeBetweenAttacks;
    bool alreadyAttacked;
    public GameObject projectile;

    //States
    public float sightRange, attackRange;
    public bool playerInSightRange, playerInAttackRange;

    private void Awake()
    {
        player = GameObject.Find("Player").transform;
        agent = GetComponent<NavMeshAgent>();
    }

    private void Update()
    {
        //Check for sight and attack range
        playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);
        playerInAttackRange = Physics.CheckSphere(transform.position, attackRange, whatIsPlayer);

        if (!playerInSightRange && !playerInAttackRange) Patroling();
        if (playerInSightRange && !playerInAttackRange) ChasePlayer();
        if (playerInAttackRange && playerInSightRange) AttackPlayer();
    }

    private void Patroling()
    {
        if (!walkPointSet) SearchWalkPoint();

        if (walkPointSet)
            agent.SetDestination(walkPoint);

        Vector3 distanceToWalkPoint = transform.position - walkPoint;

        //Walkpoint reached
        if (distanceToWalkPoint.magnitude < 1f)
            walkPointSet = false;
    }
    private void SearchWalkPoint()
    {
        //Calculate random point in range
        float randomZ = Random.Range(-walkPointRange, walkPointRange);
        float randomX = Random.Range(-walkPointRange, walkPointRange);

        walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);

        if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
            walkPointSet = true;
    }

    private void ChasePlayer()
    {
        agent.SetDestination(player.position);
    }

    private void AttackPlayer()
    {
        //Make sure enemy doesn't move
        agent.SetDestination(transform.position);

        transform.LookAt(player);

        if (!alreadyAttacked)
        {
            ///Attack code here
            Rigidbody rb = Instantiate(projectile, transform.position, Quaternion.identity).GetComponent<Rigidbody>();
            rb.AddForce(transform.forward * 32f, ForceMode.Impulse);
            rb.AddForce(transform.up * 8f, ForceMode.Impulse);
             ///End of attack code

             alreadyAttacked = true;
            Invoke(nameof(ResetAttack), timeBetweenAttacks);
        }
    }
    private void ResetAttack()
    {
        alreadyAttacked = false;
    }


    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, attackRange);
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, sightRange);
    }
}

And the second one for the player health:

sing System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerHealth : MonoBehaviour
{
    public int maxHealth = 100;
    public int currentHealth;

    public HealthBar healthBar;

    void Start()
    {
        currentHealth = maxHealth;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.H))             // This is just a test
        {
            TakeDamage(5);
        }
    }

    public void TakeDamage(int damage)               //The damage function
    {
        currentHealth -= damage;

        healthBar.SetHealth(currentHealth);
    }
}

Actually my enemy throws a projectile that have a rigidbody, and i want that when it collides with the player, he takes damage. But it does not work when I use OnCollisionEnter. Can you please help me? (Sorry if there is English language errors, im French;))

Thanks for the help!:smile:

We know OnCollisionEnter() works, so go review the documentation, paying attention to the technical requirements for OnCollisionEnter() to be called.

Remember the limitations of a discrete physics simulation. If your bullet moves very fast, it may pass through other items. You can set different collision modes on the Rigidbody to help address this.

1 Like

Hello!
Thanks a LOT for your awnser,
I know for the discrete physics simulation. I already changed it.
I forgot to precise that the OnCollisionEnter() works when i add a Box Collider to the Bullet and the Player, but i need to change a lot of things and there is a lot of bugs like the bullet path for example.

It doesn’t show any error when i don’t add the Box Collider, but the script don’t detect the collision.

I think i will check carefully the entire documentation like you said.
Thanks!!