У меня проблемы с использованием этой функции, чтобы снизить урон врагов в моей игре - PullRequest
0 голосов
/ 04 февраля 2020

Итак, я сделал функцию для хранения того, что происходит, когда пуля сталкивается с врагом.

public void Hit(Collider other, bool enemyInstanceTag, int enemyLife, int enemyKillPoint)
{
    if (other.gameObject.CompareTag("PistolBullet") && enemyInstanceTag)
    {
        enemyLife -= player.damage;
        player.score += enemyKillPoint;
        Destroy(other.gameObject);
    }
}

Когда я пытаюсь использовать это:

private void OnTriggerEnter(Collider other)
    {
        Hit(other, gameObject.CompareTag("ERunner"), enemyRunner.life, enemyRunner.killPoint);
    }

В каждом попадании восстановление здоровья до полного здоровья. Воображение здоровья врага - 2, когда я бью его, оно понижается до 1, но при следующем ударе начинается снова через 2.

Но если я выполню это, здоровье будет работать нормально:

private void OnTriggerEnter(Collider other)
{

    if (other.gameObject.CompareTag("PistolBullet") && gameObject.CompareTag("ERunner"))
    {
        enemyRunner.life -= player.damage;
        player.score += enemyRunner.killPoint;
        Destroy(other.gameObject);
    }
}

Дело в том, что у меня несколько врагов, и я не хочу повторять одни и те же строки кода, поэтому я хочу создать функцию.

Спасибо заранее.

1 Ответ

3 голосов
/ 04 февраля 2020

Ints передаются по значению, поэтому параметр врага является временной копией. Измените все, что вы хотите, но как только вы не измените объект врага жизни, вы измените копию.

Исправлено: передача вражеского объекта. То есть, если вы манипулируете объектом, изменения будут постоянными.

Итак, enemy.life -= player.damage должен сделать свое дело.

РЕДАКТИРОВАТЬ:

Изменить вызов с:

private void OnTriggerEnter(Collider other)
    {
        Hit(other, gameObject.CompareTag("ERunner"), enemyRunner.life, enemyRunner.killPoint);
    }

на

private void OnTriggerEnter(Collider other)
    {
        Hit(other, gameObject.CompareTag("ERunner"), enemyRunner );
    }

Затем измените метод HIT на

public void Hit(Collider other, bool enemyInstanceTag, [Enemy Type or Interface] enemy)
{
    if (other.gameObject.CompareTag("PistolBullet") && enemyInstanceTag)
    {
        enemy.life -= player.damage;
        player.score += enemy.KillPoint;
        Destroy(other.gameObject);
    }
}

Я не могу определить тип врага по опубликованному коду, поэтому Я поместил там [Тип врага или Интерфейс]

Дальнейшее редактирование - Как заставить это работать для всех типов врагов:

Создать интерфейс

public interface iHittable{
    public int DoDamage(int damage)
}

Сейчас у всех ваших врагов будет

public Class TieFighter : iHittable{
// lots of code

// important bit

public int DoDamage(int damage) // from iHittable
{
   this.life -= damage;
   return this.PointsForDamage;  //  could be another method that calculates points, or a field if points are constant.  
}
}

Теперь мы также можем сделать:

public Class UssEnterprise : iHittable{
{
    public int DoDamage(int damage) // from iHittable
    {
        if (sheildLevel > 0)
        {
            sheildLevel -= damage;
            return 0;
        } 
        else
        {
            life -= damage;
            return PointsForDamage; 
       } 
    }
} 

Итак, предположим, что наш враг-Раннер - TieFighter. Вызов по-прежнему будет:

    Hit(other, gameObject.CompareTag("ERunner"), enemyRunner );

И наш метод будет:

public void Hit(Collider other, bool enemyInstanceTag, iHittable enemy)
{
    if (other.gameObject.CompareTag("PistolBullet") && enemyInstanceTag)
    {

        player.score += enemy.DoDamage(player.damage);
        Destroy(other.gameObject);
    }
}

Хитрость в том, что объекты могут быть разных типов и в зависимости от того, какой тип мы называем их, мы можем зависеть от них, чтобы обеспечить различные методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...