Задать вопрос
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, создавать общий класс, от которого будет наследоваться поведение я передумал, но зачем всё вместе в 1 скрипт добавлять, я не понимаю. или это совет, как новичку?
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, появился вопрос, у меня два рейкаста - горизонтальный и вертикальный.

    Как обрабатывать столкновения ещё и по диагонали. У меня капсула теперь.

    Ещё добавлять рейкасты? Или есть способ легче/более оптимизированный

    Или можно кастовать по всей капсуле
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, багов много с самостоятельным просчитыванием коллайдеров, буду через rigidbody
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, на мой вопрос не отвечают, поэтому напишу здесь.

    Как убрать артефакты, которые появляются при движении по диагонали, и как сделать так, чтобы после движения налево, проигрывалась анимация idleLeft, направо idleRight и так далее.

    https://gromer-top.github.io/WebGL-Unity-Game/
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, за документацию отдельное спасибо
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, я про nav mesh и говорил, но был не уверен в том что в 2д он есть.
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, сейчас нет возможности самостоятельно узнать, но можно ли делать что-то по типу AI карт, для того, чтобы не просчитывать колайдеры, для ботов конечно.
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, да я думаю то, что сделал хватит. Движение есть, а всё остальное в других скриптах сделаю.
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    в общем разобрался.

    итог:
    using UnityEngine;
    
    public class PlayerMovement : MonoBehaviour
    {
        [SerializeField] private float playerSpeed = 7.0f;
        [SerializeField] private LayerMask collisionLayer;
        [SerializeField] private Vector2 inputVector;
        [SerializeField] private InputManager inputManager;
        [SerializeField] private float horizontalRaycastDistance = 0.5f;
        [SerializeField] private float verticalRaycastDistance = 0.5f;
    
        void Update()
        {
            float horizontal = inputManager.horizontalInput;
            float vertical = inputManager.verticalInput;
    
            inputVector = new Vector2(horizontal, vertical).normalized;
        }
    
        void FixedUpdate()
        {
            Move();
        }
    
        void Move()
        {
            Vector2 velocity = inputVector * playerSpeed * Time.fixedDeltaTime;
            Vector2 newPosition = transform.position;
            //Debug.Log("Velocity: " + velocity);
    
            float horizontalDirection = Mathf.Sign(velocity.x);
            RaycastHit2D horizontalHit = Physics2D.Raycast(transform.position, Vector2.right * horizontalDirection, Mathf.Abs(velocity.x) + horizontalRaycastDistance, collisionLayer);
            if (horizontalHit.collider != null)
            {
                velocity.x = 0;
                newPosition.x = horizontalHit.point.x - horizontalDirection * horizontalRaycastDistance;
                //Debug.Log("Horizontal Hit: " + horizontalHit.collider.name);
    
            }
            //Debug.DrawRay(transform.position, Vector2.right * horizontalDirection * (Mathf.Abs(velocity.x) + horizontalRaycastDistance), Color.red);
    
            float verticalDirection = Mathf.Sign(velocity.y);
            RaycastHit2D verticalHit = Physics2D.Raycast(transform.position, Vector2.up * verticalDirection,  Mathf.Abs(velocity.y) + verticalRaycastDistance, collisionLayer);
            if (verticalHit.collider != null)
            {
                velocity.y = 0;
                newPosition.y = verticalHit.point.y - verticalDirection * verticalRaycastDistance;
                //Debug.Log("Vertical Hit: " + verticalHit.collider.name);
            }
            Debug.DrawRay(transform.position, Vector2.up * verticalDirection * (Mathf.Abs(velocity.y) + verticalRaycastDistance), Color.red);
    
            newPosition += velocity;
    
            transform.position = newPosition;
        }
    }
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    буду переписывать для character controller
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, а можно как-нибудь сделать так, чтобы в угол не зажевало игрока?

    using UnityEngine;
    
    public class PlayerMovement : MonoBehaviour
    {
        [SerializeField] private float playerSpeed = 7.0f;
        [SerializeField] private float collisionCheckRadius = 0.5f;
        [SerializeField] private LayerMask collisionLayer;
        [SerializeField] private Vector2 inputVector;
        [SerializeField] private InputManager inputManager;
    
        void Update()
        {
            float horizontal = inputManager.horizontalInput;
            float vertical = inputManager.verticalInput;
    
            inputVector = new Vector2(horizontal, vertical).normalized;
            Move();
        }
    
        void Move()
        {
            Vector2 velocity = inputVector * playerSpeed * Time.deltaTime;
            RaycastHit2D hit = Physics2D.CircleCast(transform.position+(Vector3)velocity , collisionCheckRadius, velocity.normalized, velocity.magnitude, collisionLayer);
            if (hit.collider != null)
            {
                //return;
                Vector2 normal = hit.normal;
                Debug.Log(Mathf.Abs(normal.x) + " " + Mathf.Abs(normal.y));
                if (Mathf.Abs(normal.x) >= Mathf.Abs(normal.y))
                {
                    velocity.x = 0;
                }
                if (Mathf.Abs(normal.x) <= Mathf.Abs(normal.y))
                {
                    velocity.y = 0;
                }
                if (0f < Mathf.Abs(normal.x) && 1f > Mathf.Abs(normal.x) || 0f < Mathf.Abs(normal.y) && 1f > Mathf.Abs(normal.y) || Mathf.Abs(normal.x) == 1 && Mathf.Abs(normal.y) == 1)
                {
                    return;
                }
            }
    
            transform.position += (Vector3)velocity;   
        }
    }
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7,
    using UnityEngine;
    
    public class PlayerMovement : MonoBehaviour
    {
        [SerializeField] private float playerSpeed = 7.0f;
        [SerializeField] private float collisionCheckRadius = 0.5f;
        [SerializeField] private LayerMask collisionLayer;
    
        [SerializeField] private Vector2 inputVector;
    
        void Update()
        {
            float horizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");
    
            inputVector = new Vector2(horizontal, vertical).normalized;
            Move();
        }
    
        void Move()
        {
            Vector2 velocity = inputVector * playerSpeed * Time.deltaTime;
    
            RaycastHit2D hit = Physics2D.CircleCast(transform.position, collisionCheckRadius, velocity.normalized, velocity.magnitude, collisionLayer);
    
            if (hit.collider != null)
            {
                Vector2 normal = hit.normal;
                if (Mathf.Abs(normal.x) > Mathf.Abs(normal.y))
                {
                    velocity.x = 0;
                    if (normal.x > 0)
                    {
                        Debug.Log("Удар слева");
                    }
                    else
                    {
                        Debug.Log("Удар справа");
                    }
                }
                else
                {
                    velocity.y = 0;
                    if (normal.y > 0)
                    {
                        Debug.Log("Удар снизу");
                    }
                    else
                    {
                        Debug.Log("Удар сверху");
                    }
                }
            }
            transform.position += (Vector3)velocity;
        }
    }

    вот, вроде что-то сделал, только если в угол ударяюсь, багует сильно
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    вот код

    using UnityEngine;
    
    public class PlayerMovement : MonoBehaviour
    {
        [SerializeField] private GameObject player;
        [SerializeField] private Vector3 playerPosition;
        [SerializeField] private float playerSpeed = 7.0f;
        [SerializeField] private LayerMask collisionLayer;
        void Start()
        {
            player = GameObject.FindGameObjectWithTag("Player");
            playerPosition = player.transform.position;
        }
    
        void Update()
        {
            Move();
        }
    
        void Move()
        {
            float horizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");
            playerPosition.y = playerSpeed * vertical * Time.deltaTime;
            playerPosition.x = playerSpeed * horizontal * Time.deltaTime;
            if(playerPosition.sqrMagnitude == 0)
            {
                return;
            }
            if(Physics2D.OverlapCircle(player.transform.position + playerPosition,0.5f, collisionLayer))
            {
                return;
            }
            player.transform.position += playerPosition;
        }
    }


    но когда я докасаюсь до нижней стены и нажимаю A и S одновременно, он не движется. А хотелось бы чтобы медленно влево
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, ошибку выдает насчет vector2 И vector3 , что не применимы операции между ними, мне что playerPosition в vector3 изменять? это нормально?
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, за это большое спасибо, после того как проверю, отпишусь. В FixedUpdate отправил, потому что моя логика такова: если Update от fps зависит, то получается движение зависит от фпс? И я настрою скорость для игры с 59 фпс, а человек, у которого 179 будет уже передвигаться быстрее. Или я принцип update не понял
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    да я вроде движение сделал и оно меня устраивает, а как коллизии обработать

    using UnityEngine;
    
    public class PlayerMovement : MonoBehaviour
    {
        [SerializeField] private GameObject player;
        [SerializeField] private Vector2 playerPosition;
        [SerializeField] private float playerSpeed = 0.15f;
        void Start()
        {
            player = GameObject.FindGameObjectWithTag("Player");
            playerPosition = player.transform.position;
        }
    
        void Update()
        {
            
        }
    
        void FixedUpdate()
        {
            Move();
        }
    
        void Move()
        {
            float horizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");
            playerPosition.y += playerSpeed * vertical;
            playerPosition.x += playerSpeed * horizontal;
            player.transform.position = playerPosition;
        }
    }


    вот сама игра https://gromer-top.github.io/WebGL-Unity-Game/
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, решил начать реализовывать движение(отвлекся на тайлмапы)
    вот что вышло
    using UnityEngine;
    
    public class PlayerMovement : MonoBehaviour
    {
        [SerializeField] private GameObject player;
        [SerializeField] private Vector2 playerVector;
        [SerializeField] private float playerSpeed = 0.15f;
        void Start()
        {
            player = GameObject.FindGameObjectWithTag("Player");
            playerVector = player.transform.position;
        }
    
        void Update()
        {
            
        }
    
        void FixedUpdate()
        {
            Move();
        }
    
        void Move()
        {
            float horizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");
            playerVector.y += playerSpeed * vertical;
            playerVector.x += playerSpeed * horizontal;
            player.transform.position = playerVector;
        }
    }


    с рейкастами не дружу, юнити не очень давно начал изучать, поэтому вот результат временный. хотя бы здесь всё нормально?

    playerVector решил ввести, так как по-моему лучше изначально вычислять позицию, а потом уже в одной строчке присваивать. Но наверное нужно в playerPosition переименовать, только что заметил
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, ок, буду разбираться с кастами
    Написано
  • Какой способ передвижения в 2d top down игре использовать?

    Gromer-Top
    @Gromer-Top Автор вопроса
    Игра рогалик, просто бегать по данжам, если Rigidbody2D и Kinematic использовать, это хуже?
    Цель в том, чтобы узнать как сделать максимально правильно, да и в общем разные способы надеюсь в ответах увидеть.
    Написано
  • Как подключить SDL к проекту C++?

    Gromer-Top
    @Gromer-Top Автор вопроса
    всë, теперь сдался. может только если другую попробую установить
    Написано