Как сделать счетчик очков в ue4

Обновлено: 07.07.2024

Эта страница Вики посвящена снижению порога вхождения для новых программистов на C++ .

Если у Вас есть общие вопросы, Вы пытаетесь получить больше комфорта с C++, пожалуйста, задавайте их в дискуссионной вкладке.

Я и, надеюсь, другие смогут ответить на эти вопросы.

С чего лучше начать изучение UE4 C++ ?

Лично я рекомендую начать с расширения класса PlayerController, а затем сделать Blueprint из него.

Потом Вы сможете указать свой пользовательский PlayerController в вашем Game Mode Class.

У меня есть урок на эту тему:

ClientMessage

Когда Вы изучаете C ++, Вы должны быть в состоянии дать себе обратную связь, о том, что функции работают, алгоритмы получают информацию, и о том что разные части кода на самом деле отрабатываются.


Вы можете использовать логирование для этого, но также можно использовать ClientMessage!

Мне нравится ClientMessage, потому что 'всё, что Вы должны сделать, это нажать ~ или другую клавишу, чтобы открыть консоль' и Ваша обратная связь появится тут.

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

PlayerController встречается повсюду

Фактически в любой игре будет PlayerController, так что это хорошая точка входа в мир UE4 C++ :)

Что такое (->), ( ), (::) ?

Я видел, что в C++ мы используем дефис со стрелкой (->), а не точку, как в других языках (.). Но я также видел использование двойных двоеточий (::) которые я не понимаю. Вы можете, пожалуйста, объяснить- что делают с помощью этих символов в C++? Какая разница между (->) и (::) ?

Например, UnrealEdEngine.cpp (\UnrealEngine\Engine\Source\Editor\UnrealEd\Private), Вы можете увидеть функции UUnrealEdEngine ::Init в строке 26. Почему эта функция использует двойное двоеточие? И внутри этой функции я вижу Super::Init(InEngineLoop).

Я ожидал увидеть Super->Init(InEngineLoop), но вместо него двойное двоеточие. И внутри этой функции большинство вызовов с помощью двойного двоеточия. Поэтому пожалуйста: объясните разницу между (::) и (->) и (.) .

(->) означает, что это переменная, указывающая на данные. То есть переменная является ссылкой на контейнер, хранящий данные.

Это означает, что(.) это прямой доступ к реальным данным, в то время как (->) это косвенная ссылка на данные, которые могут и не существовать на самом деле.

То есть (->), может указывать на хранилище (контейнер) данных, которого на самом деле не существует.

Таким образом, Вы всегда должны проверять такие переменные!

Пример

После создания LocationPtr не указывает на хранилище данных, её необходимо связать с фактическими данными.

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

Теперь, когда мы связали LocationPtr, мы можем получить доступ к переменной X с помощью косвенной ссылки (->)

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

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


Если указатель ссылается на фактическую переменную, Вы можете получить к ней доступ, воспользовавшись стрелкой (->).

Использование (::)

(::) говорит о пространстве имён (namespace) / или области видимости функции или переменой.

Это означает, что функция объявлена в классе UUnrealEdEngine.

Так как функция инициализации является виртуальной, Вы можете вызвать версию функции из родительского класса (и Вы должны это сделать!)

Super означает родительский класс UUnrealEdEngine.

Для чего это?

У Вас есть огромная власть и свобода в C++!

Это, возможно, то, что делает его немного более сложным, для изучения :)

Вы можете объявить функции и переменные в любом месте в C++, поэтому используются (::) чтобы разграничить области: различные классы могут иметь переменные и функции с тем же именем, но при этом компилятор их будет различать.

Пример

Например, у Вас есть классы AMyTree и AMyFlower.

AMyTree хочется иметь функцию GetLocation (), так же как и в AMyFlower.

Однако в C ++, Вы работаете на очень низком уровне, что означает, что Вы можете объявить функции и переменные в глобальном пространстве имён.

Если Вы просто объявите переменную или функцию вне класса(class) или структуры(struct) или пространства имен(namespace),

то тогда эти функции и переменные будут объявлены в глобальном пространстве имён и будут вызываться везде, где бы они не использовались.

Это на самом деле очень полезно для ! Однако, это вызывает проблемы для AMyTree и AMyFlower, где в обоих классах требуется функция GetLocation ()! Если Вы не будете использовать (::), то компилятор не сможет различить GetLocation () для AMyTree и для AMyFlower при компиляции! Используя (::) Вы говорите компилятору: какая версия функции для какого класса.

Если бы не (::)

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

Что значит, Т? В таких случаях как TSharedRef, TWeakPtr, TArray и т.д. "

Не допускайте, чтобы T запутала Вас! Воспринимать код с ней немного сложнее, так что постарайтесь игнорировать её для себя в таких ситуациях как этот:

..и просто читать следующим образом:

Буква Т нужна, но это скорее заявление о типе класса- Array. Представьте себе: имена классов могут быть разных цветов, Т просто один цвет, или вкус класса в UE4. Но, если Вы пытаетесь прочитать код и если Вы не игнорировали ее, то буква Т может помешать пониманию- что делает сам класс.

Общая Ссылка

Еще один пример:

Читая без T, мы видим "Общая Ссылка" (SharedRef). Игнорируя T, Вы можете читать основной код значительно легче, чтобы получить четкое представление о значениях каждого класса. Просто убедитесь, что использовали T, когда Вы попытаетесь работать с классом :)

Префиксы

Зачем нужны дополнительные префиксы. Например

  • зачем F в FVector и FSourceControlStatePtr
  • зачем T в TSharedRef, TWeakPtr, TArray
  • зачем U в (я думаю это Unreal) UObject, UUnrealEdEngine
  • зачем G в GIsEditor, GSlowTaskOccurred
  • и так далее.

За исключением G, это как цвета или вкусы классов в UE4. Каждая буква указывает на то, от какого класса унаследована та или иная сущность.

EPIC, Официальная документация по классам

Epic подробно рассказывает что означают данные префиксы:

Хорошо, так что в действительности означает T ?

В исходных кодах UE4, все типы данных имеют префикс указывающий на его категорию, например: Т используется для обозначения класса шаблона: TSharedRef, TWeakPtr, TArray и т.д.,- это всё шаблонные классы. Префиксы позволяют легко отличать имена классов от имён переменных, поскольку имена переменных обычно не объявляются с префиксами в исходных кодах UE4 (одно исключение к этому правилу- имена логических переменных (bool), они начинаются с 'B').

В общем T даёт Вам понять две вещи:

  1. Вы смотрите на название типа (не имя переменной).
    1. Этот тип данных является шаблоном класса.

    Так же есть и другие префиксы, которые можно найти в исходниках, например, U, A, S, I и F. Вы можете прочитать об их значениях здесь:

    Да, префикс перед именем типа выглядит несколько некрасиво. [1] ,но может быть гораздо хуже (Посмотрите 36-строчный фрагмент кода ближе к концу статьи).

    В качестве объяснения, шаблонные классы это такие классы, которым можно определить "подтип" к "основному типу". Для TArray, подтип может быть типом данных, которые буду хранится в нём, например:

    Это получился контейнер для ряда значений типа FString. Без шаблонных классов, Вам бы пришлось,"просто знать", что на самом деле массив "MyBadVariableName" содержит переменные типа "FStrings", но благодаря шаблонным классам это знает и компилятор, и это хорошо, так что Вам не придется держать столько вещей в свое голове во время чтения магически-запутанного вуду кода вашего друга.

    Вы можете больше прочитать о шаблонных классах здесь:

    Указатели

    Указатели (*) и ссылки (&). Я с трудом понимаю как их использовать. Что они такое? Вы можете показать несколько примеров того, как использовать и где использовать и какие преимущества их использования ?

    Это, пожалуй, самое главное что надо понять новичкам, чтобы действительно достичь прогресса в C++. Если у Вас есть четкое представление об указателях, то Вы должны быть счастливы от программирования в UE4 C++! Указатели чрезвычайно-мощные и немного опасные, потому что дают Вам силу, которая у них есть.

    Указатель ссылается на адрес памяти, где хранятся фактические данные. Чтобы получить адрес памяти для указателя, нужно использовать (&).

    Всегда проверяйте ваши указатели

    Прежде чем пытаться получить доступ к данным, указатели должны быть связаны, Вы всегда должны проверять это:

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

    Разыменования указателей (Получение доступа)

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

    Разыменования с помощью (*)

    Разыменования с помощью (->)

    Зачем использовать указатели?

    • Указатели дают Вам прямой доступ к области памяти, которая может быть далеко-далеко от локального контекста в котором работает ваш код.
    • Указатели также дают Вам возможность работать с огромными объёмами данных без создания копии этих данных.
    • Указатели дают Вам живую связь, с динамическим обновлением данных, которые всегда будут актуальными, потому что указатель это косвенная ссылка, и её не надо менять, чтобы обновились данные.

    Доступ к данным издалека

    Скажем, у Вас есть персонаж, который является частью подуровня, который является частью мира, который является частью далекой Галактики. Чтобы фактически получить доступ к переменной "Броня" этого персонажа, Вам надо пройти через целый ряд гетеров (Gets), как то так:

    Описанные выше операции являются дорогостоящими и тратят много процессорного времени, также это усложняет чтение кода. Код выше, однако, является способом доступа к текущей броне персонажа в далекой-далекой галактике. Было бы не плохо сделать эту сложную операцию извлечения только один раз, и получить своего рода ссылку, своего рода указатель на фактические данные, для быстрого доступа:

    Теперь, чтобы получить данные о броне, Вам не придётся писать

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

    Вместо этого Вы можете написать:

    Видите насколько это легче прочитать? Но подождите, это еще не все!

    Доступ к огромным объемам данных в любой момент

    Указатели могут быть связаны со сравнительно-небольшим объемом данных, или с большим или даже с гигантским объемом данных!

    Продолжая приведенный выше пример, можно спросить, "Почему я не могу просто создать копию переменной "Броня" ?"

    Но что, если FArmorStruct содержит гигантское количество данных, и Вы хотите сделать это для 300 персонажей по всей галактике? Вы бы стали копировать данные много раз. Но данные уже есть в одном месте памяти. Зачем Вам копировать их несколько раз, тем самым дублируя данные? Указатели позволяют избежать этого! Вы можете просто указать на одну ячейку в памяти и получать доступ к ней в любое время.

    Будьте в курсе изменений в реальном времени

    Также как и в приведенном выше случае, когда Вы копировали данные брони, это уже не броня персонажа из другого мира. Вы потеряли живую связь с бронёй. Так что, если персонаж из другого мира решит изменить цвет брони, Вы не будете знать этого! Указатели дают знать Вам актуальные данные, потенциально большие объемы данных, и потребность в получении доступа только один раз.

    Итак, еще раз, правильный путь:

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

    Передача данных по ссылке

    Еще одно применение ссылок для передачи данных в функции. Это особенно важно для очень больших объемов данных, которые Вы бы не хотели, копировать в контексте функции!

    Если Вы не будете использовать ссылки, то будете копировать весь огромный массив, просто чтобы узнать, насколько он большой!

    Связанный урок от Epic

    Автор: Александр Блинцов. Специализируется на Unreal Engine. В Pixonic является клиентским разработчиком и отвечает за разработку и поддержку технической стороны нового сетевого мобильного шутера.

    Четвертая версия движка вышла в 2014 году и распространялась по подписке за $19 в месяц. Но уже через год Epic Games сделала его бесплатным, после чего Unreal Engine 4 начали использовать не только студии, но и инди-разработчики.

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

    Стоит обратить внимание на демки из лаунчера Epic Games (вкладка Learn/Изучить). Там можно найти очень много проектов на разные темы. Причём это практически полноценные прототипы игр, с логикой и графикой.

    Демо идеально подойдут новичкам — их можно изучать или сделать свой проект на их основе. Все готовые шаблоны и демо можно использовать в коммерческих целях.

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

    После выбора шаблона или демо-проекта вы попадёте в редактор. В первый раз здесь можно потеряться — в UE4 огромное количество фичей и кнопочек, а у каждого ассета есть ещё и внутренний редактор для настройки контента. Например, в отдельном редакторе статичных мешей можно сгенерировать низкополигональные модельки, а в редакторе анимаций создать позы или изменить анимацию.

    Может показаться, что редактор перегружен функционалом, но в этом и плюс: всё необходимое находится в одном месте. Хотя создавать хороший контент (модели, звуки, текстуры и т.д.) всё равно придётся в сторонних программах.

    Зато в UE4 есть инструменты для прототипирования, благодаря которым можно собрать билд игры вообще без использования других программ. Например, с помощью Brush’ей можно смоделировать базовый мир и предметы. А уже потом поменять их на более качественные или оставить как есть, если стилистика проекта позволяет.

    В Unreal Engine 4 есть Blueprints — специальный инструмент визуального программирования. Он позволяет строить логику игры с помощью блок-схем из нод. Инструмент достаточно наглядный, простой и интересный в работе. Например, оба скрипта на скриншотах ниже создают мигающую лампочку.

    С блюпринтами работать намного легче, потому что в них невозможно допустить синтаксическую ошибку — подать неправильный тип данных или забыть поставить нужный знак. Ещё блюпринты защищают от вылетов программы. Например, если в С++ попытаться получить доступ к несуществующему объекту, игра вылетит, а в блюпринтах просто появится ошибка в логе.

    Звучит слишком хорошо, чтобы быть правдой. Подвох в том, что несмотря на низкий порог входа и наглядность, блюпринты — полноценный инструмент объектно-ориентированного программирования (ООП).

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

    В Unity, кстати, тоже есть аналогичный инструмент. Он называется Playmaker, но стоит 45 долларов.

    Предположим, у вас уже готов прототип игрового мира и механика геймплея. Теперь нужно импортировать модели и настроить материалы к ним, чтобы всё выглядело как нужно. Мы обойдёмся готовыми ассетами.

    Движок поддерживает .fbx и .obj форматы 3D-моделей, а также все популярные форматы текстур. Импортировать их достаточно просто — можно даже закинуть всё в папку с проектом, и импорт произойдёт автоматически.

    Ещё важно настроить материалы, то есть шейдеры. Обычно они пишутся кодом в других программах, но в Unreal Engine 4 и на этот случай есть визуальный инструментарий, который позволяет описать инструкции шейдера нодами. Может показаться запутанным, но на самом деле для простых материалов присоединить нужные текстуры и получить реалистичный вид не так сложно.


    Рейтинг:

    Учебное пособие по рендерингу и телепортации портала (ссылка для скачивания в описании) - Unreal Engine 4

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

    Теперь, когда я поворачиваю камеру в игре, я могу смотреть по сторонам на разные части тела персонажа. (Например, если я поверну направо, я вижу плечо моего персонажа, а если я смотрю вперед, я вижу только запястья.) Каждый раз, когда я поворачиваю камеру и запускаю анимацию удара, это выглядит странно, потому что модель персонажа не соответствует не совмещен с камерой.

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


    Восемь советов для более быстрой работы в Unreal Engine 4
    Не тратьте время на утомительные задачи, упростите рабочий процесс и сделайте визуализацию быстрее.

    Unreal Engine – отличный инструмент для визуализации в режиме реального времени, хотя это не самый быстрый из них. Вам нужно иметь дело с экспортом и импортом моделей и текстур, и все мэши должны быть правильно развернуты. есть также некоторые причуды, которые делают работу утомительной. Давайте рассмотрим некоторые советы, которые сделают нашу работу быстрее.

    1. Multi-Object-Renaming Tool – MORT (платная надстройка для Unreal Engine 4). Используется, если вы импортируете файлы FBX с большим количеством мэшей.

    mort

    2. Используйте условные названия – я всегда использую условные названия Unreal Engine 4 для геометрии. Это занимает немного времени, но это экономит много времени, когда вы находитесь в UE4, вы сможете быстрее находить свои активы, а это значит, что вы быстрее работаете. Полный список условных названий активов можно найти на Unreal Engine 4 wiki site.

    • BP_ Blueprint
    • SK_ Skeletal Mesh
    • SM_ Static Mesh
    • ST_ Speed Tree
    • PS_ Particle System
    • LF_ Lens Flare
    • S_ Sound
    • SC_ Sound Cue
    • M_ Material
    • MI_ Material Instance
    • MF_ Material Function
    • T_ Texture
    • SP_ Sprite
    • SS_ Sprite Sheet
    • TC_ Texture Cube
    • PM_ Physical Material

    3. Юзай MatBatchUer (another paid plugin). Это может сэкономить вам много времени, особенно если вы импортируете геометрию, у которой есть текстуры, и вы не используете Datasmith (например: потому что ваше 3D-программное обеспечение не поддерживает его). MatBatchuer назначает все текстуры из заданной папки в слоты указанного основного материала. Это означает, что вы можете сразу создать сотни материалов Unreal – особенно удобно, если у вас есть хороший пользовательский мастер-материал, который позволяет изменять тайлинг, оттенок, контраст текстур, сопоставление окклюзии parallax и т. Д., И вам нужно использовать его в качестве базы который будет контролировать ваши импортированные текстуры. Теперь вы можете сделать это несколькими щелчками мыши с помощью MatBatchUer.

    4. Используй Datasmith / Unreal Studio – если вы работаете с 3ds Max. Datasmith – отличный импортер из многих 3D-приложений в Unreal Engine. Datasmith включает плагин для 3ds Max, который непосредственно транслирует сцену, включая источники света, камеры, материалы и геометрию, сохраняя при этом привычную иерархию сцен. Он также преобразует популярные элементы V-Ray, Corona и Mental Ray в Unreal Engine.

    datasmith

    5. Используйте Substance LiveLink for Unreal Engine 4 – это поможет вам быстро перебирать между многими материалами для текущей геометрии. После того, как вы отправите меш в Substance из Unreal Engine 4 и внесите некоторые изменения, вы получите почти немедленное обновление видового экрана в Unreal engine 4, что ускорит работу с материалами. Конечно, LiveLink не идеален для всех ситуаций – если вам нужно будет обновить свою геометрию(например, если вы измените анврап), вам также придется удалить Substance File, сгенерированный LiveLink, удалить экспортированную сетку FBX и начать заново, поэтому иногда разумно использовать регулярный рабочий процесс, сохраняя файлы материалов без привязки к геометрии Unreal Engine. Для каждой геометрии вам нужно решить, что будет лучшим способом.

    slivelink

    materials

    6. Создайте базовую библиотеку материалов и импортируйте ее в каждый новый проект. У меня лично есть несколько базовых материалов, которые используются для всех сеток на сцене. Я только создаю новые для особых целей.

    7. Создайте project template – вместо изменения параметров проекта с каждым новым проектом создайте шаблон со всеми параметрами рендеринга, которые вы обычно используете с сценой шаблона, возьмите рабочую сцену и все активы, которые вы обычно используете, и просто скопируйте этот шаблон в новую папку для работы с ней. Конечно, вам, вероятно, потребуется изменить название проекта. Это просто, вам нужно:

    – изменить имя файла с расширением .proroject
    – изменить имя папки
    – перейдите в папку Config внутри папки Project, откройте DefaultEngine.ini и добавьте GameName = YourProjectName в разделе [URL] вверху.

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