Ответы пользователя по тегу Unity
  • Как заставить работать кликер в фоновом режиме?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    В полноценных кликерах и других играх, где используется игровой процесс в "нерабочем" состоянии - либо работает механика на сервере (что на самом деле редко делают, только в случаях возможного влияния других игроков извне), либо осуществляют ускоренную симуляцию.
    Например, есть какое-то здание, которое накапливает золото с течением в ремени по формуле
    сurrency(t) = t*currencyPerSecond
    где t - время, а currencyPerSecond - количество валюты, начисляемое в секундах.
    В итоге игрок сидит и играет, каждую секунду получает по currencyPerSecond. И тут мы должны куда-то сохранять момент, в который мы последний раз получили эту валюту. Например, в 11:00 игрок получил currencyPerSecond и у него теперь 10000 золота. Мы это записали и сохранили в файл сохранения, какой-нибудь json или типа того.
    Игрок закрыл игру и открыл через пол часа, в 11:30.
    Мы пошли смотреть, когда игрок последний раз получил валюту - в 11:00, а сейчас 11:30 - значит он отсутствовал 30 минут и мы должны нагенерировать ему
    30*60*currencyPerSecond (30 минут * 60 секунд * на величину получаемого золота в секунду)

    И тут-то, если больше 0, то показываем игроку окно, что "У вас накопилось 30*60*currencyPerSecond валюты. А в сумме у вас 10000 + 30*60*currencyPerSecond".
    currencyPerSecond - может само по себе быть формулой, типа количество построенных зданий * 2 или типа того.
    Ответ написан
    Комментировать
  • Как запретить движение игрока?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Смотри, самый хороший вариант - инкапсулировать управление. В частности создать класс, который будет слушать управление у Input.GetKeyDown и хранить в себе вектор перемещения например.
    Типа сделать интерфейс IInputService, у которого есть метод Vector3 GetMoveDirection() - реализации этого метода будут брать Input.GetKey(*W/A/S/D*) (или мобильное управление) и определять куда надо двигаться.
    А для того, чтобы заблокировать/разблокировать движение игрока - реализовать IInputService.Lock / IInputService.UnLock в которых будет "лочиться управление" через переменную IsLock. И уже в каждой конкретной реализации проверять, не заблокировано ли управление.
    Что-то вроде:
    public Vector3 GetMoveDirection()
    {
      if(IsLock){
        return Vector3.zero;
      }
      //а тут уже реализовать логику определения движения персонажа
    }
    Ответ написан
    Комментировать
  • Как настроить панель, чтобы работали кнопки панели, находящейся под ней?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    По хорошему конечно нужно разделить на отдельные элементы и корректно расположить элементы в иерархии. Попбробуй снять галочку Raycast Target с компонентов Image на прозрачной панели.
    Эта галочка просто говорит, что мол, нужно ловить нажатия. Если она снята с Image, то он просто не будет ловить их. Но! Важно, чтобы кнопки на панели, которые будут нажиматься - имели этот Raycast Target. Иначе они перестанут работать
    Image Component
    61719ef0c40f3171546293.png

    P.s.
    В иерархии они на одном уровне.
    Такого не может быть. В иерархии так или иначе один элемент находится выше другого. То, что находится ниже - будет отлавливать все нажатия на себя (если Raycast Target навешен) Так что тут либо убирать Raycast Target, либо разделять на отдельные элементы.
    Ответ написан
    2 комментария
  • Как исправить оишбку спавнера unity?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Это ошибка возникает когда ты обращаешься к элементу, который ты ещё не создал. Т.е. к некоему экземпляру класса, который ты ещё не проинициализиировал. Так что простого ответа WHAT TO DO нет
    Ответ написан
    Комментировать
  • Почему элементы UI отображаются во всех сценах?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Вижу 2 возможные проблемы:
    1. Где-то на родительском объекте UI висит Object.DontDestroyOnLoad.
    2. Ты подгружаешь новую сцену параллельно, и UI сохраняется, так как у тебя висят 2 сцены одновременно.
    Ответ написан
    Комментировать
  • Как сделать отображение сцены поверх экрана блокировки в Unity?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Такого функционала в Unity по умолчанию нет. Стоит посмотреть как делаются виджеты на Kotlin/Java или Swift(для iOS) и написать такой виджет на запуск вашего приложения, а уже потом из него и запускать игру.
    Ответ написан
    Комментировать
  • Возможно ли отписаться от Update?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Update - это не событие. Это метод. "Отписаться" нет возможности.
    Большое количество Update'ов в монобехах вызывают дополнительную нагрузку, поэтому на больших проектах делают отдельные Системы в которых есть 1 Update, который дёргает свой кастомный эвент и уже на этот эвент подписываются отдельные монобехи. И вот там можно будет подписываться/отписываться сколько душе угодно. Причём тут можно будет получить контроль над временем, не привязываясь к статичному Time. Так на одном из проектов делали плавное замедление времени без замедления игрока и UI.
    Ответ написан
    Комментировать
  • Где хранить состояние с параметрами для сцены?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Вопрос паузы - это вопрос арихитектуры проекта.
    Самый простой - завести статичную переменную "GameController.IsPause" или типа того. Но тут могут повсплывать куча багов, если из кучи разных мест будешь дёргать. Более умным подходом будет Singleton, в который стоит отправлять ещё и объект, который вызвал паузу для менеджмента коллизий, когда несколько объектов паузу вызывают, а один из них снимает. Т.е. чтобы не было ситуации, когда 2 объекта считают, что нужна пауза, но какой-то 3й эту паузу сбрасывал. Через Singleton-класс можно иметь доступ к всем объектам, которые хотят поставить паузу и определять их важность/приоритет. Но вообще синглтоны тоже не являются хорошей практикой сейчас, но для старта - самое оно.
    А вопрос хранения параметров мобов и настроек -это StaticData - данные, которые заполняются 1 раз и больше не трогаются в самом геймплее. Для этого используют ScriptableObject'ы. Т.е. заводятся такие обжи с данными, которые ты заполняешь как монобехи в префабах, а потом отправляешь их в MonoBehaviour'ы, откуда читаешь данные и задаёшь требуемые параметры.
    Ответ написан
  • Почему не срабатывает нота при нажатии на клавишу?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Потому что метод aboba. Переименуй в Update и всё должно заработать
    Ответ написан
    Комментировать
  • Как скопировать анимацию с одного объекта на другой в Unity?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Должна быть одинаковая иерархия объектов(в том числе и именнование обжей в ней) - тогда анимации автоматически подтягиваются через сериализацию
    Ответ написан
    Комментировать
  • Можно ли в инспекторе полю типа string присвоить составное значение?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Да, для этого можно реализовать юнитёвский метод OnValidate. Он будет отрабатывать в редакторе при зменении префаба или его загрузке.
    #if UNITY_EDITOR
    		
    		private void OnValidate()
    		{
    			if (content == "")
    				content = $"Heal recover {Player.MaxHealth / 10} HP.}";
    		}
    
    #endif


    Либо динамически подставлять.
    Типа:
    content = "Heal recover {0} HP";
    ...
    var result = string.Format(content, 42);

    Тут вместо 0 будет передаваться 42. Просто отправляй туда нужные тебе данные, в данном примере Player.MaxHealth / 10.
    Ответ написан
  • Как сделать подобный эффект?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Если ты про свечение - есть классная либа https://github.com/PandaArcade/UIOutline
    Если нет - поясни что ты хочешь? По идее всё делается просто подкладкой спрайтов под слоты
    Ответ написан
    Комментировать
  • Как сделать прыжок, который независит от текущей скорости?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    _rigitbody.AddForceдобавляет ещё один вектор прикладываемой к объекту силы. Итоговое движение происходит под равнодействующей сил.
    Другими словами, когда ты накидываешь Vector2.up * _jumpForce результирующая сила не будет направлена только вверх, если где-то на тело добавлялась другая сила. Т.е. по твоему описанию всё выглядит так, что где-то на тело действует сила тяжести вниз, которая примерно равна силе, которой ты пытаешься поднять вверх. И потому он вообще не движется или движется еле-еле
    Ответ написан
    Комментировать
  • Почему на готовом билде под Android через раз работает нажатие на UI?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    А в редакторе при таком же соотношении сторон всё работает корректно?
    Просто при вёрсте на устройствах могут возникать проблемы, кода неучли разметку и какие-то изображения налазят на кнопку сверху, блокируя их. Стоит посмотреть, могут ли какие-то прозрачные элементы или тексты с активными галочками RaycastTarget'ами налазить на кнопки.
    Ответ написан
  • Как объектам массива задать разные координаты спавна?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Ну для начала стоит показать код который не работает.
    А затем просто указать куда спавнить объекты.
    Вот например рабочий пример кода:
    public GameObject[] Prefabs; //тут говорим какие префабы спавнить
    
            public void Start()
            {
                for (var index = 0; index < Prefabs.Length; index++)
                {
                    Instantiate(Prefabs[index], Vector3.one * index, Quaternion.identity); //тут говорим: какой префаб спавнить, какие координаты и какой поворот
                }
            }
    Ответ написан
    Комментировать
  • Как исправить дёрганье спрайта?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Нужен пример кода, как ты перемещаешь игрока?
    Ответ написан
  • Как сделать свободное перемещение обьекта/NPC?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Для перемещения в 3х мерном пространстве можно использовать NavMesh. На YouTube много разных туторов на эту тему. Например вот.
    А для 2D пространства нужно уже что-то своё делать. Описывать пути перемещения руками. Это поищи про перемещение Rigidbody2D.
    Ответ написан
    Комментировать
  • Почему гугл защита блокирует мою игру?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Я сталкивался с подобной проблемой - решилось тем, что просто очистил больше места для установки, так как ошибка была в нехватке памяти. Но тебе стоит снять логи с устройства через LogCat, чтобы посмотреть что за ошибка тебе вываливается. Сейчас это просто гадание на кофейной гуще.
    Ответ написан
    Комментировать
  • Как создать объект в объекте Unity?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Если noteTile - это ссылка на объект, который уже есть в сцене, то нужно не инстанцировать объект, а просто поменять родителя
    noteTile.transform.parent = parent.transform;
    где parent - это GameObject в который нужно поместить noteTile
    Если же noteTile не инстанциирован - то стоит сначала заинстанцировать, а уже потом задавать различные параметры.
    Ответ написан
    Комментировать
  • Как восстанавливать часть объектов на сцене при "перерождении" после смерти (платформер 2д)?

    red-cat-fat
    @red-cat-fat
    Делаю игры
    Тебе так или иначе нужно где-то хранить информацию о внесённых изменениях. Самый простой способ - завести компонент (CoinCollect), который сделать неразрушимым при перезагрузке с помощью DontDestroyOnLoad и в него заносить список тех монеток, которые ты подобрал. А при генерации монеток при рестарте стоит спавнить только те, которые ты не подобрал, обращаясь к списку из этого компонента(CoinCollect).
    Ответ написан