@GGWPKATASI

Как убрать инверсию при слежке за курсором?

У меня в игре есть персонаж, оружие
Когда персонаж смотрит направо - то и оружие нормально за ним
но когда персонаж делает флип на лево, то оружие принимает инверсию
то есть, курсор справа вверху, а оружие слева внизу
https://youtu.be/x2lAk6f3sW0
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
K0TlK
@K0TlK
Буллю людей.
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.
Всё это работает, если изначально спрайт игрока смотрит вправо, спрайт оружия смотрит вправо.
Вот так: 623a14e2ef06f683850837.jpeg
Мега краткое объяснение в картинках:
Изначально оружие смотрит туда - 623a164516692952768870.jpeg
Но когда мы поворачиваем персонажа, то оно тоже поворачивается вот так - 623a1665a5bac426619425.jpeg
Соответственно, нужно отразить картинку по Y, чтобы ее выровнять - 623a168c06707463491882.jpeg
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы