• Что делать если у тебя возникает ошибка CS1061?

    K0TlK
    @K0TlK
    Вам вижуал студио буквально пишет что не так: 'double' does not contain a definition for 'Tostring' and no accessible extension method 'Tostring' accepting a first argument of type 'double' could be found (are you missing a using directive or an assembly reference?). Нет у double метода Tostring, есть ToString. Прежде чем плодить подобные вопросы, хоть загуглите эту ошибку.
  • Как включать и отключать Collider2D при помощи функции OnTriggerEnter2D/OnTriggerExit2D?

    K0TlK
    @K0TlK
    Павел Арутюнов, Вам сюда. Либо сюда. Изучите основы, чтобы не задавать такие элементарные вопросы.
  • Как получить объект подписанный на событие?

    K0TlK
    @K0TlK
    Зачем? Что хотите сделать? Выглядит как какой-то костыль, который можно решить нормальным путем. У делегатов есть метод GetInvocationList, который возвращает их список вызовов:
    public event Action Tested;
    
        private void Start()
        {
            Tested += Test;
            var delegates = Tested.GetInvocationList();
            Debug.Log(delegates[0].Method);
        }

    Можно посредством рефлексии получить метод, тип. Но зачем это делать, когда наверняка можно вашу проблему нормально решить?
  • Есть ли способ узнать причину по которой не запускается апк файл игры?

    K0TlK
    @K0TlK
    Если не билдить, а из эдитора запускать на телефоне, то все работает нормально? Для того, чтобы таких ситуаций не случалось, существует гит. Откатиться до предыдущей рабочей версии не составляет проблем.
  • Можно ли скопировать проект юнити для перестраховки?

    K0TlK
    @K0TlK
    Sithara, Можете для этого локальный репозиторий сделать с тем же гитом и хранить там все, что угодно. Либо если нужен примитивный способ, взять и скопировать папку с проектом куда-нибудь. В хабе отображается место хранения проекта. 623b333331517344073852.jpeg
  • Можно ли скопировать проект юнити для перестраховки?

    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(). Если что-то не так, напишите, какой метод из какого класса вам нужно вызвать. Но отвечу я только завтра.