• Что делать если при передвижении персонажа Unity он наполовину под блоки?

    @zukrac
    Если персонаж стабилен (не падает, и не вылетает вверх), то значит дело в коллайдере, который не совпадает с визуальной частью персонажа.
    Ответ написан
    Комментировать
  • Почему скрипт работает некорректно в Unity?

    @zukrac
    Второй IF создает условия для третьего IF.
    Поэтому после IF №2 всегда и гарантированно срабатывает IF №3.

    Может не в этом дело, но это точно ошибка.
    Ответ написан
  • Какой метод оптимизации массовой анимации лучше?

    @zukrac
    Покопай в сторону Animation Instancing
    вот статья
    https://blog.unity.com/technology/animation-instan...
    и то что есть на данный момент оффициального от Юнити
    https://github.com/Unity-Technologies/Animation-In...
    image6.jpg
    Ответ написан
    Комментировать
  • Как различать прыжок и падение?

    @zukrac
    используй еще и вертикальную скорость, что для переменной состояния, что для анимации.
    Идёт вверх - прыгает.
    Разогнался вниз - точно падает. Ещё можно добавить переменную "сам ли нажал прыжок", если надо именно это.
    • isGrounded
    • velocity.y - для различия фазы прыжка (мощно идёт вверх, или гордо падает)
    • isManuallyJumped - нажимал ли кнопку

    isSluchainoFalling = !isGrounded && !isManuallyJumped && (velocity.y < -someFallingVelocity)
    Ответ написан
    Комментировать
  • Можете по простому объяснить, как сделать машину состояний?

    @zukrac
    Машина (допустим MyFsm) управляет состояниями внутри себя.
    И твой игровой Update() не содержит код для всех состояний, он просто содержит 1 строку - MyFsm.Tick()
    Если нужно сменить состояние пишешь MyFsm.SetState(newState).
    Всё, простая машина состояний готова.
    Пример методов:
    public class StateMachine
    {
            public void Tick() {}
            public void SetState(IState state) {}
    }
    public interface IState
    {
        void OnEnter();
        void Tick();
        void OnExit();
    }

    Можно расширить это дело классом переходов - Transition(IState from, IState to, bool Funция predicate) чтобы ограничить машину состояний. И дать предикаты (функции-условия) для переходов.
    Потом в Start() можно будет создать что-то вида:
    fsm = new FSM.StateMachine();
            
    // What states
    var wait = new Waiting(this);
    var move = new Moving(this, 5f);
    var attack = new Attacking(this, Player.Instance);
    
    // Transitions
    fsm.AddTransition(wait, move, () => isTargetInRange);
    fsm.AddTransition(move, wait, () => !isTargetInRange);
    fsm.AddTransition(attack, wait, () => attack.IsComplete());
    
    fsm.SetState(wait);

    и дальше оно само себя управляет. Сделаешь базовое, потом станет понятно что там на Ютубе хотят показать. Я сам долгое время не понимал эту тему.
    Ответ написан
    1 комментарий
  • Как понять что точка принадлежит NavMesh?

    @zukrac
    Либо у агента надо спросить на меше ли он
    NavMeshAgent.isOnNavMesh
    https://docs.unity3d.com/ScriptReference/AI.NavMes...

    Или сразу у меша спросить ближайшую валидную точку к твоей рандомной
    NavMesh.SamplePosition(...)
    https://docs.unity3d.com/ScriptReference/AI.NavMes...

    И конечно попробовать построить маршрут до критически важных точек на уровне. Чтоб никто не застрял.
    Ответ написан
    Комментировать
  • Как динамически создавать множество похожих предметов на сцене, но с разными данными?

    @zukrac
    В момент выпадения рюкзачка ты решаешь что он будет содержать.
    1. в него кладешь конкретные предметы на этапе создания (сцены или префаба). Предполагаю такая возможность есть.
    2. либо кладешь в него динамически. Например через псевдо-предметы которые на самом деле описания предмета, а не сам предмет. Например: тип=меч, уровень=80, остальное=рандом. Или коллекция из набора предметов.

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

    @zukrac
    Если я правильно предположил где запятая, то:
    Ошибка говорит о том что должен быть Collider2D, добавьте его, а Rigidbody2D тут непричем.
    Ответ написан
    Комментировать
  • Как вызывать ивент, когда все уже подписались?

    @zukrac
    1) Либо штатно ждать следующего срабатывания. Монетки ведь обновятся ещё раз?
    2) Либо самому организовать этот момент, глобальное событие "tha_gama_is_started" и по нему триггерить OnCoinsValueChanged
    3) Либо сделать чтобы запись на событие была доступна до создания самого объекта (если это уместно)
    например, через статическую переменную
    public static event OnCoinsValue OnCoinsValueChanged;

    4) Либо сделать объект менеджер событий, чтобы он был синглтон/статический, чтобы он создавался автоматически при попытке записаться на событие. И каждый сам себя подписывал в своих OnEnable
    EventManager::addListener("coin_changed", RenderText);
    Ответ написан
    Комментировать