Как прекратить движение объекта после его столкновения с коллайдером другого объекта?

Как изменить скрипт, чтобы при соприкосновении коллайдера персонажа с коллайдером препятствия, препятствие останавливалось на месте? Вот примерный код, который я использую в данный момент.
```
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class Map : MonoBehaviour
{
    public float speed;
    
    void Update()
    {
        transform.Translate(Vector2.left * speed * Time.deltaTime); //Движение объекта
    }
    
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "player")                             //Соприкосновение с препятствием
        {
            speed = 0;  // Останавливаем движение объекта
        }
    }
}
```
  • 16 сентября 2023 г. 14:46
Ответы на вопрос 2
Чтобы прекратить движение объекта после его столкновения с коллайдером другого объекта, достаточно установить переменную `speed` равной 0. В вашем примере это уже реализовано внутри метода `OnTriggerEnter2D`. Если ваш объект не останавливается после столкновения, убедитесь в следующем:

1. Убедитесь, что скрипт `Map` присоединен к объекту, на который наложен коллайдер, и что этот объект имеет тег `"player"`.

2. Убедитесь, что другой объект имеет коллайдер, с которым может столкнуться ваш объект. Проверьте, правильно ли установлены теги и слои (<i>layers</i>) для обоих объектов.

3. Убедитесь, что скрипт `Map` активен в момент столкновения. Может быть, в какой-то момент активности скрипта `Map` установлено значение `speed` равное 0.

Если все указанные выше пункты проверены и правильно настроены, объект должен прекратить движение после столкновения с коллайдером другого объекта.
OnTriggerEnter2D() is called once when colliding with a trigger, while Update() is called every frame. In your code, upon collision, you stop the movement of your obstacle once and immediately start it again in Update(). Instead, you can simply set the velocity to 0 upon collision. Also, it's better to compare tags using CompareTag() instead of using the "==" operator. Both methods will work, but it's better to learn to do it correctly from the beginning (it will positively impact code execution speed). Additionally, note that if you are using Unity's standard tags, the player tag is "Player" (with a capital "P"). It's important to use the correct case, as if the object has the "Player" tag and you compare it with "player", the code won't work. Here's an example code:

public class Map : MonoBehaviour
{
    public float speed;

    void Update()
    {
        transform.Translate(Vector2.left * (speed * Time.deltaTime)); // Object movement
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            speed = 0;
        }
    }
}
Похожие вопросы