Форум программистов, компьютерный форум, киберфорум
bytestream
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Как создать свою первую игру в стиле Doom на Unreal Engine

Запись от bytestream размещена 15.01.2025 в 20:01
Показов 2198 Комментарии 0
Метки doom, fps, gamedev, ue, unreal engine

Нажмите на изображение для увеличения
Название: 9c137f6a-2600-4d77-89ad-628a69ba68a8.png
Просмотров: 42
Размер:	2.82 Мб
ID:	9210
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. Создание подобной игры позволяет глубоко погрузиться в основы игровой разработки, познакомиться с принципами работы трехмерной графики и освоить ключевые концепции программирования на C++. В этом руководстве мы подробно рассмотрим все этапы создания собственной игры, начиная с базовой настройки проекта и заканчивая финальной сборкой готового продукта.

Unreal Engine представляет собой мощный инструмент для воплощения творческих идей в реальность, предоставляя разработчикам широкий спектр возможностей для создания высококачественных игровых проектов. Этот движок особенно хорошо подходит для разработки шутеров от первого лица благодаря встроенным системам физики, освещения и обработки столкновений. При этом важно понимать, что создание игры в стиле Doom потребует не только технических навыков, но и глубокого понимания геймдизайна, механик игрового процесса и принципов построения уровней.

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

Работа над проектом такого масштаба требует структурированного подхода и четкого понимания всех этапов разработки. Мы начнем с настройки базового проекта в Unreal Engine, затем перейдем к созданию основных игровых механик, и завершим разработку финальной сборкой и оптимизацией готовой игры. На каждом этапе будут представлены конкретные примеры кода на C++, которые помогут лучше понять принципы работы различных игровых систем и их взаимодействие между собой.

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

Обзор концепции и механик Doom-подобных игр



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

Архитектура уровней в Doom-подобных играх строится по особым принципам, создающим уникальный игровой опыт. Дизайн локаций представляет собой сложную систему взаимосвязанных коридоров, открытых пространств и секретных комнат, что способствует созданию многоуровневого игрового процесса. Каждая область должна предоставлять игроку несколько путей для отступления и возможность тактического использования окружения. При этом важную роль играет вертикальное построение пространства, позволяющее создавать многоярусные арены для сражений.

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

Искусственный интеллект противников в Doom-подобных играх реализуется через систему простых, но эффективных поведенческих паттернов. Враги должны демонстрировать агрессивное поведение, постоянно стремясь сократить дистанцию с игроком, но при этом их действия должны быть предсказуемыми достаточно, чтобы игрок мог выработать стратегию противодействия. Разнообразие типов противников создается за счет различных характеристик скорости, здоровья и типов атак, что заставляет игрока постоянно адаптировать свою тактику.

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

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

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

Unreal Engine 4. Как создать триггер с выводом сообщения
Сделал лабиринт. В конце лежит сфера. Хочу, чтобы при достижении сферы выводилось сообщение о победе. Желательно со звуком. Как это сделать?

Как Unreal Engine 4 пользоваться в оффлайне?
Как unreal engine 4 пользоваться в оффлайне ? Есть какой нить кряк чтобы отвязать движок от сайта ?

Ошибка импорта alembic в unreal engine 5. Как исправить?
Есть 3д модель, сделанная в блендере. Экспортировать в abc, тк есть волосы. Groom плагины в ue5 включены. При попытке импортировать возникает ошибка...

Слежка камеры за курсором, как в шутерах с видом сверху в Unreal Engine 4!
Я хочу сделать чтобы я смог поворачивать персонажа курсором и чтобы камеры следила за курсором, как например в игре "Ruiner". Игра у мена...


Настройка среды разработки Unreal Engine



Процесс подготовки рабочего окружения для разработки игры начинается с правильной установки и настройки Unreal Engine. Первым шагом является загрузка Epic Games Launcher, через который осуществляется установка движка и управление проектами. При установке важно обратить внимание на выбор компонентов, необходимых для разработки на C++. Обязательными элементами являются Visual Studio и набор инструментов для разработки, включая компиляторы и средства отладки.

Создание нового проекта в Unreal Engine требует внимательного подхода к начальным настройкам. При выборе шаблона проекта следует остановиться на First Person template, который предоставляет базовую структуру для создания шутера от первого лица. Важно активировать поддержку C++ на этапе создания проекта, установив соответствующий флажок в диалоговом окне. Это действие автоматически создаст необходимые файлы проекта и базовые классы для дальнейшей разработки.

Настройка рабочего пространства Visual Studio играет crucial роль в эффективной разработке. Необходимо установить расширения для работы с Unreal Engine, которые обеспечивают подсветку синтаксиса, автодополнение кода и другие полезные функции. В настройках проекта важно указать правильный набор конфигураций сборки: Development Editor для разработки и отладки, Development для тестовых сборок и Shipping для финальной версии игры. Также следует настроить параметры отладчика для эффективной работы с игровым кодом.

Система контроля версий является неотъемлемой частью разработки. Рекомендуется настроить Git репозиторий для проекта, создав соответствующий .gitignore файл, который исключит из системы контроля версий временные файлы, кэш и другие автоматически генерируемые данные. Особое внимание следует уделить настройке LFS (Large File System) для работы с бинарными файлами, такими как текстуры, модели и звуковые файлы.

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

Создание базовой структуры проекта включает организацию каталогов для различных типов ресурсов. В папке Content следует создать логическую структуру директорий для моделей, текстур, материалов, звуков и уровней. В папке Source необходимо организовать структуру классов C++, разделив их по функциональному назначению. Рекомендуется создать отдельные директории для различных подсистем: компоненты оружия, ИИ противников, системы игровой логики.

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

Завершающим этапом настройки среды разработки является создание и настройка конфигурационных файлов проекта. В файле DefaultEngine.ini необходимо указать базовые параметры физического движка и рендеринга, в DefaultGame.ini - основные игровые настройки, а в DefaultInput.ini - схему управления. Также важно настроить параметры сборки в файле Build.cs, указав необходимые модули и зависимости для компиляции проекта.

Базовые принципы программирования на C++



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

Классы в разработке игры на Unreal Engine имеют особую структуру и требуют специального подхода к объявлению. Каждый игровой класс должен быть объявлен с использованием макросов UCLASS(), которые обеспечивают интеграцию с системой рефлексии движка. Например, базовый класс персонажа может выглядеть следующим образом:

C++
1
2
3
4
5
6
7
8
9
UCLASS()
class AMyCharacter : public ACharacter
{
    GENERATED_BODY()
public:
    AMyCharacter();
    virtual void Tick(float DeltaTime) override;
    virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override;
};
Управление памятью в Unreal Engine реализуется через систему умных указателей и специальных типов данных. Вместо стандартных указателей C++ используются типы UPROPERTY(), которые обеспечивают автоматическое управление жизненным циклом объектов. При работе с компонентами и актерами важно понимать различие между слабыми и сильными ссылками, используя соответствующие типы указателей:

C++
1
2
3
4
5
6
7
UPROPERTY()
UStaticMeshComponent* WeaponMesh;
 
UPROPERTY(VisibleAnywhere)
TArray<AEnemy*> ActiveEnemies;
 
TWeakObjectPtr<APlayerController> PlayerControllerRef;
Обработка событий и делегаты являются фундаментальными механизмами для создания интерактивных игровых систем. Unreal Engine предоставляет мощную систему делегатов, которая позволяет реализовать различные паттерны наблюдателя и обработки событий. Пример объявления и использования делегата:

C++
1
2
3
4
5
6
7
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnWeaponFired, float, Damage);
 
UPROPERTY(BlueprintAssignable)
FOnWeaponFired OnWeaponFired;
 
// Вызов делегата
OnWeaponFired.Broadcast(25.0f);
Система компонентов является основой архитектуры игровых объектов в Unreal Engine. Компоненты представляют собой модульные блоки функциональности, которые можно добавлять к актерам. При работе с компонентами важно понимать иерархию их инициализации и правильное использование методов жизненного цикла:

C++
1
2
3
4
5
6
void AMyActor::BeginPlay()
{
    Super::BeginPlay();
    WeaponComponent = CreateDefaultSubobject<UWeaponComponent>(TEXT("WeaponComponent"));
    WeaponComponent->AttachToComponent(GetRootComponent(), FAttachmentTransformRules::KeepRelativeTransform);
}
Многопоточное программирование в контексте игровой разработки требует особого внимания к синхронизации и безопасности доступа к данным. Unreal Engine предоставляет различные инструменты для работы с асинхронными операциями, включая TaskGraph и AsyncTask:

C++
1
2
3
4
5
6
7
8
void AGameManager::LoadLevel()
{
    AsyncTask(ENamedThreads::GameThread, [this]()
    {
        // Выполнение операций загрузки уровня
        OnLevelLoaded.Broadcast();
    });
}
Оптимизация производительности начинается с правильного использования структур данных и алгоритмов. При работе с коллекциями следует использовать контейнеры, предоставляемые Unreal Engine, такие как TArray, TMap и TSet, которые оптимизированы для работы с игровыми данными. Важно также учитывать особенности кэширования и минимизировать количество динамических выделений памяти:

C++
1
2
3
4
5
6
7
8
9
10
11
UPROPERTY()
TArray<FVector> ProjectileTrajectory;
 
// Предварительное выделение памяти
ProjectileTrajectory.Reserve(ExpectedSize);
 
// Эффективное добавление элементов
for(const auto& Point : CalculatedPoints)
{
    ProjectileTrajectory.Emplace(Point);
}

Создание игрового мира и персонажа



Процесс создания игрового мира для шутера в стиле Doom начинается с разработки базовой геометрии уровня в Unreal Engine. Первым этапом является создание общей планировки уровня с использованием BSP-геометрии, которая позволяет быстро прототипировать игровое пространство. При работе с геометрией важно учитывать масштаб помещений и коридоров, обеспечивая достаточно места для динамичных перестрелок и маневрирования игрока. Базовые размеры проходов должны учитывать размеры персонажа и предполагаемое количество противников.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UCLASS()
class UModularMaterialManager : public UObject
{
    GENERATED_BODY()
private:
    UPROPERTY()
    TMap<FName, UMaterialInstance*> MaterialInstances;
    
public:
    void CreateMaterialInstance(UMaterial* BaseMaterial, const FName& InstanceName)
    {
        UMaterialInstanceDynamic* NewInstance = UMaterialInstanceDynamic::Create(BaseMaterial, this);
        MaterialInstances.Add(InstanceName, NewInstance);
    }
};
Система освещения играет ключевую роль в создании атмосферы уровня. При настройке освещения необходимо учитывать баланс между визуальной привлекательностью и производительностью. Использование статического освещения для неподвижных источников света и динамического освещения для интерактивных элементов позволяет достичь оптимального результата. Важно настроить параметры световых карт и глобального освещения:

C++
1
2
3
4
5
6
7
8
9
10
void ALightManager::SetupLighting()
{
    UPROPERTY()
    USpotLightComponent* DynamicLight = CreateDefaultSubobject<USpotLightComponent>(TEXT("DynamicLight"));
    
    DynamicLight->SetIntensity(3500.0f);
    DynamicLight->SetAttenuationRadius(1000.0f);
    DynamicLight->SetOuterConeAngle(44.0f);
    DynamicLight->SetMobility(EComponentMobility::Movable);
}
Создание игрового персонажа начинается с настройки базового класса характера. В этом классе реализуются все основные механики передвижения, включая бег, прыжки и взаимодействие с окружением. Особое внимание уделяется настройке коллизий и физического взаимодействия:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
UCLASS()
class ADoomCharacter : public ACharacter
{
    GENERATED_BODY()
    
public:
    UPROPERTY(EditAnywhere, Category = "Movement")
    float BaseMovementSpeed = 600.0f;
    
    UPROPERTY(EditAnywhere, Category = "Movement")
    float SprintMultiplier = 1.5f;
    
    virtual void Tick(float DeltaTime) override
    {
        Super::Tick(DeltaTime);
        UpdateMovementSpeed();
        CheckForInteractions();
    }
    
private:
    void UpdateMovementSpeed()
    {
        float CurrentSpeed = BaseMovementSpeed;
        if(bIsSprinting)
            CurrentSpeed *= SprintMultiplier;
        GetCharacterMovement()->MaxWalkSpeed = CurrentSpeed;
    }
};
Система камеры требует тщательной настройки для обеспечения плавного и отзывчивого управления. Важно реализовать правильную обработку поворотов камеры и настроить параметры сглаживания движений. Также необходимо учесть особенности прицеливания и эффекты отдачи при стрельбе:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void ADoomCharacter::SetupPlayerCamera()
{
    UPROPERTY()
    UCameraComponent* FirstPersonCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
    
    FirstPersonCamera->SetupAttachment(GetRootComponent());
    FirstPersonCamera->SetRelativeLocation(FVector(0.0f, 0.0f, BaseEyeHeight));
    FirstPersonCamera->bUsePawnControlRotation = true;
    
    // Настройка параметров камеры
    FirstPersonCamera->FieldOfView = 90.0f;
    FirstPersonCamera->PostProcessBlendWeight = 1.0f;
}
Анимационная система персонажа должна обеспечивать плавные переходы между различными состояниями и действиями. Создается набор базовых анимаций для передвижения, прыжков и взаимодействия с оружием. Особое внимание уделяется синхронизации анимаций с игровыми событиями:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
UCLASS()
class UDoomAnimInstance : public UAnimInstance
{
    GENERATED_BODY()
    
public:
    UPROPERTY(BlueprintReadOnly, Category = "Animation")
    float MovementSpeed;
    
    UPROPERTY(BlueprintReadOnly, Category = "Animation")
    bool bIsInAir;
    
    virtual void NativeUpdateAnimation(float DeltaSeconds) override
    {
        Super::NativeUpdateAnimation(DeltaSeconds);
        
        if(APawn* Owner = TryGetPawnOwner())
        {
            MovementSpeed = Owner->GetVelocity().Size();
            bIsInAir = Owner->GetMovementComponent()->IsFalling();
        }
    }
};
Система обнаружения столкновений играет ключевую роль в создании реалистичного взаимодействия персонажа с окружением. Для этого используется многоуровневая система коллизий, где каждый объект имеет свой набор параметров взаимодействия. Важно правильно настроить различные типы коллизий для разных элементов игрового мира:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void AEnvironmentObject::ConfigureCollision()
{
    UPROPERTY()
    UStaticMeshComponent* MeshComponent = GetStaticMeshComponent();
    
    MeshComponent->SetCollisionProfileName(TEXT("BlockAllDynamic"));
    MeshComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
    MeshComponent->SetGenerateOverlapEvents(true);
    
    // Настройка отдельных каналов коллизии
    MeshComponent->SetCollisionResponseToChannel(ECC_Pawn, ECR_Block);
    MeshComponent->SetCollisionResponseToChannel(ECC_Projectile, ECR_Block);
}
Интерактивные элементы окружения требуют особого подхода к реализации. Это могут быть двери, лифты, платформы и различные механизмы, с которыми игрок может взаимодействовать. Каждый такой элемент должен иметь четко определенную логику работы и соответствующую систему обратной связи:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
UCLASS()
class AInteractiveElement : public AActor
{
    GENERATED_BODY()
    
protected:
    UPROPERTY(EditAnywhere, Category = "Interaction")
    float InteractionDistance = 200.0f;
    
    UPROPERTY(EditAnywhere, Category = "Interaction")
    FInteractionData InteractionParams;
    
public:
    virtual void Interact(ADoomCharacter* Character)
    {
        if(!Character || !CanInteract(Character))
            return;
            
        ExecuteInteraction();
        PlayInteractionEffects();
        NotifyInteractionComplete();
    }
};
Система частиц используется для создания визуальных эффектов, которые делают игровой мир более живым и динамичным. Это могут быть эффекты дыма, искр, следов от пуль и взрывов. Каждый эффект должен быть оптимизирован для обеспечения высокой производительности:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void AEffectsManager::SpawnParticleEffect(const FVector& Location, const FRotator& Rotation)
{
    if(ParticleTemplate)
    {
        UParticleSystemComponent* ParticleSystem = UGameplayStatics::SpawnEmitterAtLocation(
            GetWorld(),
            ParticleTemplate,
            Location,
            Rotation,
            FVector(1.0f),
            true,
            EPSCPoolMethod::AutoRelease
        );
        
        // Настройка параметров эффекта
        ParticleSystem->SetColorParameter(TEXT("Color"), FLinearColor::Red);
        ParticleSystem->SetFloatParameter(TEXT("Intensity"), 2.0f);
    }
}
Звуковое оформление игрового мира требует создания системы пространственного звука, где каждый источник звука правильно позиционируется в трехмерном пространстве. Важно реализовать систему затухания звука с расстоянием и учитывать акустические свойства помещений:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void ASoundManager::PlayLocationSound(USoundBase* Sound, const FVector& Location)
{
    if(Sound)
    {
        FAudioDevice* AudioDevice = GetWorld()->GetAudioDevice();
        if(AudioDevice)
        {
            FSoundAttenuationSettings Attenuation;
            Attenuation.AttenuationShape = EAttenuationShape::Sphere;
            Attenuation.FalloffDistance = 3000.0f;
            
            UAudioComponent* AudioComponent = UGameplayStatics::SpawnSoundAtLocation(
                GetWorld(),
                Sound,
                Location,
                FRotator::ZeroRotator,
                1.0f,
                1.0f,
                0.0f,
                &Attenuation
            );
        }
    }
}
Система повреждений объектов окружения позволяет создавать более динамичное и реалистичное взаимодействие с игровым миром. Это включает в себя визуальные эффекты повреждений, изменение физических свойств объектов и возможное разрушение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ADestructibleObject::ApplyDamage(float DamageAmount, const FVector& HitLocation)
{
    CurrentHealth -= DamageAmount;
    
    // Обновление визуального состояния
    UpdateDamageState();
    
    // Создание эффектов повреждения
    SpawnImpactEffect(HitLocation);
    
    if(CurrentHealth <= 0.0f)
    {
        InitiateDestruction();
    }
}

Боевая система



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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
UCLASS()
class ABaseWeapon : public AActor
{
    GENERATED_BODY()
    
protected:
    UPROPERTY(EditAnywhere, Category = "Weapon Stats")
    float BaseDamage = 20.0f;
    
    UPROPERTY(EditAnywhere, Category = "Weapon Stats")
    float FireRate = 0.5f;
    
    UPROPERTY(EditAnywhere, Category = "Weapon Stats")
    int32 MaxAmmo = 100;
    
    UPROPERTY()
    USkeletalMeshComponent* WeaponMesh;
    
    UPROPERTY()
    UAudioComponent* FireSound;
    
public:
    virtual void Fire();
    virtual void Reload();
    virtual void UpdateWeaponState();
};
Механика стрельбы должна обеспечивать точное определение попаданий и обработку столкновений. Система рейкастинга используется для определения точки попадания и типа поверхности, с которой произошло столкновение. Важно реализовать различные типы стрельбы, включая одиночные выстрелы, автоматический огонь и специальные режимы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void ABaseWeapon::Fire()
{
    if (!CanFire())
        return;
        
    FVector StartTrace = GetMuzzleLocation();
    FVector EndTrace = StartTrace + GetOwner()->GetActorForwardVector() * WeaponRange;
    
    FHitResult HitResult;
    FCollisionQueryParams QueryParams;
    QueryParams.AddIgnoredActor(this);
    QueryParams.AddIgnoredActor(GetOwner());
    
    if (GetWorld()->LineTraceSingleByChannel(HitResult, StartTrace, EndTrace, ECC_Weapon, QueryParams))
    {
        ProcessWeaponHit(HitResult);
        SpawnImpactEffects(HitResult);
    }
    
    PlayFireEffects();
    ConsumeAmmo();
}
Реализация системы урона требует создания гибкого механизма обработки различных типов повреждений и защиты. Каждый тип урона может иметь свои модификаторы и особенности взаимодействия с разными типами противников. Система должна учитывать критические попадания, бронепробиваемость и различные эффекты усиления урона:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
USTRUCT()
struct FDamageData
{
    GENERATED_BODY()
    
    UPROPERTY()
    float BaseDamage;
    
    UPROPERTY()
    float CriticalMultiplier;
    
    UPROPERTY()
    TArray<FStatusEffect> AppliedEffects;
    
    float CalculateFinalDamage(AActor* Target)
    {
        float FinalDamage = BaseDamage;
        if (ShouldApplyCritical())
            FinalDamage *= CriticalMultiplier;
            
        return ModifyDamageByTargetResistance(Target, FinalDamage);
    }
};
Визуальные эффекты выстрелов играют ключевую роль в создании впечатляющего боевого опыта. Система частиц, световые эффекты и анимации должны работать согласованно для создания убедительной обратной связи при каждом выстреле. Особое внимание уделяется эффектам попадания по различным поверхностям:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void ABaseWeapon::SpawnMuzzleEffects()
{
    if (MuzzleFlashTemplate)
    {
        UParticleSystemComponent* MuzzleFlash = UGameplayStatics::SpawnEmitterAttached(
            MuzzleFlashTemplate,
            WeaponMesh,
            MuzzleSocketName,
            FVector::ZeroVector,
            FRotator::ZeroRotator,
            EAttachLocation::SnapToTarget
        );
        
        MuzzleFlash->SetColorParameter(TEXT("BeamColor"), MuzzleFlashColor);
        MuzzleFlash->SetFloatParameter(TEXT("Scale"), MuzzleFlashScale);
    }
    
    if (MuzzleLightClass)
    {
        UPointLightComponent* MuzzleLight = NewObject<UPointLightComponent>(this);
        MuzzleLight->AttachToComponent(WeaponMesh, FAttachmentTransformRules::SnapToTargetNotIncludingScale, MuzzleSocketName);
        MuzzleLight->RegisterComponent();
        
        // Настройка временного свечения
        FTimerHandle TimerHandle;
        GetWorld()->GetTimerManager().SetTimer(TimerHandle, [MuzzleLight]()
        {
            MuzzleLight->DestroyComponent();
        }, MuzzleLightDuration, false);
    }
}
Система перезарядки должна быть реализована с учетом баланса игрового процесса. Важно создать механику, которая добавляет тактический элемент в игровой процесс, но не нарушает динамику боя. Процесс перезарядки должен сопровождаться соответствующими анимациями и звуковыми эффектами:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void ABaseWeapon::StartReload()
{
    if (!CanReload())
        return;
        
    bIsReloading = true;
    
    // Запуск анимации перезарядки
    if (ReloadMontage)
    {
        USkeletalMeshComponent* WeaponMesh = GetWeaponMesh();
        if (WeaponMesh)
        {
            WeaponMesh->PlayAnimation(ReloadMontage, false);
            
            // Установка таймера завершения перезарядки
            FTimerHandle ReloadTimerHandle;
            GetWorld()->GetTimerManager().SetTimer(
                ReloadTimerHandle,
                this,
                &ABaseWeapon::FinishReload,
                ReloadMontage->GetPlayLength(),
                false
            );
        }
    }
    
    // Воспроизведение звука перезарядки
    if (ReloadSound)
    {
        UGameplayStatics::PlaySoundAtLocation(
            this,
            ReloadSound,
            GetActorLocation(),
            GetActorRotation()
        );
    }
}
Взаимодействие с окружением во время боя является важным аспектом игрового процесса. Система должна учитывать различные типы поверхностей и их влияние на поведение оружия и снарядов. Для этого создается специальный менеджер взаимодействий, который обрабатывает столкновения и генерирует соответствующие эффекты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
UCLASS()
class AEnvironmentInteractionManager : public AActor
{
    GENERATED_BODY()
    
protected:
    UPROPERTY()
    TMap<EPhysicalSurface, FImpactEffect> SurfaceEffects;
    
public:
    void ProcessImpact(const FHitResult& Hit, const FVector& ShotDirection)
    {
        EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
        
        if (FImpactEffect* Effect = SurfaceEffects.Find(SurfaceType))
        {
            SpawnDecal(Hit.Location, Hit.Normal, Effect->DecalMaterial);
            SpawnParticles(Hit.Location, ShotDirection, Effect->ParticleSystem);
            PlayImpactSound(Hit.Location, Effect->ImpactSound);
        }
    }
};
Система прицеливания требует особого внимания к деталям для обеспечения точного и отзывчивого управления. Реализация включает расчет разброса, учет отдачи и возможность использования различных прицелов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void ABaseWeapon::UpdateAiming(float DeltaTime)
{
    // Обновление разброса при движении
    float CurrentSpread = BaseSpread;
    if (IsMoving())
        CurrentSpread *= MovementSpreadMultiplier;
        
    // Применение отдачи
    FRotator CurrentRecoil = FMath::RInterpTo(
        GetCurrentRecoil(),
        FRotator::ZeroRotator,
        DeltaTime,
        RecoilRecoverySpeed
    );
    
    ApplyRecoil(CurrentRecoil);
    
    // Обновление прицельной точки
    FVector AimPoint = CalculateAimPoint(CurrentSpread);
    UpdateCrosshair(AimPoint);
}
Система боеприпасов должна предоставлять гибкие возможности для управления различными типами патронов и их характеристиками. Реализация включает систему подбора боеприпасов и управление их запасами:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
USTRUCT()
struct FAmmoData
{
    GENERATED_BODY()
    
    UPROPERTY(EditDefaultsOnly)
    int32 MaxCapacity;
    
    UPROPERTY()
    int32 CurrentAmount;
    
    UPROPERTY()
    float DamageMultiplier;
    
    bool CanUseAmmo(int32 Amount) const
    {
        return CurrentAmount >= Amount;
    }
    
    void ConsumeAmmo(int32 Amount)
    {
        CurrentAmount = FMath::Max(0, CurrentAmount - Amount);
    }
};
Обработка попаданий включает создание сложной системы определения точек попадания и расчета наносимого урона. Важно учитывать различные факторы, влияющие на эффективность оружия:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
float ABaseWeapon::CalculateHitDamage(const FHitResult& Hit, const FVector& ShotDirection)
{
    float FinalDamage = BaseDamage;
    
    // Учет дистанции
    float DistanceFactor = CalculateDistanceFalloff(Hit.Distance);
    FinalDamage *= DistanceFactor;
    
    // Проверка критического попадания
    if (IsCriticalHit(Hit.BoneName))
    {
        FinalDamage *= CriticalHitMultiplier;
        TriggerCriticalHitEffects(Hit.Location);
    }
    
    // Применение модификаторов оружия
    for (const auto& Modifier : WeaponModifiers)
    {
        FinalDamage = Modifier->ModifyDamage(FinalDamage, Hit);
    }
    
    return FinalDamage;
}
Специальные атаки и альтернативные режимы стрельбы добавляют разнообразие в игровой процесс. Каждое оружие может иметь уникальные способности и механики:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void ABaseWeapon::ActivateSpecialAttack()
{
    if (!CanUseSpecialAttack())
        return;
        
    switch (SpecialAttackType)
    {
        case ESpecialAttackType::Burst:
            ExecuteBurstFire();
            break;
            
        case ESpecialAttackType::ChargedShot:
            StartCharging();
            break;
            
        case ESpecialAttackType::AreaEffect:
            TriggerAreaEffect();
            break;
    }
    
    ConsumeSpecialAttackCharge();
    StartSpecialAttackCooldown();
}
Система обратной связи обеспечивает информирование игрока о результатах его действий через визуальные и звуковые эффекты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void ABaseWeapon::ProvideFeedback(const FHitResult& Hit)
{
    // Визуальная индикация попадания
    if (HitMarkerWidget)
    {
        HitMarkerWidget->ShowHitMarker(
            Hit.bBlockingHit,
            IsCriticalHit(Hit.BoneName)
        );
    }
    
    // Тактильная обратная связь
    if (ADoomCharacter* Character = Cast<ADoomCharacter>(GetOwner()))
    {
        Character->PlayForceFeedback(WeaponForceFeedback);
    }
    
    // Звуковые эффекты
    if (HitConfirmationSound)
    {
        UGameplayStatics::PlaySound2D(
            this,
            HitConfirmationSound,
            HitSoundVolume,
            1.0f,
            0.0f
        );
    }
}

Искусственный интеллект противников



Разработка системы искусственного интеллекта для противников в шутере стиля Doom требует создания эффективного и сбалансированного поведения врагов. Базовая архитектура ИИ строится на основе конечного автомата состояний, который управляет действиями противников в зависимости от игровой ситуации. Реализация начинается с создания основного класса для управления поведением:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
UCLASS()
class AEnemyAI : public AAIController
{
    GENERATED_BODY()
    
protected:
    UPROPERTY()
    UBehaviorTreeComponent* BehaviorTreeComponent;
    
    UPROPERTY()
    UBlackboardComponent* BlackboardComponent;
    
    virtual void BeginPlay() override
    {
        Super::BeginPlay();
        if (BehaviorTree)
        {
            RunBehaviorTree(BehaviorTree);
            BlackboardComponent->InitializeBlackboard(*BehaviorTree->BlackboardAsset);
        }
    }
};
Система восприятия противников является ключевым элементом их поведения. Она отвечает за обнаружение игрока и реакцию на различные игровые события. Реализация включает проверку прямой видимости, слуховое восприятие и память о последнем известном положении цели:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
UCLASS()
class UEnemyPerceptionComponent : public UAIPerceptionComponent
{
    GENERATED_BODY()
    
public:
    UPROPERTY(EditAnywhere, Category = "Perception")
    float SightRadius = 1500.0f;
    
    UPROPERTY(EditAnywhere, Category = "Perception")
    float HearingRadius = 1000.0f;
    
    void OnPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus)
    {
        if (Stimulus.Type == UAISense_Sight::StaticClass())
        {
            if (Stimulus.WasSuccessfullySensed())
            {
                OnTargetSpotted(Actor, Stimulus.StimulusLocation);
            }
            else
            {
                UpdateLastKnownLocation(Stimulus.StimulusLocation);
            }
        }
    }
};
Поведенческое дерево противников структурирует их действия и принятие решений. Оно включает различные задачи, такие как патрулирование, преследование цели, атака и отступление. Каждое действие определяется набором условий и приоритетов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void AEnemyAI::ConfigureBehaviorTree()
{
    // Создание последовательности действий
    UBTComposite_Sequence* RootSequence = CreateDefaultSubobject<UBTComposite_Sequence>(TEXT("Root"));
    
    // Добавление проверки видимости игрока
    UBTDecorator_Blackboard* CanSeePlayer = CreateDefaultSubobject<UBTDecorator_Blackboard>(TEXT("CanSeePlayer"));
    CanSeePlayer->BlackboardKey = FName("TargetVisible");
    
    // Настройка действий атаки
    UBTTask_AttackPlayer* AttackTask = CreateDefaultSubobject<UBTTask_AttackPlayer>(TEXT("Attack"));
    AttackTask->AttackRange = 200.0f;
    AttackTask->AttackDamage = 25.0f;
    
    // Добавление поведения при потере цели
    UBTTask_SearchArea* SearchTask = CreateDefaultSubobject<UBTTask_SearchArea>(TEXT("Search"));
    SearchTask->SearchRadius = 500.0f;
    SearchTask->SearchDuration = 10.0f;
}
Система навигации обеспечивает перемещение противников по игровому миру. Она включает поиск пути, обход препятствий и выбор оптимального маршрута к цели. Важно учитывать особенности геометрии уровня и возможные препятствия:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void AEnemyAI::UpdatePathfinding()
{
    if (ACharacter* ControlledPawn = Cast<ACharacter>(GetPawn()))
    {
        FVector TargetLocation = BlackboardComponent->GetValueAsVector("TargetLocation");
        
        // Построение пути к цели
        FPathFindingResult PathResult = PathfindingComponent->FindPath(
            ControlledPawn->GetActorLocation(),
            TargetLocation,
            EPathFindingMode::Regular
        );
        
        if (PathResult.IsSuccessful())
        {
            // Следование по найденному пути
            FollowPath(PathResult.Path);
        }
        else
        {
            // Обработка невозможности достижения цели
            HandlePathfindingFailure();
        }
    }
}
Система атаки противников определяет их боевое поведение и способы нанесения урона игроку. Реализация включает выбор типа атаки, расчет урона и визуальные эффекты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void AEnemyCharacter::ExecuteAttack()
{
    if (!CanAttack())
        return;
        
    // Определение типа атаки
    EAttackType AttackType = DetermineAttackType();
    
    switch (AttackType)
    {
        case EAttackType::MeleeAttack:
            PerformMeleeAttack();
            break;
            
        case EAttackType::RangedAttack:
            LaunchProjectile();
            break;
            
        case EAttackType::SpecialAttack:
            TriggerSpecialAbility();
            break;
    }
    
    // Обновление состояния атаки
    StartAttackCooldown();
    UpdateAttackAnimations();
}
Система координации между различными противниками позволяет им действовать согласованно и создавать тактические ситуации. Это включает распределение целей, групповые атаки и взаимную поддержку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
UCLASS()
class AEnemyCoordinator : public AActor
{
    GENERATED_BODY()
    
protected:
    UPROPERTY()
    TArray<AEnemyCharacter*> ActiveEnemies;
    
    void CoordinateAttack(ACharacter* Target)
    {
        // Распределение ролей между противниками
        for (AEnemyCharacter* Enemy : ActiveEnemies)
        {
            if (Enemy && Enemy->IsAlive())
            {
                AssignTacticalRole(Enemy, Target);
                UpdateAttackPosition(Enemy);
                CoordinateMovement(Enemy);
            }
        }
    }
};
Механика уклонения противников играет важную роль в создании динамичных боевых ситуаций. Система должна позволять врагам эффективно избегать атак игрока и использовать укрытия. Реализация включает анализ окружения и выбор оптимальной стратегии уклонения:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void AEnemyCharacter::ImplementEvasiveManeuvers()
{
    UPROPERTY(EditAnywhere, Category = "AI|Evasion")
    float DodgeSpeed = 800.0f;
    
    if (DetectIncomingThreat())
    {
        FVector EvasionDirection = CalculateOptimalEvasionDirection();
        FVector DodgeTarget = GetActorLocation() + EvasionDirection * DodgeDistance;
        
        // Проверка доступности пути уклонения
        if (IsLocationSafe(DodgeTarget))
        {
            LaunchCharacter(EvasionDirection * DodgeSpeed, true, false);
            PlayDodgeAnimation();
        }
        else
        {
            FindAlternativeEvasionPath();
        }
    }
}
Система состояний здоровья противников определяет их реакцию на получаемый урон и влияет на поведение. Различные уровни здоровья могут вызывать изменения в тактике и агрессивности:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
USTRUCT()
struct FEnemyHealthState
{
    GENERATED_BODY()
    
    UPROPERTY()
    float MaxHealth;
    
    UPROPERTY()
    float CurrentHealth;
    
    UPROPERTY()
    TArray<FHealthThreshold> BehaviorThresholds;
    
    void UpdateBehaviorBasedOnHealth()
    {
        float HealthPercentage = (CurrentHealth / MaxHealth) * 100.0f;
        for (const auto& Threshold : BehaviorThresholds)
        {
            if (HealthPercentage <= Threshold.Percentage)
            {
                ApplyBehaviorModifiers(Threshold.Modifiers);
                break;
            }
        }
    }
};
Анимационная система противников должна обеспечивать плавные переходы между различными действиями и состояниями. Важно синхронизировать анимации с логикой поведения и игровыми событиями:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void AEnemyAnimInstance::UpdateAnimationState()
{
    if (AEnemyCharacter* Enemy = Cast<AEnemyCharacter>(TryGetPawnOwner()))
    {
        // Обновление параметров анимации
        MovementSpeed = Enemy->GetVelocity().Size();
        bIsAttacking = Enemy->IsPerformingAttack();
        bIsStaggered = Enemy->IsStaggered();
        
        // Управление переходами анимаций
        UpdateLocomotionState();
        HandleCombatAnimations();
        ProcessDamageReactions();
    }
}
Система эмоциональных состояний добавляет глубину поведению противников, влияя на их решения и действия. Различные события могут изменять эмоциональное состояние, что отражается на тактике:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
UENUM()
enum class EEmotionalState : uint8
{
    Neutral,
    Aggressive,
    Cautious,
    Fearful
};
 
void AEnemyAI::UpdateEmotionalState(float DeltaTime)
{
    // Анализ текущей ситуации
    float ThreatLevel = CalculateThreatLevel();
    float HealthRatio = GetHealthPercentage();
    
    // Обновление эмоционального состояния
    if (ThreatLevel > HighThreatThreshold && HealthRatio < LowHealthThreshold)
    {
        SetEmotionalState(EEmotionalState::Fearful);
        UpdateBehaviorParameters();
    }
    else if (ThreatLevel > MediumThreatThreshold)
    {
        SetEmotionalState(EEmotionalState::Aggressive);
        IncreaseAttackFrequency();
    }
}
Система взаимодействия с окружением позволяет противникам эффективно использовать элементы уровня. Это включает использование укрытий, активацию ловушек и взаимодействие с интерактивными объектами:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void AEnemyAI::InteractWithEnvironment()
{
    // Поиск ближайших интерактивных объектов
    TArray<AActor*> NearbyInteractives;
    UGameplayStatics::GetAllActorsOfClass(GetWorld(), AInteractiveElement::StaticClass(), NearbyInteractives);
    
    for (AActor* Interactive : NearbyInteractives)
    {
        if (ShouldInteractWith(Interactive))
        {
            // Определение типа взаимодействия
            EInteractionType InteractionType = DetermineInteractionType(Interactive);
            ExecuteEnvironmentalInteraction(Interactive, InteractionType);
        }
    }
}

Финальная сборка и оптимизация



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

Оптимизация производительности является критическим этапом разработки, где особое внимание уделяется эффективности работы всех систем. Начните с профилирования игры для выявления узких мест в производительности. Используйте встроенные инструменты Unreal Engine для анализа времени выполнения различных компонентов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void APerformanceManager::OptimizeGameSystems()
{
    // Оптимизация рендеринга
    GetWorld()->GetFirstPlayerController()->ConsoleCommand(TEXT("r.ScreenPercentage 100"));
    GetWorld()->GetFirstPlayerController()->ConsoleCommand(TEXT("r.DefaultFeature.AntiAliasing 2"));
    
    // Настройка уровней детализации
    for (TActorIterator<AActor> It(GetWorld()); It; ++It)
    {
        if (UStaticMeshComponent* MeshComponent = Cast<UStaticMeshComponent>(It->GetComponentByClass(UStaticMeshComponent::StaticClass())))
        {
            ConfigureLODSettings(MeshComponent);
        }
    }
}
Финальная интеграция систем требует тщательной проверки всех игровых механик. Убедитесь, что все системы корректно взаимодействуют друг с другом: боевая система правильно реагирует на действия ИИ, система повреждений корректно обрабатывает все типы урона, а визуальные эффекты синхронизированы с игровыми событиями. Особое внимание следует уделить балансировке игрового процесса, настраивая параметры оружия, здоровья противников и скорости передвижения для создания оптимального игрового опыта.

Отладка и тестирование включает систематический поиск и исправление ошибок во всех компонентах игры. Создайте автоматизированные тесты для проверки критически важных функций:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
UCLASS()
class UGameSystemsTest : public UAutomationTest
{
    GENERATED_BODY()
    
public:
    bool RunTest(const FString& Parameters) override
    {
        // Тестирование систем
        TestWeaponSystem();
        TestEnemyBehavior();
        TestPlayerMovement();
        
        // Проверка производительности
        RunPerformanceTests();
        
        return true;
    }
};
Завершающим этапом является оптимизация памяти и ресурсов. Проведите анализ использования памяти, оптимизируйте загрузку ресурсов и настройте систему пулинга объектов для эффективного управления игровыми сущностями. Важно также настроить систему сохранения и загрузки игрового прогресса, обеспечив надежное сохранение всех необходимых данных.

Использование библиотек в doom engine (id tech 1)
Здравствуйте! Прошу помощи у тех, кто хотя бы несколько знает об движке doom. Использовались ли в этом движке какие нибудь сторонние библиотеки...

Как сделать подбор предметов в Unreal Engine 4 c++ с помощью лайнтрэйс при нажатии клавиши
Как сделать подбор предметов(открытие дверей) в Unreal Engine 4 c++ с помощью лайнтрэйс при нажатии клавиши

Unreal Engine 4
Всем привет. У кого есть ссылка на готовый оффлайн или онлайн инсталлер Unreal Engine 4? Сойдет всё, только не торрент, у меня с провайдером...

Unreal Engine 5.3
Подскажи пожалуйста как в Unreal Engine 5.3 поставить русский язык, в настройках нашел, он не ставится. Есть ли какой-нибудь способ? Благодарю...

Blueprint Unreal Engine 5
Привет! Очень нужна помощь, нигде не могу найти blueprint чтобы объект исчез, когда подойду к нему. Я делаю хоррор и мне нужно сделать исчезновение...

Folliage в unreal engine 5
Всем доброго дня ребят. Появилась небольшая проблема в UE 5.2, с которой столкнулся впервые. Вчерашним днем рисовал ландшафт на карте (Folliage). ...

Библиотека в Unreal Engine
Нигде не смог найти ответ. Решил обратится сюда). Так вот. Какую графическую библиотеку использует за основу UE? Либо у них своя отдельная...

Движок Unreal Engine
Посоветуйте какой-нибудь видео урок или литературу по данному движку

Unreal Engine 4 2d сайдскроллер
Возник вопрос по переключению 2d анимации. Вообщем в блюпринтах смену анимации выставил. Но хочется реализовать всё это через C++. Помогите...

MainMenu Unreal Engine 4.27
Создал главное меню игры все работает, но если нажать на пустое место без кнопки спавнится стартовый персонаж и слышны выстрелы. Как сделать,...

Unity vs Unreal Engine 4
Всем привет. Есть желание попробовать сделать свою игру. Рпг с &quot;видом сверху&quot; как Baldur's Gate. Сейчас Unity и Unreal Engine 4 практически...

Работа с анимацией в Unreal engine
Помогите, как можно изменить Scale анимации, потому что когда я накладываю анимацию на объект, объект уменьшается

Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Ошибка "Cleartext HTTP traffic not permitted" в Android
hw_wired 13.02.2025
При разработке Android-приложений можно столнуться с неприятной ошибкой "Cleartext HTTP traffic not permitted", которая может серьезно затруднить отладку и тестирование. Эта проблема особенно. . .
Изменение версии по умолчанию в NVM
hw_wired 13.02.2025
Node Version Manager, или коротко NVM - незаменимый инструмент для разработчиков, использующих Node. js. Многие сталкивались с ситуацией, когда разные проекты требуют различных версий Node. js,. . .
Переименование коммита в Git (локального и удаленного)
hw_wired 13.02.2025
Git как система контроля версий предоставляет разработчикам множество средств для управления этой историей, и одним из таких важных средств является возможность изменения сообщений коммитов. Но зачем. . .
Отличия Promise и Observable в Angular
hw_wired 13.02.2025
В веб-разработки асинхронные операции стали неотъемлимой частью почти каждого приложения. Ведь согласитесь, было бы странно, если бы при каждом запросе к серверу или при обработке больших объемов. . .
Сравнение NPM, Gulp, Webpack, Bower, Grunt и Browserify
hw_wired 13.02.2025
В современной веб-разработке существует множество средств сборки и управления зависимостями проектов, каждое из которых решает определенные задачи и имеет свои особенности. Когда я начинаю новый. . .
Отличия AddTransient, AddScoped и AddSingleton в ASP.Net Core DI
hw_wired 13.02.2025
В современной разработке веб-приложений на платформе ASP. NET Core правильное управление зависимостями играет ключевую роль в создании надежного и производительного кода. Фреймворк предоставляет три. . .
Отличия между venv, pyenv, pyvenv, virtualenv, pipenv, conda, virtualenvwrapp­­er, poetry и другими в Python
hw_wired 13.02.2025
В Python существует множество средств для управления зависимостями и виртуальными окружениями, что порой вызывает замешательство даже у опытных разработчиков. Каждый инструмент создавался для решения. . .
Навигация с помощью React Router
hw_wired 13.02.2025
React Router - это наиболее распространенное средство для создания навигации в React-приложениях, без которого сложно представить современную веб-разработку. Когда мы разрабатываем сложное. . .
Ошибка "error:0308010C­­:dig­ital envelope routines::unsup­­ported"
hw_wired 13.02.2025
Если вы сталкиваетесь с ошибкой "error:0308010C:digital envelope routines::unsupported" при разработке Node. js приложений, то наверняка уже успели поломать голову над её решением. Эта коварная ошибка. . .
Подключение к контейнеру Docker и работа с его содержимым
hw_wired 13.02.2025
В мире современной разработки контейнеры Docker изменили подход к созданию, развертыванию и масштабированию приложений. Эта технология позволяет упаковать приложение со всеми его зависимостями в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru