Raycast`s Path Of Despair
День добрый. В связи с большим количеством сообщений с просьбами поподробнее рассказать о скриптах в проекте, решил начать небольшими порциями выкладывать маленькие посты, но почаще о внутренностях моего проекта(если это будет кому-то интересно).
Начать я решил с рейкастов.
Если персонаж заходит за предмет окружения с тегом "Environment" и добавленным скриптом VisibleInvisible:
В этом скрипте указывается стандартный материал объекта, и материал с прозрачностью 70%.
Чтобы сильно не грузить сцену кучей проверок в Update было ли соприкосновение с определенным объектом или нет, я решил сделать все это в скрипте персонажа.
На старте находим нашего игрока (этого можно было бы избежать, если бы не было смен сцены, добавили бы просто в инспекторе ссылку на персонажа и все).
В update кидаем луч из камеры в игрока, проверяем на попадание в нужный тег. Заведомо определив GameObject go ( для того, чтобы в дальнейшем включить ему обратно стандартный материал). А дальше проверки если цель изменилась - включаем старой цели стандартный материал, а новой цели меняем на прозрачный.
А в этом скрипте часть логики на видимость противником нашего персонажа.
Если персонаж в зоне агро радиуса, то получаем bool CheckPlayerVisible если true , включается логина достижения цели или атаки, если false - продолжение патрулирования или ожидания.
Метод Agro увеличивает агро радиус у противника, и запускает Invoke на восстановление его к стандартному значению. Стоит, например 2 врага друг от друга на 30 метрах. Агро радиус у обоих 20 метров. Если 1 враг агрится на персонажа, то он запускает метод Agro у соседнего врага, чтобы он тоже "увидел" игрока и соответственно сагрился, если персонаж в прямой видимости( CheckPlayerVisible никто не отменял ).
Ну, как-то так. Если кому-то будут интересны такого рода описания - дайте знать.
Ну и на последок ссылка на группу в вк =) https://vk.com/pathofdespair
Кто хочет быть в курсе всех новостей - добро пожаловать.



По первому пункту.
1. Зачем расстояние на 10к у райкастов?
2. Почему райкаст не через RaycastAll? Если я правильно понимаю код, если будет стоять несколько деревьев в ряд, или стена за деревом большим, прозначным будет становится только ближний объект к камере.
3. Не думал о таком? Реализуется довольно просто, выглядит в разы лучше.
По второму пункту.
Костыльнул, поздравляю)
У тебя не должен увеличиваться радиус видимости игрока, это не правильно.
Логика должна быть примерно такая.
1. Враг видит игрока.
2. Рейкастишь сферой (от врага) 30м вокруг других врагов.
3. И всем найденным врагам кидаешь в какой-нить метод вида "CheckThisAreaForThePlayer", последнее актуальное метоположения игрока. Враги срываются, и бегут проверять область. И если они замечают игрока со своим радиусом обнаружения, начинают бой.
Тому врагу, который первый заметил игрока, можно приделать анимацию свиста, или еще чего либо. В духе, он замечает противника, свистом сигнализирует своим союзникам о наличии и местоположении игрока. Они бегут на помощь.
Указывать нужно именно точку, а не самого игрока, чтобы у него была возможность подсьебаться.
Если игрок успел свалить, пускай попатрулируют область последнего нахождения, и валят на свои точки первоначальные, делать свои дела.
Или идем еще дальше, создаем какой-нить класс "Squad". И собираем уже врагов в отряды. А там чего только нельзя реализовать. Разбитие врагов на солдат, командиров. Виды солдат. Их поведение. Кто кого должен защищать, кто как должен на что реагировать. И т.д.