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

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, я не уверен, но судя по transform.right пример из 3D?

    Я пробовал просто через AddForce, так как в простом сайд-скролинг проекте не вижу смысла заморачиваться с прыжком(на начальном этапе как минимум)
    Написано
  • Как лучше спавнить врагов в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, понял, спасибо. Уже переписал Player Controller и вынес Animation Controller. Намного легче стало. Вопрос возник из-за проблемного прыжка
    Написано
  • Как лучше спавнить врагов в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    DrRen7, интересно узнать ваше мнение, лучше разбивать проект на маленькие скрипты, или в больших всё хранить?
    Написано
  • Как лучше спавнить врагов в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    Тут вопрос в плане оптимизации, есть ли разница, когда префаб спавнишь, или когда расставляешь.
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, всё работает, но мне кажется тут много лишнего. Что поправить?

    void GiveDamage()
        {
            Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, attackRange, targetLayer);
    
            if (hitColliders.Length > 0)
            {
                foreach (Collider2D hitCollider in hitColliders)
                {
                    GameObject colider = hitCollider.gameObject;
    
                    if (colider.TryGetComponent<EnemyController>(out EnemyController enemy))
                    {
                        Debug.Log("Найден");
                        if ((enemy.transform.position.x < transform.position.x && direction == -1) || (enemy.transform.position.x > transform.position.x && direction == 1))
                        {
                            enemy.ReceiveDamage(damage);
                        }
                    }
                }
            }
        }
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, возможно глупый вопрос, а Overlap по кругу вроде проверяет? Мне нужно перед игроком.

    Могу конечно проверять потом позицию по отношению к игроку, но если можно по другому, тогда по другому.
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, скрипт хитбокса можно удалить, а в PlayerController'e добавить касты?
    Написано
  • Как организовать контроллер игрока в юнити?

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

    Gromer-Top
    @Gromer-Top Автор вопроса
    я с помощью метода attack активирую обьект с хитбоксом
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, нужно один раз
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, атака работает только если перед этим игрок или враг двигался

    using UnityEngine;
    
    public class Hitbox : MonoBehaviour
    {
        [SerializeField] Transform playerPos;
        public PlayerController player;
        private void OnTriggerEnter2D(Collider2D other)
        {
            if (other.TryGetComponent<EnemyController>(out EnemyController enemy))
            {
                Debug.Log("Найден");
                enemy.ReceiveDamage(player.damage);
            }
            else
            {
                Debug.LogWarning("Enemy не найден на объекте " + other.name);
            }
        }
    
        public void SetInverse(bool value)
        {
            Vector3 currentPosition = playerPos.transform.position;
    
            if (value) currentPosition.x -= 2;
            else currentPosition.x += 2;
    
            transform.position = currentPosition;
        }
    }
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK,

    if(isAttack)
    То есть вот так, только в метода Move() нужно обнулять?

    А с коллизией, что не так?

    using UnityEngine;
    
    public class Hitbox : MonoBehaviour
    {
        [SerializeField] Transform playerPos;
        private void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.gameObject.tag == "Enemy") Destroy(collision.gameObject);
        }
    
        public void SetInverse(bool value)
        {
            Vector3 currentPosition = playerPos.transform.position;
    
            if (value) currentPosition.x -= 2;
            else currentPosition.x += 2;
    
            transform.position = currentPosition;
        }
    }
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, зашёл опять сюда. Я так понимаю, паблики не помешает использовать, просто потому что если в скрипте игрока, всё про игрока, то зачем бояться изменения данных + проект я делаю один, никто случайно не сломает, а я знаю все свои костыли

    Да и почитал ваше объяснение под каким-то вопросом, вроде понял всё.

    А с хитбоксом поможете?
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, как сделать так, чтобы игрок останавливался при атаке и не движущийся обьект уничтожал

    PlayerController.cs
    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        [Header("Параметры игрока")]
        [SerializeField] private float playerSpeed = 5.0f;
        //------------------------------------------------------
        [Header("Ввод")]
        [SerializeField] private InputManager inputManager;
        public Vector2 inputVector;
        //------------------------------------------------------
        [Header("Физика")]
        public Vector2 velocity;
        private Rigidbody2D rb;
        //------------------------------------------------------
        [Header("Атака")]
        [SerializeField] private Hitbox playerHitbox;
        [SerializeField] private BoxCollider2D hitbox;
        private bool isAttack;
        //------------------------------------------------------
        [Header("Анимации")]
        [SerializeField] private SpriteRenderer spriteRenderer;
        [SerializeField] private Animator animator;
    
        void Start()
        {
            rb = GetComponent<Rigidbody2D>();
            animator = GetComponent<Animator>();
            hitbox = transform.Find("HitboxPlayer").GetComponent<BoxCollider2D>();
            inputVector = new Vector2(0, 0);
        }
    
        public void SetFlipX(int direction)
        {
            spriteRenderer.flipX = direction < 0;
            playerHitbox.SetInverse(direction < 0);
        }
    
        void Update()
        {
            inputVector = new Vector2(inputManager.horizontalInput, inputManager.verticalInput);
            float horizontalInput = inputVector.x;
    
            if (horizontalInput > 0) SetFlipX(1);
            else if (horizontalInput < 0) SetFlipX(-1);
    
            animator.SetFloat("Speed", GetSpeed());
    
            if (inputManager.inputAttack)
            {
                Attack();
            }
            if(!isAttack) Move();
        }
    
        void Move()
        {
            velocity = new Vector2(inputVector.x * playerSpeed, inputVector.y);
            rb.velocity = velocity;
        }
    
        public float GetSpeed()
        {
            return velocity.sqrMagnitude;
        }
    
        public void Attack()
        {
            animator.SetTrigger("Attack");
            Invoke("ActivateHitbox", 0.27f);
            Invoke("DeactivateHitbox", 0.54f);
        }
    
        void ActivateHitbox()
        {
            hitbox.gameObject.SetActive(true);
            isAttack = true;
        }
    
        void DeactivateHitbox()
        {
            hitbox.gameObject.SetActive(false);
            isAttack = false;
        }
    }


    Hitbox.cs
    using UnityEngine;
    
    public class Hitbox : MonoBehaviour
    {
        [SerializeField] Transform playerPos;
        private void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.gameObject.tag == "Enemy") Destroy(collision.gameObject);
        }
    
        public void SetInverse(bool value)
        {
            Vector3 currentPosition = playerPos.transform.position;
    
            if (value) currentPosition.x -= 2;
            else currentPosition.x += 2;
    
            transform.position = currentPosition;
        }
    }
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, не знаю насчёт полей, но заметил, что за публичные ругаются, почему не понимаю, но стал так пользоваться.
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    Gromer-Top, в коде читать по-моему не удобно, а вот в инспекторе очень даже. Спасибо за совет.
    Написано
  • Как организовать контроллер игрока в юнити?

    Gromer-Top
    @Gromer-Top Автор вопроса
    K0TlK, переписал. Вышло так, нормально разве?
    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        [Header("Параметры игрока")]
        [SerializeField] private float playerSpeed = 5.0f;
        //------------------------------------------------------
        [Header("Ввод")]
        [SerializeField] private InputManager inputManager;
        [SerializeField] public Vector2 inputVector;
        //------------------------------------------------------
        [Header("Физика")]
        public Vector2 velocity;
        private Rigidbody2D rb;
        //------------------------------------------------------
        [Header("Атака")]
        [SerializeField] private Hitbox playerHitbox;
        [SerializeField] private BoxCollider2D hitbox;
        //------------------------------------------------------
        [Header("Анимации")]
        [SerializeField] private SpriteRenderer spriteRenderer;
        [SerializeField] private Animator animator;
    
        void Start()
        {
            rb = GetComponent<Rigidbody2D>();
            animator = GetComponent<Animator>();
            hitbox = transform.Find("HitboxPlayer").GetComponent<BoxCollider2D>();
            inputVector = new Vector2(0, 0);
        }
    
        public void SetFlipX(int direction)
        {
            spriteRenderer.flipX = direction < 0;
            playerHitbox.SetInverse(direction < 0);
        }
    
        void Update()
        {
            inputVector = new Vector2(inputManager.horizontalInput, inputManager.verticalInput);
            float horizontalInput = inputVector.x;
    
            if (inputManager.isAttack)
            {
                Attack();
            }
    
            if (horizontalInput > 0) SetFlipX(1);
            else if (horizontalInput < 0) SetFlipX(-1);
    
            animator.SetFloat("Speed", GetSpeed());
    
            Move();
        }
    
        void Move()
        {
            velocity = new Vector2(inputVector.x * playerSpeed, inputVector.y);
            rb.velocity = velocity;
        }
    
        public float GetSpeed()
        {
            return velocity.sqrMagnitude;
        }
    
        public void Attack()
        {
            animator.SetTrigger("Attack");
            Invoke("ActivateHitbox", 0.2f); // Activate hitbox after 0.2 seconds.
            Invoke("DeactivateHitbox", 0.8f); // Deactivate hitbox after 0.4 seconds.
        }
    
        void ActivateHitbox()
        {
            hitbox.gameObject.SetActive(true);
        }
    
        void DeactivateHitbox()
        {
            hitbox.gameObject.SetActive(false);
        }
    }
    Написано
  • Как организовать контроллер игрока в юнити?

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

    Gromer-Top
    @Gromer-Top Автор вопроса
    Если всё в одном скрипте, то ч думаю, там должно быть так: на игроке несколько скриптов: в одном движение/атака/получение урона, во втором здоровье/монеты/стамина и т.д.
    Написано