Не могу разобраться со скриптом управления игроком
При соприкосновении с барьером, механика работает нормально, но если игрок соприкасается с любым другим объектом, игрок начинает медленно улетать после соприкосновения. вот как это выглядит
Управление игрока осуществляется при помощи двух скриптов: Первый скрипт - это само движение персонажа
using UnityEngine;
using UnityEngine.EventSystems;
public class RotationManager : MonoBehaviour, IBeginDragHandler, IDragHandler
{
public bool _isCollision = true;
[SerializeField] private GameObject _player;
private Rigidbody2D _rigidbody2d;
[SerializeField] private int speed;
private void Start() {
_rigidbody2d = _player.GetComponent<Rigidbody2D>();
}
public void OnBeginDrag(PointerEventData eventData) {
if(_isCollision == true) {
if(Mathf.Abs(eventData.delta.x) > Mathf.Abs(eventData.delta.y)) {
if(eventData.delta.x > 0) {
_rigidbody2d.AddForce(Vector2.right * speed);
_player.GetComponent<PlayerController>()._rotate = 0;
_isCollision = false;
}
else {
_rigidbody2d.AddForce(Vector2.left * speed);
_player.GetComponent<PlayerController>()._rotate = 0;
_isCollision = false;
}
}
else {
if(eventData.delta.y > 0) {
_rigidbody2d.AddForce(Vector2.up * speed);
_player.GetComponent<PlayerController>()._rotate = 1;
_isCollision = false;
}
else {
_rigidbody2d.AddForce(Vector2.down * speed);
_player.GetComponent<PlayerController>()._rotate = 1;
_isCollision = false;
}
}
}
}
public void OnDrag(PointerEventData eventData) {
}
}
Второй скрипт - это возвращение в центр клетки, после соприкосновения с объектом
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private GameObject _panel;
[SerializeField] private float _speed;
private Animator _animator;
private Vector3 _target;
public int _rotate;
private void Start() {
_animator = GetComponent<Animator>();
}
private void OnCollisionEnter2D(Collision2D other) {
if(_rotate == 0) { // Игрок двигается по оси X
if(transform.position.x * -1 < 0) // Если текущее положение персонажа больше нуля
_target = new Vector3(Mathf.Round(transform.position.x - 0.1f) * 1.0f, transform.position.y, 0f); // Округляет положение Игрока, чтобы получить координаты центра текущей клетки
else
_target = new Vector3(Mathf.Round(transform.position.x + 0.1f) * 1.0f, transform.position.y, 0f);
}
if(_rotate == 1) { // Игрок двигается по оси Y
if(transform.position.y * -1 < 0)
_target = new Vector3(transform.position.x, Mathf.Round(transform.position.y - 0.1f) * 1.0f, 0f);
else
_target = new Vector3(transform.position.x, Mathf.Round(transform.position.y + 0.1f) * 1.0f, 0f);
}
_panel.GetComponent<RotationManager>()._isCollision = true; //Останавливает движение при соприкосновении с объектом
transform.position = Vector3.MoveTowards(transform.position, _target, _speed);
}
}