Двойная проверка на тег в одном OnTriggerStay2D

Я сделал проверку два раза. первый паз:

 if (other.CompareTag("StandartCircle"))
        {
            animatorr.SetBool("change", true);
            player.AddForce(new Vector2(0f, 500f));
        }

второй раз

if (other.CompareTag("SecondCircle"))
        {
            player.AddForce(new Vector2(100f, 100f));
        }

в одном private void OnTriggerStay2D(Collider2D other), но я так понял что так нельзя делать, так как этот код не работает. Так ли это?


Ответы (2 шт):

Автор решения: KOTlK

Так нельзя делать не потому что в OnTriggerStay нельзя делать несколько проверок, а потому, что это проверка по строковому литералу(по строке). А человеку свойственно ошибаться, поэтому ты можешь ввести слово с ошибкой и искать потом причину сыплющихся ошибок. Твой код, скорее всего и не работает потому, что ты где-то сделал ошибку в строке.

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

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

public interface ICircle
{
    float SpeedMultiplier { get; }
}

public class StandartCircle : ICircle
{
    public float SpeedMultiplier { get; private set; } = 1f;
}

public class SecondCircle : ICircle
{
    public float SpeedMultiplier { get; private set; } = 1.5f;
}

Интерфейс ICircle содержит в себе свойство SpeedMultiplier. Классы StandartCircle и SecondCircle реализуют этот интерфейс и устанавливают свое значение множителя скорости.

[RequireComponent(typeof(Rigidbody2D))]
public class Player : MonoBehaviour
{
    [SerializeField] private float _jumpSpeed;

    private Rigidbody2D _rb;

    private void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.TryGetComponent(out ICircle circle))
        {
            Jump(circle.SpeedMultiplier);
        }
    }

    private void Jump(float speedMultiplier)
    {
        var velocity = _rb.velocity;
        velocity.y = _jumpSpeed * speedMultiplier;
        _rb.velocity = velocity;
    }

}

Компонент Player содержит метод Jump, который, в зависимости от множителя, толкает объект вверх. В OnTriggerEnter получаем интерфейс через TryGetComponent(вернет false, если ни один из компонентов на объекте, вошедшем в триггер, не реализует этот интерфейс) и прыгаем.

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

→ Ссылка
Автор решения: Alemkhan Utepkaliev

Можно искать любое количество тегов, выполнение условий будет проверяться на каждом Коллайдере кто будет в нём находится, в случае OnTriggerStay(). Код не работает возможно из за отсутствия в нём нужных Вам тегов, попробуй выполнить отладку через:

Debug.Log("GameObject with tag:" + other.gameObject.tag)

И посмотреть какие теги выходят в консоле, и смотреть на состояние игры в окне Game/Scene, тогда Вы сможете понять в чём проблема, и какой тег выходит у какого обьекта

→ Ссылка