NAZYuy
@NAZYuy
Начинаю изучать Unity + C#

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

В данный момент создаю игру похожую на flappy bird и столкнулся с такой проблемой. Я хочу чтобы после соприкосновения коллайдера персонажа с коллайдером препятствия, оно останавливалось на месте.
Скрипт прилагаю -
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")                             //Соприкосновение с препятствием
        {
            transform.Translate(Vector2.left * 0 * Time.deltaTime);
        }
    }
}
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 2
@devmikhalev
OnTriggerEnter2D вызывается один раз, при столкновении с триггером, когда как Update вызывается каждый кадр.
Таким образом согласно Вашему коду при столкновении Вы один раз останавливаете движение Вашего препятствия, после чего тут же снова запускаете его в Update. Можно просто при столкновении установить скорость = 0.

Также вместо сравнения с помощью оператора "==" лучше сравнивать тег с помощью CompareTag(). Работать будет и так и так, но лучше сразу приучать себя делать правильно (положительно повлияет на скорость выполнения кода).

И обратите внимание, что если используете стандартные теги Unity, то тег игрока там не "player", а "Player". Заглавные буквы в данном случае критичны, и если у объекта тег "Player", то при сравнении по "player" код не отработает.

Вот пример кода:

public class Map : MonoBehaviour
        {
            public float speed;
            void Update()
            {
                transform.Translate(Vector2.left * (speed * Time.deltaTime)); //Движение объекта
            }
            private void OnTriggerEnter2D(Collider2D collision)
            {
                if (collision.CompareTag("Player"))
                {
                    speed = 0;
                }
            }
        }
Ответ написан
NAZYuy
@NAZYuy Автор вопроса
Начинаю изучать Unity + C#
Попробовал сделать так -
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class Map : MonoBehaviour
{
    private bool _isAlive = true;
    public float speed;
    void Update()
    {
        if (_isAlive == true)
        {
            transform.Translate(Vector2.left * (speed * Time.deltaTime)); //Движение объекта
        }
        if (_isAlive == false) 
        {
            transform.Translate(Vector2.left * (0 * Time.deltaTime)); //Движение объекта
        }
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))                             //Соприкосновение с препятствием
        {
            _isAlive = false;
        }
    }
}

Но как будто бы IsAlive не переключается на false при столкновении
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы