Задать вопрос
  • Можно ли скопировать проект юнити для перестраховки?

    K0TlK
    @K0TlK
    Sithara, под "Весь проект целиком" вы что подразумеваете? Если ресурсы типа текстур и т.д, то их и не надо там хранить, храните ресурсы отдельно где-нибудь(облако, отдельный диск). Можно настроить игнорирование папок/расширений файлов, чтобы лишнее не шло в репозиторий.
  • Можно ли скопировать проект юнити для перестраховки?

    K0TlK
    @K0TlK
    Используйте гит. Создайте репозиторий и сохраняйте все туда. У гитхаба даже свое приложение десктопное есть.
  • Не работает управление в Unity2D?

    K0TlK
    @K0TlK
    N0nV3r, "Переменные", "функции", публичные поля. Чему может обучить человек, который сам не знает основ? Не нужно смотреть этого автора, он вас научит лишь тому как раскидать грабли, на которые вы потом будете в будущем наступать. У юнити есть более-менее нормальные курсы, которые покажут вам основы: https://learn.unity.com/courses. Изучения программирование - https://ulearn.me/
  • Не работает управление в Unity2D?

    K0TlK
    @K0TlK
    Скиньте, пожалуйста ссылку на то место, где вы взяли вот эту часть кода:
    void Flip()
      {
        facingRight = !facingRight;
        Vector3 Scaler = transform.localScale;
        Scaler.x *= -1;
        transform.localScale = Scaler;
      }

    К вашей проблеме это никак не относится, просто вижу именно этот участок кода уже не первый раз и хочу узнать какой умник этому учит. Ваш баг воспроизвести не удалось, все работает, проверьте, может быть объект где-то застревает и не может двигаться либо какой-то еще компонент взаимодействует с прикрепленным Rigidbody и перезаписывает скорость.
  • Как убрать инверсию при слежке за курсором?

    K0TlK
    @K0TlK
    GGWPKATASI, ответ написал, надеюсь достаточно понятно. Если что-то непонятно, то к ответу в комменты пишите.
  • Как убрать инверсию при слежке за курсором?

    K0TlK
    @K0TlK
    _spriteRenderer.flipY = direction > 0;
    Сделайте не > 0, а <0, не сработает, то не FlipY, а FlipX и так же поиграться с <>
  • Как убрать инверсию при слежке за курсором?

    K0TlK
    @K0TlK
    GGWPKATASI, Вам facingRight вообще не нужон. Вы можете поворачивать спрайт в зависимости от значения moveVelocity.x, если оно отрицательное, то смотреть налево, если положительное - направо.
    Добавить в скрипт gun то, что снизу:
    private SpriteRenderer _spriteRenderer;
    
        private void Start()
        {
            _spriteRenderer = GetComponent<SpriteRenderer>();
        }
    
        public void Flip(float direction)
        {
            _spriteRenderer.flipY = direction < 0;// Если direction < 0, то оружие смотрит налево
        }

    Тут все просто: получаем компонент SpriteRenderer и устанавливаем flip по Y у оружия, если направление меньше нуля. Далее то, что ниже - в скрипт, который вы мне скинули вторым. Точки означают, что в этом месте есть ваш код.
    [SerializeField] private gun _gun;
    
        ...
        ...
        ...
        private void Flip()
        {
            ...
            ...
            _gun.Flip(moveInput.x);
            ...
        }

    Теперь, поместить объект, на котором висит скрипт gun в поле gun в инспекторе и протестировать.
  • Как убрать инверсию при слежке за курсором?

    K0TlK
    @K0TlK
    GGWPKATASI, когда поворачиваете спрайт персонажа, делаете flipx у спрайта оружия? Если да, то не flipx нужно делать, а flipy.
  • Как убрать инверсию при слежке за курсором?

    K0TlK
    @K0TlK
    Приложите код компонента, который поворачивает оружие. Здесь нет экстрасенсов, которые могут по чайной гуще баги фиксить.
  • Как получить ссылку на Inventory (находится на префабе игрока) из InventoryGUI (висит на сцене в UI panel в Canvas)?

    K0TlK
    @K0TlK
    Элементарно.
    public class Game : MonoBehaviour
    {
        private SomeModule _someModule;
        private SomeModule2 _someModule2;
    
        private void Awake()
        {
            _someModule = new SomeModule();
            _someModule2 = new SomeModule2(_someModule);
        }
    }
    
    public class SomeModule2
    {
        private SomeModule _someDependency;
    
        public SomeModule2(SomeModule _dependency)
        {
            _someDependency = _dependency;
        }
    }


    В коде сверху, класс Game будет точкой входа в приложение. Это единственный компонент на сцене, у которого есть метод Awake, остальные MonoBehaviour будут использовать метод Start. Поэтому инициализироваться он будет самым первым. Теперь можно изменять порядок загрузки модулей и прокидывать зависимости как захочется. В примере сверху, SomeModule2 зависит от SomeModule, поэтому SomeModule инициализируется первым, а SomeModule2 вторым и ему передается эта зависимость. Не надо плодить миллион Монобехов в качестве отдельных модулей, это приведет к тому, что вы будете делать их синглтонами, статиками и т.д. лишь бы был легкий доступ. А это, в свою очередь, приведет к тому, что компонент будет использоваться не так как предполагалось изначально. Зависимости в MonoBehaviour передавать либо через метод-инициализатор либо использовать инъекцию зависимостей через zenject.
  • Почему может замедляться скорость стрельбы, когда остаётся 1 враг?

    K0TlK
    @K0TlK
    yraiv, У башни есть область видимости. Самое простое - обычный триггер. При входе в этот триггер, если у башни нет таргета, то этот зомби им становится. Если же таргет есть, то этот зомби добавляется в список зомби, которые вошли в триггер. Соответственно, при смерти зомби, который был таргетом, целью становится первый зомби в списке (Этот зомби будет ближе всех к финишу, т.к. он первее вошел в триггер). При выходе из триггера, зомби удаляется из списка/таргета.
    Но это работает, если у всех зомби одинаковая скорость, если она разная, то зависит от того, как строить путь для зомби. Проходиться по списку и выбирать ближайшего к финишу через дистанцию, хранить в зомби процент пройденного пути и по нему фильтровать, хранить в зомби последнюю пройденную контрольную точку и по ней фильтровать, как делали вы. Вариантов решения можно придумать сколько угодно.
    Вам лучше научиться правильно именовать поля, свойства, методы, классы, потому что с вашими названиями, которые не отражают сути, вообще не понятно что для чего служит и приходится сидеть и вчитываться в код, искать где и как это работает. Вот здесь есть Naming convention, в котором расписано как что именовать.
    И об оптимизации нужно думать, когда начинаются проблемы с ней.
    Как я и писал раньше, Tower Defence пока что сложновато вам будет реализовать, а трудность реализации может быть для вас демотиватором, начните с простых вещей.
  • Как получить ссылку на Inventory (находится на префабе игрока) из InventoryGUI (висит на сцене в UI panel в Canvas)?

    K0TlK
    @K0TlK
    Что статический класс, что одиночка преследуют одну цель - дать доступ к объекту откуда угодно и пользовать его во все дыры. Синглтон в 99% случаев не нужен, достаточно нормально прокинуть зависимости. И этот случай не относится к 1%.
    Поиск по тэгу и ID => использование строковых литералов => написать не "Inventory", а "Invetnory" => искать почему же у меня выбрасывает NullReferenceException.
    Достаточно просто сделать точку входа, где будут инициализироваться все модули, компоненты и т.д. и нормально прокидывать зависимости, а не создавать синглтон-модель инвентаря, чтобы потом использовать ее из класса снежка, который можно подобрать в инвентарь.
  • Как получить ссылку на Inventory (находится на префабе игрока) из InventoryGUI (висит на сцене в UI panel в Canvas)?

    K0TlK
    @K0TlK
    Есть. Инициализировать все из одного места. Сделать точку входа в ней инициализировать всё (инвентарь, игрока и остальное) и прокинуть зависимости как вам угодно. Модель инвентаря (Inventory) вообще не должна быть MonoBehaviour и не должна зависеть ни от чего. Представление инвентаря(InventoryGUI) тоже не должно напрямую зависеть от модели, вместо этого создайте какой-нибуль класс, который будет связывать между собой модель и представление.
  • Как вызвать класс из другого скрипта (прикреплены к одному объекту)?

    K0TlK
    @K0TlK
    Hiniks YouTube, void Stopper() в этом методе вы пытаетесь вызвать метод Stop. Но вы пытаетесь вызвать его из текущего класса, т.е. из класса Player. В вашем классе Player нет метода Stop. Вам нужно вызвать метод Stop из класса combatPlaye? тогда вместо Stop() нужно написать _combatPlaye.Stop(). Если что-то не так, напишите, какой метод из какого класса вам нужно вызвать. Но отвечу я только завтра.
  • Как вызвать класс из другого скрипта (прикреплены к одному объекту)?

    K0TlK
    @K0TlK
    Hiniks YouTube, Вместо того, чтобы кидать несколько скриншотов, просто скиньте код всего объекта. Вы метод Stop в Player объявили?
  • Почему может замедляться скорость стрельбы, когда остаётся 1 враг?

    K0TlK
    @K0TlK
    yraiv,
    public List<GameObject> zombieArray = new List<GameObject>();
    public List<GameObject> ZombieMaxArrayList = new List<GameObject>();
    public List<GameObject> zombieArrayNew = new List<GameObject>();

    Почему их три? Зачем? Почему от GameObject, когда у вас уже есть класс ZombieStandart, который вы впоследствии получаете через GetComponent.

    public Rigidbody2D bullet;
    Почему Rigidbody, когда можно Bullet или что у вас там отвечает за пулю?
    public int ZombieArrayGivePosition;
    Что это такое, почему инт? Что оно означает? Зомби массив давать позиция?
    public int thisAtackTower;
    Это что такое, почему инт? Что оно означает?
    void OnTriggerEnter2D(Collider2D collider)
        {
            if (collider.gameObject.tag == "Zombie")
            {
                zombieArray.Add(collider.gameObject);
            }
        }

    Проверка по тэгу == плохо, нельзя так делать, можно легко ошибиться и написать в строке не то что надо и искать потом где ошибка. Это делается через получение компонента:
    private void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.TryGetComponent<ZombieStandart>(out ZombieStandart zombie)
        {
            zombieArray.Add(zombie);
        }
    }

    Соответственно zombieArray должен быть от типа ZombieStandart, а не от GameObject.
    В OnTriggerExit и OnTriggerStay то же самое.
    Все еще не понятно зачем ZombieMaxArrayList нужен, выглядит как какой-то рудимент.
    Зачем эти приписки в конце (Array, List)? Чтобы не забыть, что это список? _zombies или подобное недостаточно говорит о том, что это какой-то массив данных?

    transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, Mathf.Atan2(target.transform.position.y - transform.position.y, target.transform.position.x - transform.position.x) * Mathf.Rad2Deg + 90);

    Это вы так метод transform.LookAt реализовали?
    private void ChekDistante()
    CheckDistance - если я правильно понял. Используйте гугл транслейт чтобы переводить слова, которые не знаете как правильно написать. Я не понимаю что делает этот метод. Какую он дистанцию проверяет, до чего? Если нужна дистанция до какого-то объекта, то есть метод Vector3.Distance.

    Скорее всего, проблема в методе ChekDistante потому что там творится какая-то ересь, которую поймет только ее создатель. Да и метод Fire тоже не совсем то делает, что нужно. Он не должен сам ожидать, ожидание должна выполнять корутина, Fire должен просто проверить, есть ли возможность сейчас стрелять и стрельнуть. Далее уже запускается корутина и делает отсчет времени.

    Ваша проблема в том, что вы выбрали себе слишком сложную задачу. Поделайте что-то простое типа FlappyBird, DoodleJump и других подобных гиперказуалок. Научитесь делать хотя бы эти игры, а потом переходите на жанры сложнее. Tower Defence или что вы пытаетесь сделать, слишком сложно для вас. Для начала изучите как разделять код на компоненты правильно и как с этими компонентами работать. Изучите основы.

    Где изучать юнити - https://learn.unity.com/
    Где изучать программирование - https://ulearn.me/
  • Почему может замедляться скорость стрельбы, когда остаётся 1 враг?

    K0TlK
    @K0TlK
    yraiv, Выложите полностью код компонента, по этому обрезку не понять общей картины. Вот это вот страшилище
    Rigidbody2D clone = Instantiate(bullet, gunPoint.position, Quaternion.identity) as Rigidbody2D;
    clone.GetComponent<BulletEnter>().atack = thisAtackTower;
    clone.transform.up = gunPoint.up;
    clone.velocity = clone.transform.up * speed;


    заменяется на это:
    var bullet = Instantiate<Bullet>(bullet, gunPoint.position, Quaternion.identity);
    bullet.Shot(direction);


    Соответственно компонент Bullet должен иметь метод Shot(Vector2 direction) который принимает направление и придает себе движение в том направлении. И, если уж это какая-то пуля, то атаковать она должна сама, ей не должен кто-то говорить, что это ее таргет и вот его нужно атаковать.
  • Как соединить объекты?

    K0TlK
    @K0TlK
    Переместить один объект в иерархии на другой? Если вы хотите из нескольких объектов слепить другой цельный, который будет отображаться не как несколько объектов, а как один, то вам не в юнити нужно а в блендер или еще куда-нибудь.
  • Как сделать что бы кнопка была большего размера в самой игре unity?

    K0TlK
    @K0TlK
    seregahalz, Во-первых в канвасе настроить скейлинг элементов. 1.Выбрать режим скейлинга Scale with screen size означает, что при изменения размеров экрана, будут меняться ui элементы в этом канвасе. 2.Выставить желаемое разрешение. 3.Выставить ScreenMatchMode нужный вам.
    6237148e72a08523415056.jpeg
    У ui элементов есть компонент RectTransform, в нем настраиваются размеры и т.д.
    623714d3abbfe696942369.jpeg