OnTriggerStay2D производительность / альтернативы - PullRequest
0 голосов
/ 02 марта 2020

У моих врагов есть простой скрипт «OnTouch», который отбрасывает игрока назад, если он вступает в контакт. Затем игрок становится непобедимым на короткое время. Примерно так:

void OnTriggerEnter2D(Collider2D collider) {
    if (collider.gameObject.CompareTag("Player")) {

        if (Time.time > isInvincible) {
            isInvincible = Time.time + invincibleTimer;

            if (enemy.IsFacingRight) {
                player.SetVelocity(knockback * Vector2.right);
            } else {
                player.SetVelocity(knockback * Vector2.left);
            }
        }
    }
}

(SetVelocity - это просто метод, который я использую для установки .. скорости)

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

Использование того же кода, но внутри OnTriggerStay2D, работает как положено. Вы отталкиваетесь, go непобедимы, бежите на врага, неуязвимые иссякают, а затем вы отталкиваетесь от врага.

Но, когда несколько врагов бегают с OnTriggerStay, сталкивающимся с различными объектами, вы чувствуете как бы это было плохо с точки зрения производительности? Есть ли более эффективный способ сделать это? Или TriggerStay - это путь к go?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Несмотря на то, что у вас могут не возникнуть проблемы с производительностью, даже если у вас есть решение, которое вы используете сейчас, в будущем вы можете попробовать использовать Physics.IgnoreLayerCollision : В начале вашего invincibleTimer звонка: IgnoreLayerCollision(playerLayer, enemyLayer, true); И в конце вашего таймера: IgnoreLayerCollision(playerLayer, enemyLayer, false);
И в соответствии с документами:

IgnoreLayerCollision сбросит состояние запуска затронутых коллайдеров, поэтому вы можете получить сообщения OnTriggerExit и OnTriggerEnter в ответ на вызов этого.

Это означает, что когда вы вызываете IgnoreLayerCollision (false), OnTriggerEnter будет вызываться снова, даже если вы уже находитесь на вершине врага. Это именно то поведение, за которым вы следите.

1 голос
/ 02 марта 2020

Я обнаружил способ отслеживания столкновений вручную, например:

List<Collider2D> hitColliders = new List<Collider2D>();

void OnTriggerEnter2D(Collider2D collision) {
    if (hitColliders.Contains(collision)) { return; }
    hitColliders.Add(collision);
}
void OnTriggerExit2D(Collider2D collision) {
    hitColliders.Remove(collision);
}

// Perform operations to the colliders.
void Update() { 
    foreach (var col in hitColliders) { DoStuff(col); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...