Холиварофорум

Не все, что говорят на Холиварке — правда!

Вы не вошли.

#1 2022-11-10 21:47:55

Анон

хроники бега на месте [Левел-ап] [Игры]

Короче,накипело. У меня хроническое окр и депрессия. Таблетки не вариант, а вот загрузить мозг учебой - вполне вариант. Тем более, если психическое состояние на памяти и мышлении явно не лучшим образом сказывается.

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

Основные темы самообучения: С++ и уроки на С++ для игрового движка Unreal Engine. Может, кто интересное найдет для себя или подскажет. Ибо тема обширная, а учебного материала по ней мало...

#2 2022-11-11 11:16:56

Анон

Re: хроники бега на месте [Левел-ап] [Игры]

день 1.
анрил начала изучать недавно, пока такие факты и советы:

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

Главное- не нырять сразу в пучину, пытаясь докопаться до каждого термина и класса, лучше по кирпичикам, сначала просто запоминать готовые строки и действия до автоматизма, а потом уже придет понимание, как и почему.

2. как сохранять знания? Лучше всего эксель и ворлд, там много разных полезных возможностей, вплоть до рисования деревьев связей и зависимостей, графиков, есть еще гугл-док, но я пользуюсь one-note (не рекомендую вообще, просто тогда подвернулось под руку, а теперь привыкла).


3. у кого советоваться?
здесь все грустно, есть телеграм каналы, и там даже могут ответить, если повезет.

4. Зачем с++, если в анриле есть возможности для не изучающих язык?

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

Оба эти подхода можно сочетать - с++ файлы и блупринты взаимодействуют друг с другом и дополняют.

Знатоки говорят, что для хорошей производительности нужно именно сочетать, причем 80% проекта(всю логику, функциональность) нужно писать на с++, а блупринтами дополнять модели, материалы, эффекты и другие дизайнерские элементы. Какие-то детали рекомендуется делать исключительно на блупринтах.

Считаю, что для тех, кто знает хотя бы основы с++, на нем работать легче. И дело не только в привычке, но и в человеческом восприятии. Что лучше воспринимается: аккуратный структурированный текст или блупринт, как на примерах ниже?

Пример:
с++ код

Скрытый текст

блупринт-лапша(картинка из интернета)

Скрытый текст

Хотя, может, кем то легче воспринимаются и эти узлы(ноды), а я лично смотрю на них в ужасе.

Отредактировано (2022-11-11 12:09:47)

#3 2022-11-12 23:43:53

Анон

Re: хроники бега на месте [Левел-ап] [Игры]

день 2.
допустим, спрашиваешь " 2+2=?", а тебе дают статьи и часовые видео "решаем 2+2, стоя на голове и жонглируя, пункт первый: предметы для жонглирования". Это потом уже открываются истины, что уроки кажутся такими только для тупых нубов, как ты, но хорошо бы те, кто делали уроки, задумывались - а для кого, собственно они их делают? Хотя какие могут быть претензии к тем, кто БЕСПЛАТНО старается, и опять же - соворисование полезно.

Настоящие уроки не буду разбирать, пока наведу порядок в простых вещах для себя, ну или кому еще полезно.
Поэтому будут такие мини-уроки

1. Пропущу этап настройки анрила под с++ и visual studio и под компьютерные мощности.

2. для тренировки на UE5 создам проект с такими настройками

Скрытый текст

3. должен появиться такой вид, и нажмем на плей

Скрытый текст

4. потом нажать в самом мире, и вот летаем и двигаемся, используя классическое wasd и пробел, и смотрим в разные стороны. И не замечаем, что нам дали персонажа по умолчанию - Default Pawn(перевод - дефолтная пешка).

Мы все видим от лица пешки. А со стороны свою пешку увидеть можно, если нажать F8, и проскроллить мышью.
Вот она в виде шарика, можно ее тыкнуть, и справа появится ее имя.

Скрытый текст

А еще, если тыкать на нее, внизу справа во вкладке details появится информация об этом Pawn

Скрытый текст

Можно там глянуть, и даже поиграть с настройками. Сменить модель на уже имеющиеся, материал, масштаб...К примеру, полетаю деревом

Скрытый текст

5. Шарик летает по освещенной местности, и для каждого элемента тут есть с++ классы. Для формы шарика-класс, для его движений -класс, для освещения -класс, для коллизий, управления и обзора- тоже, и тд. Все эти классы взаимодействуют друг с другом и создают общую картину.

Отредактировано (2022-11-13 15:26:18)

#4 2022-11-14 22:21:59

Анон

Re: хроники бега на месте [Левел-ап] [Игры]

день 3, он же 4

1. Все это хорошо, но мы хотить создать свое, а не управлять дефолтной пешкой.

Для простоты сначала создадим просто объект с моделькой кубика, не прикручивая управление, камеру обзора и прочее. Сделать это можно по разному, но мы сделаем через создание с++ файла(в посте компилятор только Visual studio).

2. заходим внизу в раздел папок под названием С++ classes

Скрытый текст

3.жмем правой мышью в какой нибудь из папок раздела, и "new c++ class"

Скрытый текст

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

Скрытый текст

5. Что же выбрать? И тут нельзя без рассказа об этих классах, для начала об Actor, Pawn, Character

a) Actor из них самый родительский класс. Подойдет для объектов и фигур, которых надо поместить в мире, но без возможности управлять ими игроку.
Также для Actor есть разные полезные классы, именуемые компонентами (о них потом)

б)  Pawn(пешка) - это класс, дочерний по отношению к Actor. Поэтому он наследует методы Actora, плюс имеет свои фишки, к примеру, возможность управления игроком.
Т.е., Pawn, по сути - тип Actora, у которого появился контроль управления.

в) Character(персонаж) - класс, дочерний по отношению к Pawn, который дочерний к Actor.  Поэтому он наследует методы Actora и Pawna, плюс имеет свои фишки, подходящие для анимации живых существ.
Т.е., Character - это по сути - тип Pawna для создания людей, анимированных зверей и тд.

т.е., такая простая связь:

Скрытый текст

а подробнее и правильнее можно и тут почитать https://habr.com/ru/post/357976/

6) Наша цель - создать простой объект с формой и поместить в мир, без всякого управления и прочих сложностей. Как видим из описания наверху, для этого подойдет и Actor, необязательно тут создавать Pawn.
Поэтому выбираем Actor так

Скрытый текст

и создаем.

Скрытый текст

7. Заметки по созданию. При сборке возникнет такая фишка как live coding:

Скрытый текст

По идее, это полезная вещь для компиляции, но не всех устраивает. Если не устраивает - можно на первых порах отключить, и делается это так.
edit->editor preference->поиск live coding, убрать галочку в enable live coding. Скрины:

Скрытый текст

Вторая заметка: в Visual studio при создании файла появится окно "Перегрузить, обновить и тд"
Выбираем "Перегрузить"

Скрытый текст

Третья заметка:
Visual Studio наверняка выдаст список ошибок, типа такого

Скрытый текст

Пока можно не обращать на это внимание, если зеленая галочка повыше есть - все работает.

4я заметка:
если надо удалить с++ файлы - из content browser их так просто не удалишь. И из папки игры удалить недостаточно, придется трудиться побольше, но мне сейчас лень вспоминать..

Отредактировано (2022-11-16 09:16:30)

#5 2022-11-15 23:02:54

Анон

Re: хроники бега на месте [Левел-ап] [Игры]

день 5.
1. Итак, мы создали с++ файл Actor.
Внутри мы видим такое: как мы назвали файл, такой класс и сгенерился, с прибавлением приставки A.
Т.е., я назвала файл SomeActor, и получился класс ASomeActor. Приставка A означает классы, связанные с Actor

Скрытый текст

2. Также наблюдаем, что наш класс - это дочерний класс анриловского класса AActor, т.е., все из него наследует.  (Так будет и с другими классами, т.е., создавая Pawn, получаем дочку класса APawn и тд).

Также можно увидеть виртуальные методы BeginPlay и Tick, но пока в них не будем увязать.

3. Закроем файл, вернемся в наш content browser и полюбуемся на него еще раз

Скрытый текст

А теперь внесем его в новый мир, т.е., зажмем рукой и перетащим на поле. (на плей НЕ нажимаем)

Скрытый текст

И что увидим? На поле - ничего. Но это не значит, что нашего актора нет в мире. Просто мы ему еще не создали модели (mesh) и других нужных функций.

А так он там незримо присутствует, и доказательство этому - новые вещи, появившиеся во вкладках справа:
В outliner появилось его имя:

Скрытый текст

(возможно, придется поскроллить там, чтобы его найти)

А в details - его детали, которые видим, если жмем на его имя:

Скрытый текст

4. И обратим внимание на его название в деталях SomeActor(Instance). Instance - это созданный объект класса(обычно от уровня актор и выше).

Т.е., перетащив файл на поле(viewport), мы создали там конкретный объект нашего класса. И все эти детали справа относятся именно к объекту! Надо это помнить.

5. Можно еще для примера перетащить файл на viewport, создав еще один объект, что отразится в правом outliner

Скрытый текст

Можно каждый переименовать по своему, нажав правой кнопкой по имени и выбрав edit, а там rename.
Можно удалять объекты из мира, выбрав там же edit-delete.

Скрытый текст

ПС: инстансы (объекты) при закрытии проекта сохраняются на уровне ( level), поэтому, чтобы их увидеть, при открытии проекта надо загрузить этот level, но это потом.

ППС: заметим, что инстанса дефолтной пешки сейчас в outliner нет, он появляется только при нажатии play

Отредактировано (2022-11-18 16:18:20)

#6 2022-11-18 00:53:21

Анон

Re: хроники бега на месте [Левел-ап] [Игры]

день 7.

1. Если вы не сохранили уровень, и actor-instance справа исчез, просто надо файл снова перетянуть во viewport.

Как уже говорилось, надо к нашему actor добавить модель(mesh), чтобы он обрел видимую форму и другие свойства.

2. Добавим к нему базовую модель - static mesh. Для этого и ее взаимодействия с нашим actor, мы должны к нашему классу присоединить вспомогательный класс, именуемый компонентом.

Класс-компонент для этого будет StaticMeshComponent.

В коде же он будет с префиксом U: UStaticMeshComponent. Почему такой префикс, надо немного рассказать:

В анриле есть базовый класс UObject, он родительский для большинства классов.
От него наследуют и классы для объектов на сцене, типа Actor, и классы-компоненты, и другие вещи.
Поэтому можно увидеть вот такую зависимость:
             

Скрытый текст

Т.е., U означает связь компонента с UObject.

3. Сначала создадим объект StaticMeshComponent в коде и дадим на него указатель. Для этого в анриле есть готовая формула.

в файле .h в public разделе класса создаем указатель:

UStaticMeshComponent *SomeMesh;

имя переменной можно произвольное, у меня SomeMesh
в файле .cpp в конструкторе пишем такое:

SomeMesh=CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Some Mesh"));

вместо текста "Some Mesh" может быть любой ваш текст, что хотите видеть в разделе "детали" и блупринтах.

Эту готовую форму надо просто запомнить до автоматизма. Мы тут одновременно создаем subobject компонента и указатель на него. И теперь можем пользоваться методами класса-компонента UStaticMeshComponent через указатель.

Можно посмотреть и на скринах:

Скрытый текст

4. Скомпилируем и посмотрим, что же случилось с нашим объектом(instance)? Раз класс изменился, то это должно было отразиться и на объекте. Смотрим его инфу справа:

Скрытый текст

Как видим, появился подраздел Some Mesh(это то, что писали в TEXT). Зайдя в этот раздел, мы увидим, что там все неактивно

Скрытый текст

Чтобы активировать, надо создать взаимодействие нашего с++ кода с блупринтами и редактором анрила вообще. Для этого есть так называемые Specifiers.

Сейчас познакомимся с простым specifier для наших нужд: UPROPERTY(VisibleAnywhere).
UPROPERTY добавляется над декларируемыми переменными, VisibleAnywhere означает, что переменная активна и видна везде - в блупринтах в разделах справа, в деталях и тд.

Теперь код в .h будет такой:

UPROPERTY(VisibleAnywhere)
UStaticMeshComponent *SomeMesh;

и скрин:

Скрытый текст

Компилируем и смотрим в детали instance. Они активны.

6. Теперь в деталях можно добавить модель в разделе StaticMesh, к примеру, куб:

Скрытый текст

Заметка 1: Если компонент мы создаем в с++коде, то саму модель надо добавлять именно в деталях или блупринтах. Да, есть код, позволяющий добавить адрес модели в с++, но это крайне не рекомендуется.

Заметка 2: Если готовых моделей в выпадающем списке нет, то можно загрузить дефолтные так:

Скрытый текст

И теперь модели можно добавлять.

8. Мы видим, что у нашего объекта появилась модель - mesh.

Скрытый текст

Внимание: вспоминаем, что в деталях(details справа) мы все делаем на уровне объекта, а не класса. Поэтому в классе никаких моделей кубов нет! А вот разным объектам одного и того же класса можно добавить разные модели.

9. Модель мы создали, но нужен еще один важный этап - прикрепить StaticMeshComponent к RootComponent нашего класса.
RootComponent специально создавать не нужен, он уже где то есть для нашего actor.

RootComponent, как видно из названия - корневой компонент нашего класса. К нему надо прикреплять другие компоненты разным способом и иерархией.

Мы выберем пока самый простой способ, в конструкторе после созданного subobject запишем:

RootComponent=SomeMesh;

теперь код в конструкторе в .срр такой:

SomeMesh=CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Some Mesh"));
RootComponent=SomeMesh;

Cкомпилируем, и теперь первый этап готов.

9. Чтобы сохранить instance, сохраним этот уровень level. В файле вверху выбираем "сохранить уровень как".

Скрытый текст

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

Скрытый текст

Если нажать туда, то таким образом наш сохраненный объект опять загрузится

Отредактировано (2022-11-21 20:37:49)

#7 2022-11-21 20:05:23

Анон

Re: хроники бега на месте [Левел-ап] [Игры]

день 11.

1. Открываем проект, загружаем уровень с инстансами(см. выше). В outliner теперь, если нажать на имя инстанса, сразу переместит к объекту.
Либо создаем новые инстансы, перетаскивая с++ файл на viewport и добавляя инстансу в деталях модель static mesh.

2. Для наших простых целей "создать объект с статичной моделью и полюбоваться на него" подошел и просто с++ файл, как видим выше.

Но, так как работать в анриле рекомендуется всегда в связке с++файл -> брупринт, то мы сейчас создадим для класса еще блупринт. И будем дальше взаимодействовать одновременно и с с++ файлом, и с блупринтом, и изучать это взаимодействие.

Блупринт(Blueprint - в переводе "план, чертеж") - это средство для визуализирования кода и интерфейса.

4. Для порядка сначала создадим папку (необязательно).
Зайдем в Content, правой кнопкой тыкаем, выбираем New folder:

Скрытый текст

Называем папку, к примеру, Blueprints(или как удобно)

Скрытый текст

5. Теперь возвращаемся к нашему с++ файлу. Тыкаем на него правой кнопкой и выбираем Create blueprint based on YourActorName

Скрытый текст

Выбираем там папку, где создать блупринт файл. И имя файла(предлагается по умолчанию у меня, к примеру, MySomeActor, но я его изменю на BP_SomeActor)

Скрытый текст

И в нашей папке Blueprints должен появиться файл BP_SomeActor (Блупринты можно создавать и по другому, но это не так важно.)

Скрытый текст

6. Надо запомнить, что этот блупринт - тоже класс, и, мало того - это дочерний класс нашего с++класса SomeActor .
Если откроем блупринт, можно увидеть про парент инфу тут, к примеру:

Скрытый текст

(там же можно и заметить все созданные нами компоненты (к примеру, StaticMeshComponent SomeMesh))

Т.е., зависимость такая Парент с++SomeActor <-> дочерний BP_SomeActor. Т.е., все, что меняем в с++, наследуется в bp файле, но не наоборот(хотя, может быть и обратная зависимость, но я до этого еще не дошла).

В блупринте тоже есть возможность многое менять на уровне класса-дочки, и компоненты добавлять, и прочее. Главное понимать  родительскую зависимость.

Главное, что в блупринт-классе, в отличие от с++класса, позволительно добавлять меш, и даже нужно добавлять. Ткнем на вкладку меш-компонента слева и выберем модель(меш) в деталях справа (как видим, знакомая панель)

Скрытый текст

Я выберу конус.

Скрытый текст

Теперь перейдем на вкладку viewport внутри блупринта и увидим нашу фигуру

Скрытый текст

Теперь скомпилируем это все в блупринте(сокращенно бп), нажав слева вверху compile и save

Скрытый текст

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

Проверим, закроем блупринт, и перетащим этот файл на вьюпорт, создав объект-инстанс от блупринта:

Скрытый текст

Как видим, у объекта сразу есть меш конуса. Но на уровне объекта ему тоже можно вносить
изменения (детали справа), к примеру, изменить его меш на шар. Это не коснется его
бп-класса, т.е. на уровне класса будет конус.

В общем, главное понимать зависимости классов и объектов:

Скрытый текст

родитель влияет на объект и дочку, бп-дочка влияет на свой объект, но не на объект от родителя,
короче поманипулировать этим в редакторе и понять связи.

Отредактировано (2022-11-21 20:38:53)

#8 2023-02-09 20:35:47

Анон

Re: хроники бега на месте [Левел-ап] [Игры]

День энный.
Увы, я прекратила анрил, потому что фирма наша закономерно, но все равно неожиданно, свалила в закат из РФ, и теперь я в поиске работы, не до анрила. Надеюсь, вернусь, но многое уже забылось, никогда не делайте, как я.

Подвал форума

Основано на FluxBB, с модификациями Visman
Доработано специально для Холиварофорума