GGWPKATASI, Еще раз объясню. Когда вы поворачиваете персонажа, вы разворачиваете только персонажа. Спрайт оружия все еще повернут туда, куда и был повернут. Вам нужно оружие тоже флипать. Сейчас покажу пример.
Есть скрипт игрока.
using UnityEngine;
namespace Assets.Scripts.Rotation
{
[RequireComponent(typeof(Rigidbody2D))] // Нужен, чтобы компонент Rigidbody2D всегда был на объекте, к которому прикреплен данный скрипт
public class Player : MonoBehaviour
{
[SerializeField] private float _maxSpeed; //[SerializeField] позволяет видеть private поля в инспекторе
[SerializeField] private float _speed;
[Range(0f, 1f)]
[SerializeField] private float _slowDownSpeed; //Range ограничивает между 0 и 1 в данном случае
[SerializeField] private Gun _gun;
private Vector2 _movementDirection;
private Rigidbody2D _rb;
private void Start()
{
_rb = GetComponent<Rigidbody2D>(); // Получаем компонент, если получаете компонент таким образом, обязательно нужно делать [RequireComponent(typeof(НазваниеКомпонента))]
}
private void Update()
{
var horizontal = Input.GetAxis("Horizontal");
var vertical = Input.GetAxis("Vertical");
_movementDirection = new Vector2(horizontal, vertical);
}
private void FixedUpdate() // все действия с физикой в FixedUpdate
{
if (_movementDirection == Vector2.zero) SlowDown(_slowDownSpeed);
Move(_movementDirection, _speed);
Flip();
}
private void Flip()
{
var vector = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; //берем вектор направления от нашей позиции до позиции мыши в мировых координатах
if (vector.x < 0) transform.eulerAngles = new Vector3(0, 180); // Если он левее, то поворачиваем объект налево
if (vector.x >= 0) transform.eulerAngles = new Vector2(0, 0);// или направо, если он правее
_gun.Flip(vector.x);// поворачиваем оружие
}
private void Move(Vector2 direction, float speed)
{
var velocity = _rb.velocity;
var x = velocity.x + direction.x * speed;// определяем новую скорость
var y = velocity.y + direction.y * speed;
velocity.x = Mathf.Clamp(x, -_maxSpeed, _maxSpeed); //ограничиваем скорость
velocity.y = Mathf.Clamp(y, -_maxSpeed, _maxSpeed);
_rb.velocity = velocity; // присваиваем скорость
}
private void SlowDown(float speed) // замедляем объект
{
var velocity = _rb.velocity;
velocity.x = Mathf.Lerp(velocity.x, 0, speed);
velocity.y = Mathf.Lerp(_rb.velocity.y, 0, speed);
_rb.velocity = velocity;
}
}
}
И оружия:
using UnityEngine;
namespace Assets.Scripts.Rotation
{
[RequireComponent(typeof(SpriteRenderer))]
public class Gun : MonoBehaviour
{
private SpriteRenderer _spriteRenderer;
private void Start()
{
_spriteRenderer = GetComponent<SpriteRenderer>();
}
private void Update()
{
var difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
var rotation = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, rotation); // ваш код поворота оружия
}
public void Flip(float direction)
{
_spriteRenderer.flipY = direction < 0; // отражаем спрайт по оси Y в зависимости от того, куда смотрит персонаж
}
}
}
Итак. Игрок. Двигается, смотрит в сторону мыши.
Оружие. Смотрит на мышь.
Можете потестировать, посмотреть как все работает.
Главное у Игрока у компонента Rigidbody2D поставить gravity scale на 0.
Всё это работает, если изначально спрайт игрока смотрит вправо, спрайт оружия смотрит вправо.
Вот так:
Мега краткое объяснение в картинках:
Изначально оружие смотрит туда -
Но когда мы поворачиваем персонажа, то оно тоже поворачивается вот так -
Соответственно, нужно отразить картинку по Y, чтобы ее выровнять -