Двойная проверка на тег в одном 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 шт):
Так нельзя делать не потому что в 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, если ни один из компонентов на объекте, вошедшем в триггер, не реализует этот интерфейс) и прыгаем.
Вместо интерфейса это может быть абстрактный класс, в случае, если у кругов есть какая-то общая логика, которая для всех одна и та же и никак не должна быть изменена.
Можно искать любое количество тегов, выполнение условий будет проверяться на каждом Коллайдере кто будет в нём находится, в случае OnTriggerStay(). Код не работает возможно из за отсутствия в нём нужных Вам тегов, попробуй выполнить отладку через:
Debug.Log("GameObject with tag:" + other.gameObject.tag)
И посмотреть какие теги выходят в консоле, и смотреть на состояние игры в окне Game/Scene, тогда Вы сможете понять в чём проблема, и какой тег выходит у какого обьекта