Вы не вошли.
Страницы 1
Короче,накипело. У меня хроническое окр и депрессия. Таблетки не вариант, а вот загрузить мозг учебой - вполне вариант. Тем более, если психическое состояние на памяти и мышлении явно не лучшим образом сказывается.
Так что тут буду не ныть, а выкладывать заметки, как учусь, прогрессирую и по всячески тяну себя за волосы из болота.
Основные темы самообучения: С++ и уроки на С++ для игрового движка Unreal Engine. Может, кто интересное найдет для себя или подскажет. Ибо тема обширная, а учебного материала по ней мало...
день 1.
анрил начала изучать недавно, пока такие факты и советы:
1. Как изучать? Лучше всего рисовать совы, т.е. делать готовые уроки игр на ютубе или текстовые, или грузить готовые шаблоны игр. А потом разбирать строчки кода. В любом случае, даже если захочется найти привычные уроки без сов - их не найдешь). Наверное, потому что гиблое дело - так учиться.
Главное- не нырять сразу в пучину, пытаясь докопаться до каждого термина и класса, лучше по кирпичикам, сначала просто запоминать готовые строки и действия до автоматизма, а потом уже придет понимание, как и почему.
2. как сохранять знания? Лучше всего эксель и ворлд, там много разных полезных возможностей, вплоть до рисования деревьев связей и зависимостей, графиков, есть еще гугл-док, но я пользуюсь one-note (не рекомендую вообще, просто тогда подвернулось под руку, а теперь привыкла).
3. у кого советоваться? здесь все грустно, есть телеграм каналы, и там даже могут ответить, если повезет.
4. Зачем с++, если в анриле есть возможности для не изучающих язык?
В анриле можно делать код на с++, а можно сделать тот же код на блупринтах - это визуализированный код в виде узлов для тех, кто не изучает язык.
Оба эти подхода можно сочетать - с++ файлы и блупринты взаимодействуют друг с другом и дополняют.
Знатоки говорят, что для хорошей производительности нужно именно сочетать, причем 80% проекта(всю логику, функциональность) нужно писать на с++, а блупринтами дополнять модели, материалы, эффекты и другие дизайнерские элементы. Какие-то детали рекомендуется делать исключительно на блупринтах.
Считаю, что для тех, кто знает хотя бы основы с++, на нем работать легче. И дело не только в привычке, но и в человеческом восприятии. Что лучше воспринимается: аккуратный структурированный текст или блупринт, как на примерах ниже?
Пример:
с++ код
блупринт-лапша(картинка из интернета)
Хотя, может, кем то легче воспринимаются и эти узлы(ноды), а я лично смотрю на них в ужасе.
Отредактировано (2022-11-11 12:09:47)
день 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)
день 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.
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)
день 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)
день 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)
День энный.
Увы, я прекратила анрил, потому что фирма наша закономерно, но все равно неожиданно, свалила в закат из РФ, и теперь я в поиске работы, не до анрила. Надеюсь, вернусь, но многое уже забылось, никогда не делайте, как я.
Страницы 1