@dani22023

Отклик при соприкосновении с коллайдером 2D?

У меня есть игра. Там большая линия, на которой расположено в ряд 3 фигуры. Суть в том, что по это линии "катается" прямоугольник (а именно сектор), он катается по ней слева-направо и обратно, и игроку нужно нажать на кнопку, что он остановился. Если сектор останавливается на 2й фигуре, к примеру, то он побеждает, если на других - но иное действие. Я сделал стены для этого сектора (2 пустышки с box coliders 2d), чтобы за границы не улетал, и на каждую фигуру тоже box colider 2d. У самого этого прямоугольника(сектора) Rigidbody 2D на kinematic. Я или сильно туплю, но у меня проблемы с тем, чтобы выводилось "Rectangle stopped at FirstPart" при остановке на соответствующем колайдере. Как и в условии else. Помогите пожалуйста, голову ломаю.
using UnityEngine;

public class RectangleMovement : MonoBehaviour
{
    public float speed = 1.0f;
    public LayerMask obstacleLayer;
    private bool isMovingRight = true;
    private bool isStopped = false;

    void Update()
    {
        if (isMovingRight && !isStopped)
        {
            transform.Translate(Vector2.right * speed * Time.deltaTime);
        }
        else if (!isMovingRight && !isStopped)
        {
            transform.Translate(Vector2.left * speed * Time.deltaTime);
        }

  
        RaycastHit2D hit = Physics2D.Raycast(transform.position, isMovingRight ? Vector2.right : Vector2.left, 0.1f, obstacleLayer);
        if (hit.collider != null)
        {
            isMovingRight = !isMovingRight;
            if (isStopped)
            {
                if (hit.collider.tag == "FirstPart")
                {
                    Debug.Log("Rectangle stopped at FirstPart.");
                }
                else
                {
                    Debug.Log("Rectangle stopped.");
                }
            }
        }
    }

    public void StopMovement() //кнопка
    {
        isStopped = true;
        Debug.Log("Movement stopped.");
    }
}
  • Вопрос задан
  • 46 просмотров
Решения вопроса 1
@DrRen7
using UnityEngine;
public class Player2dTest : MonoBehaviour
{
    [SerializeField] Transform _wallLeft;
    [SerializeField] Transform _wallRight;
    Vector3 _targetTransf;
    [SerializeField] float _speed = 5f;
    Collider2D _myCol;
    bool _isMove = true;
    [SerializeField]bool _isWin;
    private void Start()
    {
        _myCol= GetComponent<Collider2D>();
        _targetTransf = _wallLeft.position;
    }
    private void Update()
    {
        if (_isMove)
        {
            _myCol.transform.position = Vector2.MoveTowards(_myCol.transform.position, _targetTransf, _speed * Time.deltaTime);
            if (_myCol.transform.position == _targetTransf) NewTargetMove();
        }
        if (Input.GetKeyDown(KeyCode.Space))
        {
            EndGame();
        }
    }
    void NewTargetMove()
    {
        if (_targetTransf != _wallRight.position) _targetTransf = _wallRight.position;
        else _targetTransf = _wallLeft.position;
    }
    void EndGame()
    {
        _isMove = false;
        if (_isWin) Debug.Log("You Win");
        else Debug.Log("You Lose");

    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag=="FirstPart") _isWin = true;
    }
    private void OnTriggerExit2D(Collider2D collision)
    {
        if(_isWin)_isWin = false;
    }
}

Фото сцены и "бегающего объекта" 66284bf469039539456906.png

можно заменить триггеры на boxcast в EndGame()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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