Как сделать чтобы персонаж поворачивался

Добавил пользователь Владимир З.
Обновлено: 08.09.2024

Здесь собраны самые распространённые вопросы по данной модификации.

Содержание

Мелкие вопросы [ ]

Как сделать, чтобы NPC сидел? — лежал? — ходил там, где я хочу? [ ]

Как сделать, чтобы NPC летал? — плавал? [ ]

Как сделать NPC женского пола? [ ]

Наложить на модель женский тип текстуры, вам сюда. Научитесь выбирать текстуру на вашего NPC не только из списка, что предлагается по умолчанию, но и из скинов что ещё есть в моде!

Как сделать, чтобы один NPC бил другого? Или: Я не могу ударить/убить NPC? [ ]

Настроить этим NPC разные, враждующие между собой, фракции и установить соответствующие галочки. А желающим убить своего NPC, просто установить любую враждебную или нейтральную для игрока фракцию. Создание и редактирование фракций и их враждебность между собой находится вот тут.

Мой NPC меня троллит, все время пишет: Hello (мой ник). Как это убрать? [ ]

Удалите строчку из кнопки Interact Lines.

Я видел на видео, что NPC может блестеть, как это сделать? Или: Как добавить эффект частиц на NPC. [ ]

При редактировании модели, вот тут, откройте окно редактирования тела (Body). После чего, выберите один из трёх видов частиц, задайте им цвет (если это возможно). И всё, выходите из окна редактирования.

Как сделать так, чтобы NPC кидал зелья, блоки, предметы? [ ]

Во вкладке Инвентарь есть ячейка со стрелой. Сюда вы можете положить любой снаряд который будет лететь от вашего NPC при дальней атаке. Как только эта ячейка чем-нибудь заполнена, NPC будет использовать дальнюю атаку.

Как сделать так чтобы NPC ходил за мной? [ ]

Вам необходимо нанять его как наёмника. Настройте ему работу вот тут.

Как сделать, чтобы NPC при ПКМ не поворачивался и не смотрел на меня? [ ]

Отключите функцию Stop on interact, вот тут.

Прочие вопросы [ ]

Вопросы, над решением которых нужно подумать, а потом действовать:

Как пользоваться модом в игре? [ ]

Модификация весьма обширна. Уже в игре при открытии инвентаря вы можете заметить две новых вкладки. Одна будет отвечать за репутацию к найденным вами Фракциям, а другая за выполняемые в данный момент квесты/задания. И разумеется множество различных существ в игре, чаще всего похожих на игроков. С некоторыми из них можно общаться, для этого необходимо подойти к ним и нажать ПКМ . Далее по существу вы или получите различные возможности, на вроде магазина, банка, наёмника, работающие по стандартному типу для игр, или возможность пообщаться с существом.

Если всё читать внимательно, а создатель карты учел каждый нюанс, то вы насладитесь нормальной игрой. В процессе чего наберётесь опыта и такой вопрос как "Как блин в это играть. " - отпадёт сам по себе.

Как играть в чужие карты с этой модификацией [ ]

Если вы скачали карту из интернета, тогда убедитесь что версия карты совпадает с версией вашего клиента. Так же убедитесь, что к карте не требуются дополнительные модификации.

Карту нужно сохранить в папку: . \.minecraft\saves

Все дополнительные ресурсы обычно размещаются тут: . \.minecraft\customnpcs\assets\customnpcs\.

Не даёт второй квест [ ]

Самая распространённая ошибка 89,4 % пользователей кто, ко мне обращался — звучит примерно так:

или такой вариант с той же проблемой:

Возможно ли добавить свою собственную модель моба? [ ]

Через Custom NPCs такой возможности нет. Можно только изменять стандартную модель игрока (Стива) в различных пропорциях и манипулировать ими. Все модели мод использует из стандартного Майна и модов, что уже установлены совместно. Если у вас есть желание добавить новую Модель, то в интернете полно видео о том как это сделать. И да — Custom NPCs их тоже будет видеть.

Есть ли команды для управлением поведения NPC. Конкретно необходима команда которая бы убивала NPC. [ ]

Как создать квест на освобождения заложника? Какие скрипты для этого необходимы и необходимы ли они вообще? [ ]

Если задание найти заложника, дать ему что-нибудь или поговорить — то скрипты ненужны. А если хочется чтобы, игрок нашёл NPC, а потом тот шёл за игроком, пока игрок его не выведет в безопасное место, то тут нужны скрипты и немало. Увы в программировании скриптов — это не ко мне. М.б. кто грамотный сможет тут создать соответствующую страничку с примерами.

Редактировал диалог с NPC в блокноте. В тексте ошибки исправил. А теперь NPC этот диалог не видит. Что делать? [ ]

Редактирование файла диалогов напрямую? Хмм. Или ты сохранил его с неправильным кодом кодирования (тогда никаких диалогов в целом видно не будет), или где-то удалил или добавил какой-нибудь скриптовый символ ("" и невидно только этот диалог)

Какие параметры у звука? Никак не получается озвучить диалоги. При добавлении ogg-файла и запись в файл Sounds.JSON. Он не виден в списке в игре. А остальные звуковые файлы не воспроизводятся! [ ]

Проверь на всякий случай вот это. Звуковой файл можно сохранять с любыми параметрами в формате ogg. Даже если частота изменена не на 44 100, тогда будет билеберда, но всё равно оно будет играть, если всё сделано правильно. В вашем случае, в файле Sounds.JSON допущена ошибка. Или вы не поставили какой-то символ, или наоборот воткнули лишний. В результате игра не видит вашу строчку с файлом, и не может правильно выполнить запуск стандартных файлов.

Почему нельзя задать количество опыта которое выпадет с NPC? [ ]

Как это нельзя? А это для кого написано? Если при вводе мин. и макс. опыта с NPC (при его убийстве) шары опыта не падают, то у вас проблемы с модификацией. На версиях до 1.8.8 эта функция работает нормально. Попробуйте переустановить его, если это так. Или обратиться к разработчику на форум.

Как заставить NPC выполнить консольную команду в диалоге? Могут ли работать команды типа /noppes …. И как работают Параметры описания @p, @r, @a, @dp? [ ]

Для начала Параметры описания (это такие штуки, которые вместо себя в команде ставят имя игрока):

  • Аргуметны @p, @r, @a — являются основными для игры. (см. командами консоли). Но я напомню:
    • @p — ищет ближайшего игрока от блока (координат NPC или игрока), где или которым вводится команда, и применяет эту команду на него.
      • @r — выбирает случайного игрока в текущем мире из всего онлайна в игре.
        • @a — применяет команду на всех игроков в сети, независимо от мира, где кто находится.
        • @dp — аргумент, который применяет команду на того, кто активировал её. В Custom NPCs такой аргумент срабатывает на тех, кто читает диалог, выполняет квест или запускает скрипт.

        Ну а выполнить консольную команду в диалоге аж 2 варианта:

        Что касается команд мода /noppes … — тут увы, они не являются командами консоли и не будут работать ни в диалогах ни через командный блок. Искал различные варианты решений, ничего кроме скриптования на англ. языке не попадалось. Попробуйте искать ответ в интернете.

        Почему, если рядом 2 NPC Барда, то они не могут одновременно играть музыку, она сбивается у обоих и идёт сначала и так бесконечно? [ ]

        Глюки с проигрыванием длинных треков уже давно и меня бесят. Длинных — это больше 5 секунд. Иногда даже один NPC глючит, в определённый момент времени что-то слетает и NPC начинает проигрывать свой звук с начала, проигрывая всего пол секунды и опять по-новой.(Правка пользователя) Скорее всего это потому что все NPC имеют один звуковой канал, и в момент когда вы ставите двух бардов рядом, они пытаются воспроизвести два разных звука в одном канале.

        Я сделал простую анимацию в Blender и экспортировал ее в Unreal Engine 4. В игре персонаж появился с точки зрения третьего лица, но я сделал его похожим на первого лица, отрегулировав камеру.

        Теперь, когда я включаю камеру в игру, я могу осмотреться в разных частях тела персонажа. (Например, если я повернуть направо, я вижу плечо своего персонажа, и если я столкнусь с фронтом, я вижу только запястья.) Всякий раз, когда я поворачиваю камеру и запускаю анимацию пуансона, она выглядит странно, потому что модель персонажа не является 't выровнен с камерой.

        Как я могу заставить тело поворачиваться вместе с камерой, так что моя анимация выглядит правильно?

        1 ответ

        Друзья, это первая статья по фреймворку LeoECS из предстоящей серии, которая позволит вам быстрее понять, как работать с LeoECS в Unity и решить некоторые виды проблем, возникающих на практике. Все советы, изложенные в них, не представляют собою какой-то свод правил, способы построения подходов, а скорее набор рекомендаций и best practices, которые помогут вам освоиться в работе с фреймворком. Перед чтением убедитесь, что вы понимаете принцип работы архитектурного паттерна Entity Component System (ECS), и ознакомьтесь с документацией LeoECS, так как в процессе изучения фреймворка мы создадим простую игру жанра Top-Down shooter, рассмотрим часто возникающие проблемы и способы решения, и отвлекаться на различные вопросы, связанные с концепцией ECS, не будем.


        Давайте перейдем к практике и начнем с самого главного класса в вашем проекте – EcsStartup. Создайте простой MonoBehaviour класс и прикрепите его к какому-нибудь объекту в сцене – лучше выделить под это отдельный пустой GameObject. Вы можете использовать опциональный интегратор с Unity, тогда EcsStartup и необходимые папки (Components, Systems, Services, UnityComponents) вы можете сгенерировать автоматически.

        Отлично, первый шаг завершен! Давайте создадим наш первый компонент и первую Init-систему, которая будет отвечать за создание сущности игрока и назначение ей определенных компонентов.

        Как видите, мы столкнулись с проблемой. Нам нужно откуда-то взять данные, чтобы передать их в компоненты ECS. Как быть? Первое, что приходит в голову - найти игрока на сцене при помощи тега, названия или даже компонента MonoBehaviour, но давайте копнем глубже.

        Эффективный способ разделения внешних данных

        Давайте немного абстрагируемся от нашей проблемы и подумаем о том, как нам хранить внешние данные. Самый удобный способ управления – разделить их на три типа: Static Data, Scene Data и Runtime Data.

        Static Data представляет собой конфигурацию игры – здесь вы можете сохранять ее настройки, которые не будут меняться в процессе выполнения программы. Это могут быть ссылки на префабы, которые должны быть инстанцированы в рантайме, размеры карты и прочие параметры. Проще всего реализовывать ее через ScriptableObject, ссылка на который хранится в классе EcsStartup.

        Scene Data – это настройки конкретной сцены, которые могут отличаться друг от друга в разных сценах. В ней могут быть, например, спавн поинт игрока или других юнитов, название текущего уровня и другие настройки, индивидуальные для каждой сцены в проекте. По сути, это обычный MonoBehaviour класс, прикрепленный к Startup-объекту, а ссылка на него, аналогично со Static Data, хранится в классе EcsStartup.

        Как же нам получить доступ ко всем этим данным в системах? Штатная реализация data injection в LeoECS позволяет нам в одну строку внедрить экземпляр класса в группу систем с помощью рефлексии. Чтобы обратиться к внедренному экземпляру, необходимо создать поле соответствующего типа в классе системы.

        Вернемся к LeoECS

        Давайте вернемся к PlayerInitSystem и попробуем вложить данные игрока в компоненты ECS.

        Настало время реализовать систему передвижения игрока. Это можно реализовать множеством разных способов. К примеру, мы можем в одной системе ловить данные об инпуте, сохранять их в созданный компонент PlayerInputData, а в другой системе двигать персонажа на основе данных из этого компонента.

        Для этого необходимо добавить поле в компонент PlayerInputData:

        И создать Run-систему, которая каждый кадр будет обновлять значение этого компонента. Не забудьте добавить ее в группу систем в классе EcsStartup.

        Сразу после этой системы в стартапе должна идти другая система, которая двигает игрока.

        Как опытные пользователи Unity, мы знаем, что при взаимодействии с физикой, нам лучше использовать цикл FixedUpdate с фиксированным тикрейтом, чтобы избежать каких-либо проблем с физическими взаимодействиями. Но у нас лишь одна группа систем и запускается она в цикле Update. Выход очевиден – необходимо создать новую группу систем, которая будет работать вызываться в FixedUpdate().

        Кстати, не забудьте правильно настроить компонент Rigidbody у объекта и физический материал поверхности, по которой он будет двигаться.

        Перед тем, как реализовать новый функционал, давайте добавим поле в компоненте игрока, отвечающее за его скорость движения:

        Для инициализации, мы можем взять этот параметр из нашего ScriptableObject - StaticData. Для этого поместим в этот класс поле playerSpeed и зададим значение заранее в ассете:

        В PlayerInitSystem мы возьмем значение из Static Data и положим его в компонент игрока:

        Теперь давайте создадим новую группу систем, которая будет запускаться в FixedUpdate:

        Так будет выглядеть система движения игрока:

        Давайте теперь сделаем так, чтобы персонаж поворачивался сторону курсора. Задача весьма примитивна, мы можем реализовать эту механику в одной системе - PlayerRotationSystem. Мы могли бы получить доступ к Transform’у игрока через компонент Rigidbody, но давайте лучше прокинем его в компонент в init-системе игрока так же, как и прокинули сам Rigidbody.

        Добавим строчку в PlayerInitSystem:

        Отлично. Нам также понадобится ссылка на камеру, давайте сохраним ее в SceneData - нужно предварительно назначить ее руками в сцене.

        Теперь давайте пополним наш список систем updateSystems новой системой, о которой говорили ранее:

        Теперь наш персонаж ходит и поворачивается, но для полноты картины не хватает анимаций. В нашей игре для корректной работы анимаций (когда нужно учитывать и поворот игрока, и вектор движения) необходимо создать Blend Tree в компоненте Animator, чтобы можно было легко смешивать анимации на основе каких-то параметров. Для этого достаточно 5 анимаций: Idle, ходьба вперед, ходьба назад, ходьба влево, ходьба вправо. Вы можете найти как модель персонажа, так и анимации к нему в Unity Asset Store. Я оставлю ссылку на ассет, который использовал, в конце статьи.

        В Blend Tree создайте структуру анимаций, как на картинке:


        Теперь осталось лишь создать систему для заполнения параметров Horizontal и Vertical на основе вектора движения (или пользовательского ввода) и поворота игрока.

        Сначала получим ссылку на Animator так же, как и на Transform и Rigidbody - просто создайте новое поле в компоненте Player типа Animator и добавьте в init-системе игрока строчку, которая заполнит его.

        Теперь создадим систему, которая будет задавать параметры Аниматора:

        Отлично! Теперь наш персонаж движется, поворачивается в сторону курсора мыши и правильно двигает ногами в зависимости от направления движения!

        Заключение

        Мы разобрали основные аспекты работы с фреймворком LeoECS и сделали базовое движение персонажа с анимациями. В следующих частях мы разберем более продвинутые механики и рассмотрим примеры совместной работы “мира” ECS и MonoBehaviour-ов.


        Trogwart


        В какойто из старых версий макса была такая сцена, там глаза персонажа "смотрели" на такой "+", его двигаешь по сцене произвольно, они за ним крутятся. Что-то вроде обратной кинематики, или что-то в этом роде

        Вот сейчас понадобилось так сделать, а как - что-то не догоню никак.

        И еще вопрос, тоже про глаза - как сделать чтобы веки открывались закрывались, вроде там тоже было.. что-то вроде сферы с вырезанным сектором, и его величину замкнуть на wire parametr.

        вобщем буду очень благодарен за помощь. Спасибо!


        Y-Gin



        Trogwart



        Big Goga


        А для второго поставь в той сфере которую ты используешь для век галочка на Slice on и крути параметры. Это в принципе самое простое.


        Goust



        Big Goga



        Trogwart


        Да там они несложные - сферические для мультяшного персонажа.
        Slice on, заюзаю, точно.

        Как все просто оказывается


        Big Goga


        Читайте также: