Игрок атакует другого игрока, оба получают урон, так как оба сталкиваются - PullRequest
2 голосов
/ 02 февраля 2020

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

public void TakeDamage(float amount)
{
    health -= amount;
    healthbar.fillAmount = health / starthealth;


    if (health <= 0)
    {
        gameObject.SetActive(false);
    }

}

public void OnCollisionEnter(Collision collision)
{
    if (collision.collider.gameObject.tag == "player") 
    {
        collision.gameObject.GetComponent<playerScript> ().TakeDamage (damage);

    }
}

Это то, что нужно похоже на урон и столкновение, враг сталкивается со мной и использует метод получения урона из скрипта игрока

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Я думаю, вам нужно будет различать Hitboxes и Hurtboxes . ( Хорошая статья об этом здесь )

Тогда, когда Hitbox сталкивается с Hurtbox, только персонаж Hurtbox получает урон.

Метод того, как справиться с этим, зависит от над какой игрой вы работаете. В игре типа «ближний бой», вероятно, использовались бы разные компоненты коллайдера, чтобы различать Hitbox и Hurtbox.

Еще один более сложный сценарий - это игра типа «автокатастрофа», когда машины получают повреждения при столкновении друг с другом. Поскольку Hitbox и Hurtbox на автомобиле в основном одинаковы, вам потребуется дополнительная логика c, чтобы определить, какой машине наносится урон.

Я мог бы подумать о том, какой урон наносит другой автомобиль. зависеть от скорости автомобиля во время боя sh и фактического направления движения автомобиля.

Поэтому, когда Игрок 1 атакует / врезается в Игрока 2, только Игрок 2 получает урон, так как Игрок 2 либо не имели какой-либо скорости, либо не двигались в направлении игрока 1.

С такой игровой логикой c вы чаще всего можете покрывать все различные крайние случаи получения урона и назначьте правильное количество урона каждому игроку.

0 голосов
/ 03 февраля 2020

Если оба ваших объекта также имеют компоненты твердого тела, то вы можете проверить обе их предыдущие скорости и назначить повреждение тому с более низкой скоростью. Я понимаю, что это то, что вы имеете в виду концептуально с вашим набивочным описанием. Чтобы убедиться, что скорость до столкновения используется (а не скорость, уже разрешенная после столкновения), вы можете сохранить столкновение в функции FixedUpdate. Итак, вы получите (предполагая, что класс Player, прикрепленный к обоим объектам, использует ваш термин):

using UnityEngine;

public class Player : MonoBehaviour
{
    Vector3 velocityBeforeCollisions = Vector3.zero;
    Rigidbody body = null;
    float health = 1f;

    void Start()
    {
        body = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        velocityBeforeCollisions = body.velocity;
    }

    public float GetSpeed()
    {
        return velocityBeforeCollisions.magnitude;
    }

    void OnCollisionEnter(Collision collision)
    {
        Player otherPlayer = collision.gameObject.GetComponent<Player>();
        if (otherPlayer != null && otherPlayer.GetSpeed() > GetSpeed())
        {
            Damage();
        }
    }

    public void Damage()
    {
        Debug.Log(name + " damaged");
        health -= 0.1f;
    }

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