• Почему бот идет к цели не всегда?

    K0TlK
    @K0TlK
    Герман Коффман, За спираченный ассет в некоммерческом учебном проекте, который увидят 10 человек от силы, тебя никто не засудит. Если это проект для резюме, то, увидев то, что ты понаписал, твое резюме просто откинут в сторону и дальше смотреть не будут. Хочешь через код - делай свою реализацию Behaviour Tree, гугли как оно работает, учись.
  • Почему бот идет к цели не всегда?

    K0TlK
    @K0TlK
    spoiler

    using BehaviorDesigner.Runtime.Tasks;
    using UnityEngine;
    
    namespace BehaviourTree.Brain
    {
        public class LocateTarget : Action
        {
            public float Fov;
            public float CheckRadius;
            public LayerMask TargetMask;
            public Bot Bot;
            public SharedTarget Target;
    
            public override TaskStatus OnUpdate()
            {
                var foundTarget = FindTarget(CheckRadius, TargetMask);
                
                if (foundTarget == null) return TaskStatus.Failure;
    
                var eye = new Eye(Fov, Bot.transform);
    
                if (eye.InSight(foundTarget) == false) return TaskStatus.Failure;
    
                Target.Value = foundTarget;
                return TaskStatus.Success;
            }
    
            private SomeTarget FindTarget(float radius, LayerMask mask)
            {
                var results = new Collider[64];
                SomeTarget target = null;
                if (Physics.OverlapSphereNonAlloc(Bot.transform.position, radius, results, mask) == 0) return target;
    
                foreach (var collider in results)
                {
                    if (collider == null) break;
                    if (collider.TryGetComponent(out SomeTarget found) == false) continue;
                    
                    target = found;
                    break;
                }
    
                return target;
            }
        }
    }


    Проверяем сферой, есть ли в определенном радиусе таргет, проверяем, виден ли он, устанавливаем таргет. Код всё. Далее дизайнер.
    Создаем в дизайнере переменные (Variables):
    target типа Target,
    locateCooldown типа float,
    direction типа Vector3
    Всего должно быть 4 переменные, включая BotInput, который был добавлен ранее.
    62c00dc0e62eb314912433.png

    В дизайнере есть 4 вкладки:
    Behaviour - настройки поведения,
    Tasks - ноды,
    Variables - переменные,
    Inspector - то же самое что и инспектор для обычных геймобжектов, только инспектор для нод, нажимаешь на ноду в дизайнере -> открывается ее инспектор.

    Описывать ноды и что они делают я не буду. В Дизайнере есть описание каждой ноды при нажатии на нее.
    Вот скрин того что я накидал, делай то же самое.
    62c01127163fe207284385.png
    Чтобы ставить ноды - заходишь в Tasks и выбираешь нужную, ноды, у которых значок -------> это sequence ноды, я их переименовал. Ноды с треугольником - Actions (на самом деле Leaf, но разработчик дизайнера, по всей видимости, не очень умный).
    Итак первый репитер:
    в инспекторе выставляешь Repeat forever в тру, end on failure - false
    Далее сиквенса Try Locate Target:
    Locate target
    62c012ab235e3130651811.png
    Wait
    62c012d2565fd740710121.png

    Далее сиквенса Walk Around и настройки всех ее нод
    62c015ba42f28572464848.jpeg

    Правый репитер:
    count 0,
    repeat forever true,
    end on failure true

    Follow Target и ее ноды:
    62c0167189a09819272961.jpeg

    Таким образом можно из простых скриптов создавать сложное поведение гораздо быстрее и удобнее, чем делать все это через код.

    Вот так все в итоге выглядит: https://imgur.com/a/RpnFCku
  • Почему бот идет к цели не всегда?

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

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

    K0TlK
    @K0TlK
    Владимир Юрченков,
    Да и спотыкаться лучше ему самому

    Ты ему сейчас грабли под ноги положил.
    и улучшать код

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

    K0TlK
    @K0TlK
    Владимир Юрченков, Нет. В том то и дело, что оно даже для новичков не пойдет. Чел 2 часа пытается понять как работает юнити, у него что-то ломается, а как пофиксить он не понимает. "#Профессионал" из него как из Майка Тайсона балерина. Пустая трата времени, лучше ссылку замени на https://learn.unity.com/
  • Как сделать передвижение и прыжок игрока?

    K0TlK
    @K0TlK
    Удоли. Столько видео в интернете на эту тему и ты выбрал его. Самая ужасная ошибка в твоей жизни только что была совершена. Хуже уже не будет, можешь ничего не бояться.
  • Почему Raycast даёт ложный результат?

    K0TlK
    @K0TlK
    Zefirot, Vector3.up = 0, 1, 0. Vector3.down = 0, -1, 0. Абсолютно не важно что писать -up или down, но явное up, down, right, left, forward, back более читаемо, чем up, -up и т.д. Минус можно и не заметить, слово down ты явно не пропустишь.
  • Почему Raycast даёт ложный результат?

    K0TlK
    @K0TlK
    Vector3Down у тебя, конечно, очень интересный. Уже есть Vector3.down, зачем тебе твой костыль - непонятно. Также ты дистанцию рейкаста указываешь 0.1f, соответственно он у тебя в направлении Vector3Down пройдет расстояние 0.1f => ни с чем, кроме коллайдера, в котором он был изначально заспавнен, не столкнется и вернет false. Debug.DrawLine и Physics.Raycast работают по-разному, тебе нужно не DrawLine делать, а DrawRay.
  • Что я не так делаю с интерфейсами?

    K0TlK
    @K0TlK
    Герман Коффман,
    1. TryGetComponent вместо нескольких обычных GetComponent используется, чтобы не делать миллион проверок на null, как у тебя в примере.
    foreach (GameObject obj in _botsee_cs.GetObjectThatISee())
            {
                if (obj.GetComponent<IHealth>() != null)
                {
                    if (obj != gameObject)
                    {
                        if (obj.GetComponent<IHealth>() != null)
                        {
                           if (obj.GetComponent<IHealth>().GetWarSide() != _health.GetWarSide())                       
    {
                                return obj;
                            }
                        }
                    }
                }
            }


    2. Посмотри доки по TryGetComponent и out. TryGetComponent возвращает bool, а этот параметр нужен, чтобы получать компонент, если он найден.
    3. Вызывает ивент Over, если значение хп == 0. Вопросительный знак - проверка на нулл. Если на Over не будет подписано ни одного метода, то вызываться он не будет.
    4. Какую фукнцию(метод) и откуда ты его будешь вызывать?
    5.Обобщенный интерфейс, чтобы потом, в случае чего можно было в качестве зависимости передавать не какую-то реализацию, а абстракцию в виде IMutable. IMutable и IFinal нужны для того, чтобы не перегружать IHealth лишними ответственностями, чтобы потом взаимодействовать только с нужным интерфейсом.
  • Как оптимизировать изменение размера камеры?

    K0TlK
    @K0TlK
    yraiv, Когда начинает все лагать, тогда в профайлере и ищи причину. Поиск по имени/тэгу/любому строковому литералу изначально плохая затея. Ровно как и поиск в апдейте. В первом случае опечатаешься в строке => иде не скажет, что там ошибка => ищешь ошибку сам. Второе вообще бессмысленно, т.к. компонент можно единоразово закэшировать и обращаться уже потом по ссылке на него.
  • Как оптимизировать изменение размера камеры?

    K0TlK
    @K0TlK
    обязательно засовывать это всё в update?
    А тебе надо, чтобы оно в апдейте было?
    не сильно ли это нагружать будет бедный телефон?
    А оно нагружает его сейчас?
    Чему там нагружать то? Трем математическим операциям?
  • Какие полезные ресурсы/статьи по UNITY можете посоветовать для развития?

    K0TlK
    @K0TlK
    KraGen, Объект - это не мешок с данными и методами. У него есть собственное неизменяемое состояние и поведение. Объектом здесь можно назвать только Cash1, он иммутабельный, все остальные мутабельные, поэтому в ооп они объектом не будут считаться, хотя и похожи, они просто мешки с данными. Когда я говорю объект - это не означает класс. Вот объект - var dollars = new Cash1(10). Когда я по ссылке к нему обращаюсь, я не могу взять и изменить его состояние, не могу превратить 10 в 20 и т.д. Cash1(10) уникален, он не может быть Cash1(100). Изучай ооп. На первой странице гугла нет ничего нормального, поэтому не смотри что там пишут. Можешь почитать хотя бы эту статью, чтобы начать понимать что такое объект. И, чтобы чему-то научиться, просто больше пиши код, копируй какие-нибудь игры из гугл плей/стим. Старайся как можно реже использовать MonoBehaviour, для паблик методов делай интерфейсы, передавай в качестве зависимостей интерфейсы, а не какие-то конретные реализации. Короче, больше код пиши, нет каких-то ультимативных ресурсов, куда можно зайти и узнать всё.
  • Какие полезные ресурсы/статьи по UNITY можете посоветовать для развития?

    K0TlK
    @K0TlK
    KraGen, Получается объект - сущность с данными и методами для того чтобы взаимодействовать с ними? Тогда
    public class Cash1
    {
        private float _value;
    
        public Cash1(float value)
        {
            _value = value;
        }
    
        public override string ToString() => $"${_value}";
    }
    
    public class Cash2
    {
        private float _value;
    
        public Cash2(float startValue)
        {
            _value = startValue;
        }
        
        public void SetValue(float value)
        {
            _value = value;
        }
        
        public override string ToString() => $"${_value}";
    }
    
    public class Cash3
    {
        private float _value = 0;
    
        public void SetValue(float value)
        {
            _value = value;
        }
    
        public float GetValue() => _value;
        
        public override string ToString() => $"${_value}";
    }


    где здесь объект и почему? 1, 2, 3, все или ни один?
  • Какие полезные ресурсы/статьи по UNITY можете посоветовать для развития?

    K0TlK
    @K0TlK
    KraGen, Откуда там своему языку взяться, c# используется как скриптовый язык, чтобы ты скрипты на нем писал, для остального в движке используются другие языки. Вопрос не про с# или юнити конкретно, а про ООП. Что такое объект с точки зрения ооп.