Я столкнулся с проблемой, которую не могу решить. Всякий раз, когда я перемещаю своего персонажа, если он находится у края карты, он проходит через коллайдер tilemaps и выходит за пределы карты. Вот скриншот, который я сделал:
Это нормально: текст ссылки
Вот когда возникает ошибка: ошибка
Вот код, который я использую для перемещения и отражения персонажа:
using System.Collections;
using UnityEngine;
using UnityEngine.InputSystem;
public class MovementScript : MonoBehaviour
{
Vector2 moveInput;
Animator animator;
Rigidbody2D rb;
BoxCollider2D myCollider;
PlayerStats playerStats;
float playerSpeed;
[SerializeField] float timeToWaitAfterBeingAttackedToMoveAgain = 1f;
[SerializeField] int kickbackFromEnemyAttack = 40;
void Start()
{
myCollider = GetComponent<BoxCollider2D>();
rb = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
playerStats = GetComponent<PlayerStats>();
}
void FixedUpdate()
{
playerSpeed = playerStats.GetPlayerSpeed();
if (playerStats.PlayerIsAlive())
{
Run();
FlipSprite();
}
}
//If the player goes left the sprite flips left, otherwise it flips to the right
void FlipSprite()
{
bool playerHasHorizontalSpeed = Mathf.Abs(rb.velocity.x) >= Mathf.Epsilon;
if (playerHasHorizontalSpeed)
{
transform.localScale = new Vector2(Mathf.Sign(rb.velocity.x), 1f);
}
}
void Run()
{
Vector2 playerVelocity = new(moveInput.x * playerSpeed, rb.velocity.y);
rb.velocity = playerVelocity;
if (myCollider.IsTouchingLayers(LayerMask.GetMask("Ground")))
{
animator.SetBool("run", Mathf.Abs(rb.velocity.x) >= Mathf.Epsilon);
}
}
void OnMove(InputValue value)
{
moveInput = value.Get<Vector2>();
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy") && playerStats.PlayerIsAlive())
{
this.enabled = false;
TriggerKickup();
StartCoroutine(ActivateMovement());
}
}
}
Скорее всего, вам лучше получить компонент SpriteRenderer и изменить его свойство flipX, а не менять масштаб.
В любом случае, если спрайт движется непреднамеренно, когда вы его переворачиваете, скорее всего, точка поворота установлена не так, как вы хотите, например. в этом случае он, вероятно, установлен в левом нижнем углу спрайта.
Выберите ресурс спрайта, нажмите «Редактор спрайтов» в инспекторе и установите точку поворота спрайта в середине или внизу посередине. Примените изменения, и спрайт должен перевернуться от центра, а не от края.
Благодарю вас! Я очень ценю ваш ответ и все подробности. Я поменял пиво и все заработало как задумано!
Обратите внимание, что вам нужно будет расположить спрайты посередине, а не слева от плиток, если вы измените точку опоры. Если вы В самом деле не хотите менять это, вы можете вместо этого применить смещение при переворачивании спрайтов, но это смещение будет зависеть от ширины спрайта, плюс, если у вас есть какие-либо кривые спрайты, вам снова понадобится чтобы поменять стержень.