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

    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
  • Как сделать что бы кнопка была большего размера в самой игре unity?

    K0TlK
    @K0TlK
    Кнопка в пределах канваса находится в окне сцены?
  • Как сделать проверку нахождения объекта в триггере?

    K0TlK
    @K0TlK
    a, Что-то вы перекостылили. Гораздо проще выделить интерфейс, который будут реализовывать все отключаемые объекты и работать через него посредством событий. Что-то типа этого:
    using System;
    using UnityEngine;
    
    namespace Assets.Scripts
    {
        public class ObjectDisabler : MonoBehaviour, IDeactivatable
        {
            public event Action Deactivated;
            public event Action Activated;
    
    
            public void Activate()
            {
                gameObject.SetActive(true);
                Activated?.Invoke();
            }
    
            public void Deactivate()
            {
                gameObject.SetActive(false);
                Deactivated?.Invoke();
            }
        }
    
        public interface IDeactivatable
        {
            event Action Deactivated;
            event Action Activated;
            void Activate();
            void Deactivate();
        }
    }

    ObjectDisabler - это объект, который вы выключаете, а не какой-то отдельный объект, названия нормальные у меня нет желания придумывать.
    Таким образом, нам не нужно получать целый объект, чтобы вызвать у него метод SetActive, тем самым нарушив инкапсуляцию. Мы просто получаем интерфейс и через него работаем:
    using UnityEngine;
    
    namespace Assets.Scripts
    {
        public class TriggerTest : MonoBehaviour
        {
            private IDeactivatable _deactivatable;
            private void OnTriggerEnter(Collider other)
            {
                if (other.TryGetComponent(out IDeactivatable deactivatable))
                {
                    _deactivatable = deactivatable;
                    _deactivatable.Deactivated += ExitTrigger;
                }
            }
    
            private void OnTriggerStay(Collider other)
            {
                Debug.Log("TriggerStay");
            }
    
            private void OnTriggerExit(Collider other)
            {
                ExitTrigger();
            }
    
            private void ExitTrigger()
            {
                Debug.Log("TriggerExit");
                _deactivatable.Deactivated -= ExitTrigger;
            }
        }
    }


    Интерфейс IDeactivatable можно (и нужно) разделить на 2 разных, чтобы были отдельно ивенты и отдельно методы. Теперь все объекты, которые нужно отключать извне, должны реализовывать этот интерфейс и делать в них то, что нужно, чтобы отключить объект. Таким образом, не будет каких-то неожиданных отключений через SetActive и состояние объекта не будет ломаться. Также, я вижу, что вы делаете проверки по тэгу, этого делать не следует, т.к. это проверки по строковому литералу и они ненадежны (можно ошибиться и написать вместо Cube - cube и т.д и потом сидеть искать где же ошибка), гораздо надежнее проверять по типу через GetComponent. Также вы в OnTriggerStay делаете GetComponent вместо того, чтобы просто получить компонент единожды в OnTriggerEnter и закешировать его, это может вызвать проблемы с производительностью, если объектов будет очень много на сцене. Также вам, по всей видимости, абсолютно не нужен метод OnTriggerStay, т.к. все, что там делается не нужно делать пока объект находится в триггере, замените его на OnTriggerEnter. (OnTriggerEnter вызывается единожды, при входе в триггер, OnTriggerStay много раз пока объект находится в триггере, OnTriggerExit единожды при выходе из триггера)
  • Как правильно отображать кнопки на 3d объекте?

    K0TlK
    @K0TlK
    Gregory256, Вот, с этого и нужно было начинать. Тогда вам нужно не куб на UI вешать, а изображения на этот куб и отслеживать нажатия по ним.
  • Как правильно отображать кнопки на 3d объекте?

    K0TlK
    @K0TlK
    Gregory256, Канвас - это 2д пространство, там не надо вращать объекты как в 3д. Какую цель вы преследуете, что вы хотите сделать?
  • Как решить эту проблему с Unity?

    K0TlK
    @K0TlK
    Полностью ошибку прочитайте, что там написано?
  • Как правильно отображать кнопки на 3d объекте?

    K0TlK
    @K0TlK
    Gregory256, Так. Я ничего не понимаю. Вы на канвас повешали куб что ли?
  • Как правильно отображать кнопки на 3d объекте?

    K0TlK
    @K0TlK
    Gregory256, сделайте скрин того, как у вас это все в окне эдитора выглядит.