UE4学习笔记

发布于:2024-05-16 ⋅ 阅读:(62) ⋅ 点赞:(0)

1.UE4概述

UE4,全称为Unreal Engine 4,是由Epic Games开发的一款游戏引擎。该引擎被广泛应用于游戏开发、虚拟现实(VR)和增强现实(AR)应用程序,以及影视制作、建筑可视化、虚拟培训等领域。UE4提供了丰富的功能和工具,包括场景编辑器、材质编辑器、动画编辑器、蓝图系统、物理引擎等,使开发者能够创建高质量、逼真的游戏体验。

UE4的特点包括:

  1. 易上手:UE4具有直观的用户界面和易于理解的工作流程,使得初学者也能快速上手。
  2. 免费与开源:UE4提供了免费的版本,并且支持开源,这意味着开发者可以免费使用并修改引擎的代码。
  3. 多领域实用性:UE4不仅适用于游戏开发,还广泛应用于影视动画、虚拟演播、建筑设计、室内设计、三维仿真城市建设等领域。
  4. 强大的内置工具与插件:UE4自带了许多实用的工具和插件,如实时渲染、粒子系统、动画系统等,可以大大提高开发效率。
  5. 良好的开发者社区:UE4拥有庞大的开发者社区,开发者可以在社区中交流经验、分享技巧,并获得技术支持。

自2012年首次展示以来,UE4经过不断的发展和完善,已经成为了一款功能强大的游戏开发引擎。它支持多平台开发,包括PC、主机、移动设备等,并且支持多种编程语言,如C++、蓝图等。此外,UE4还提供了丰富的资源和资产库,包括模型、贴图、音频等,可以帮助开发者快速构建游戏世界。

学习了UE4后,可以从事UE4地编师、UE4开发工程师、UE4引擎开发、UE4游戏开发等工作。例如,UE4开发的游戏有很多,如《堡垒之夜》、《绝地求生》、《虚幻争霸》等。此外,UE4还在影视动画、虚拟演播、建筑设计等领域得到了广泛应用。

为了学习UE4,可以阅读相关的书籍,如《Unreal Engine 4从入门到精通》、《Unreal Engine 4特效设计必修课》等。这些书籍详细介绍了UE4的各种命令和工具的功能与使用方法,以及在项目开发中的具体应用。

2.UE4应用场景有哪些

UE4(Unreal Engine 4)是一款功能强大的游戏引擎,不仅在游戏开发领域有着广泛的应用,还涉足了影视制作、建筑可视化、虚拟现实(VR)和增强现实(AR)等多个领域。以下是UE4的一些主要应用场景:

  1. 游戏开发:UE4是游戏开发领域中的佼佼者,提供了丰富的游戏开发工具和资源,包括图形、音频、人物动画等方面的制作和处理。开发者可以利用UE4轻松实现多种类型的游戏,如3D角色扮演、第一人称射击等。
  2. 影视动画制作:UE4的光线追踪技术和渲染技术使得它在影视动画制作领域有着广泛的应用。通过使用UE4,制作者可以创建逼真的材质、光效结合、现场调制天空、实时灯光渲染等效果,为影视制作带来更加逼真的视觉效果。
  3. 建筑可视化:UE4在建筑行业中也得到了广泛的应用。建筑师可以将建筑模型导入到UE4引擎中进行操作和渲染,实现建筑可视化和空间模拟。这种技术可以帮助客户、投资者和其他相关方更直观地理解和评估建筑设计。
  4. 虚拟现实(VR)和增强现实(AR):UE4提供了AR/VR相关的技术支持,可以将其应用于虚拟现实和增强现实领域,实现沉浸式的互动体验。这种技术可以在游戏、教育、医疗等多个领域中得到应用。
  5. 三维仿真城市建设:UE4的渲染技术和场景搭建功能使得它在三维仿真城市建设领域有着广泛的应用。通过使用UE4,开发者可以创建逼真的城市环境,为城市规划、建筑设计等领域提供有力的支持。
  6. 军事、景观等领域:除了上述领域外,UE4还涉足了军事、景观等领域。在军事领域,UE4可以用于战略演练和模拟;在景观领域,UE4可以创建逼真的自然环境,为景观设计提供有力的支持。

总之,UE4是一个功能强大、应用广泛的游戏引擎软件,主要用于游戏开发、影视动画制作、建筑可视化、虚拟现实和增强现实等领域。随着技术的不断发展和完善,UE4的应用场景也将不断拓展。

3.UE4c#应用举例

UE4(Unreal Engine 4)本身主要是用C++编写的,但UE4也支持使用C#进行某些开发任务,尤其是当涉及到插件或跨语言交互时。下面是一些关于UE4中C#应用的举例:

  1. 插件开发
    • 如果你想为UE4开发一个自定义的插件,并且你熟悉C#,那么你可以使用C#编写该插件的部分或全部代码。这可以通过将C#代码编译为DLL(动态链接库)并在UE4中调用它来实现。
  2. 跨语言交互
    • 在某些情况下,你可能需要将UE4的C++代码与外部的C#代码进行交互。例如,你可能有一个用C#编写的语音识别库,并希望将其集成到UE4项目中。在这种情况下,你可以使用C++/CLI(公共语言基础设施)或P/Invoke等技术来实现C++和C#之间的互操作。
  3. 蓝图系统
    • 虽然蓝图系统本身是用C++编写的,但你可以使用C#来扩展或与其交互。蓝图系统是UE4中一种可视化编程工具,允许开发者在不编写C++代码的情况下创建游戏逻辑。然而,对于更复杂的交互或特定的功能,你可能需要使用C#来编写自定义脚本或插件。
  4. 外部工具
    • 你可以使用C#编写与UE4项目交互的外部工具或应用程序。例如,你可以创建一个C#应用程序来自动化UE4中的某些任务(如导入资产、设置场景参数等)。这可以通过UE4提供的命令行工具或API来实现。
  5. 插件包装
    • 如果你有一个现有的C#库或插件,并且希望将其用于UE4项目,你可能需要将其包装为UE4可以理解的格式。这通常涉及将C#代码编译为DLL,并使用适当的桥接代码或技术来确保UE4可以调用它。
  6. UE4与Unity的交互
    • 虽然UE4和Unity是两个不同的游戏引擎,但你可以使用C#作为它们之间的桥梁。例如,你可以使用C#编写一个中间件层,该层可以接收来自UE4的数据并将其传递给Unity,或者从Unity接收数据并将其传递给UE4。这可以用于实现跨引擎的协作或集成。

请注意,虽然C#可以在UE4项目中发挥重要作用,但UE4的主要开发语言仍然是C++。因此,对于大多数UE4项目来说,熟悉C++仍然是非常重要的。

4.c++UE4画一个立方体

在Unreal Engine 4 (UE4) 中,使用C++来画一个立方体(或更准确地说是创建一个立方体网格并添加到场景中)是一个常见的任务。以下是一个基本的步骤和示例代码,说明如何在UE4中使用C++来创建一个立方体。

步骤

  1. 创建一个新的UE4项目:使用UE4编辑器创建一个新的项目。
  2. 打开C++源代码:在UE4编辑器中,你可以通过“File” -> “Open Visual Studio”来打开与你的项目关联的Visual Studio项目。
  3. 编写C++代码:在Visual Studio中,找到你的游戏逻辑代码(通常是GameModeBasePlayerController或你自定义的类),并添加代码来创建和添加立方体。

示例代码

以下是一个简单的示例,展示如何在UE4的C++代码中创建一个立方体并将其添加到场景中:

// 假设你在一个继承自AActor的类中  
#include "YourActor.h"  
#include "UObject/ConstructorHelpers.h"  
#include "Components/StaticMeshComponent.h"  
#include "Engine/StaticMesh.h"  
  
// ...  
  
// 在你的类的某个函数中(如BeginPlay)  
void AYourActor::BeginPlay()  
{  
    Super::BeginPlay();  
  
    // 创建一个StaticMeshComponent来显示立方体  
    UStaticMeshComponent* cubeComponent = GetComponent<UStaticMeshComponent>();  
    if (!cubeComponent)  
    {  
        // 如果Actor没有StaticMeshComponent,则创建一个  
        cubeComponent = NewObject<UStaticMeshComponent>(this);  
        cubeComponent->SetupAttachment(this->GetRootComponent()); // 附加到根组件  
    }  
  
    // 获取或加载一个立方体网格(这里假设你已经有了一个名为"Cube"的网格)  
    // 注意:在实际项目中,你可能需要从内容浏览器加载网格  
    TSubclassOf<UStaticMesh> cubeMeshClass = StaticLoadClass<UStaticMesh>(NULL, "Cube"); // "Cube"是你的网格资源的名称  
    if (cubeMeshClass != NULL)  
    {  
        UStaticMesh* cubeMesh = cubeMeshClass.LoadObject<UStaticMesh>(NULL, NULL, RF_Public | RF_StandaloneObject);  
        if (cubeMesh)  
        {  
            cubeComponent->SetStaticMesh(cubeMesh); // 设置网格到组件  
            cubeComponent->SetWorldScale3D(FVector(100.f, 100.f, 100.f)); // 设置立方体的大小  
            cubeComponent->SetGenerateOverlapEvents(true); // 如果需要的话,设置重叠事件  
            cubeComponent->CreateRenderState_Concurrent(); // 创建渲染状态  
            cubeComponent->MarkRenderStateDirty(); // 标记渲染状态为脏,以便更新  
        }  
    }  
}  
  
// ...

注意

  • 上面的代码假设你已经在内容浏览器中有一个名为"Cube"的静态网格资源。在实际项目中,你可能需要根据你的项目设置来调整资源名称和加载方式。
  • 如果你还没有立方体网格,你可以使用UE4的Blender或Maya插件来创建一个,然后将其导入到UE4中。
  • 确保你的Actor在场景中可见,并且其位置在相机视图中,以便你可以看到立方体。

5.UE4的开发工具有哪些 

 

UE4(Unreal Engine 4)的开发工具主要包括以下几种:

  1. Visual Studio:这是UE4官方推荐的主要集成开发环境(IDE)。Visual Studio功能强大,为开发者提供了代码编辑、调试、版本控制等一系列开发工具。Visual Studio与UE4的集成度很高,可以方便地访问UE4的API和进行项目管理。
  2. JetBrains Rider:这是一款跨平台的.NET IDE,也支持UE4的开发。Rider提供了智能代码编辑、快速导航、实时错误检查等功能,帮助开发者提高开发效率。
  3. AssetDeveTool:这是一款UE5和UE4的插件工具,支持自动化批量展UV、快速选择功能、自动化批量减面、自动化批量LOD、自动化批量修改查找替换材质等功能,可以大大提高游戏开发的效率。
  4. UE4 LLM工具:这是一款为游戏开发者带来的革命性创新工具,可以即刻调用文心一言能力,开通百度智能云千帆大模型平台服务,自动获取大量免费tokens,为游戏开发提供强大的AI支持。
  5. Editor命令和自定义Commandlet:UE4的编辑器支持使用Editor命令和自定义Commandlet来运行特定的功能或脚本。这允许开发者通过编写自定义的脚本或命令来扩展编辑器的功能,实现更复杂的操作或自动化流程。

此外,UE4还提供了许多其他的工具和资源,如蓝图系统、材质编辑器、粒子系统等,帮助开发者创建高质量的游戏体验。这些工具和功能共同构成了UE4强大的开发环境,使得开发者能够高效地创建出令人惊叹的游戏作品。

6.使用UE4创建一个角色 

在Unreal Engine 4 (UE4) 中使用 C++ 创建一个角色涉及到多个步骤,包括创建 Actor 类、添加组件(如 StaticMeshComponent)、设置物理属性等。以下是一个简化的步骤概述和示例代码,说明如何使用 C++ 在 UE4 中创建一个基本的角色。

步骤概述

  1. 创建 Actor 类
    • 继承自 AActor 或其子类(如 APawn),创建一个新的 Actor 类。
    • 在这个类中,你可以添加自定义的逻辑和变量。
  2. 添加组件
    • 使用 CreateDefaultSubobject 或 GetComponent 方法为你的 Actor 添加必要的组件,如 UStaticMeshComponent(用于显示3D模型)。
  3. 设置角色属性
    • 设置角色的物理属性,如碰撞、移动方式等。
    • 如果需要,可以添加动画组件(如 USkeletalMeshComponent)和动画状态机。
  4. 初始化角色
    • 在 BeginPlay 或其他适当的生命周期函数中初始化角色的状态。
  5. 控制角色
    • 实现输入处理逻辑来控制角色的移动和动作。
    • 可以使用蓝图或 C++ 代码来处理输入。

示例代码

以下是一个简单的示例,展示如何在 C++ 中创建一个具有静态网格组件的 Actor:


// Player.h  
#pragma once  
  
#include "CoreMinimal.h"  
#include "GameFramework/Pawn.h"  
#include "Components/CapsuleComponent.h"  
#include "Components/InputComponent.h"  
#include "Components/StaticMeshComponent.h"  
  
class APlayer : public APawn  
{  
    GENERATED_BODY()  
  
public:  
    // Sets default values for this pawn's properties  
    APlayer();  
  
    // Called when the game starts or when spawned  
    virtual void BeginPlay() override;  
  
    // Called to bind functionality to input  
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;  
  
    // Handlers for input  
    void MoveForward(float Value);  
    void MoveRight(float Value);  
    // ... Add more input handlers for other actions like shooting, jumping, etc.  
  
protected:  
    // Called for bound keys when they are pressed  
    void OnFirePressed();  
  
    // Components  
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")  
    UStaticMeshComponent* MeshComponent;  
  
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")  
    UCapsuleComponent* CapsuleComponent;  
  
    // ... Add more components if needed (e.g., for animations, weapons, etc.)  
};

注意

  • 在上面的示例中,你需要将 "PathToYourMesh" 替换为你的3D模型的实际路径。
  • 你还需要加载和设置模型的材质、碰撞等属性。
  • 如果你想要让角色动起来,你需要在 Tick 函数中添加移动逻辑,或者使用蓝图来处理输入和移动。
  • 对于更复杂的角色(如带有骨骼动画的角色),你可能需要使用 USkeletalMeshComponent 而不是 UStaticMeshComponent,并设置动画蓝图或动画状态机。

 7.C++UE4游戏开发举例

 

在Unreal Engine 4 (UE4) 中使用C++进行游戏开发是一个常见的做法,特别是对于需要更高级别控制和优化的项目。以下是一个简化的C++ UE4游戏开发示例,演示了如何创建一个基本的角色(Player)类,并添加一些基本的功能,如移动和射击。

1. 创建新的Actor类(Player)

首先,你需要创建一个新的C++类,继承自AActor或其子类(例如APawnACharacter,如果你使用的是UE4的Character模板)。

// Player.h  
#pragma once  
  
#include "CoreMinimal.h"  
#include "GameFramework/Pawn.h"  
#include "Components/CapsuleComponent.h"  
#include "Components/InputComponent.h"  
#include "Components/StaticMeshComponent.h"  
  
class APlayer : public APawn  
{  
    GENERATED_BODY()  
  
public:  
    // Sets default values for this pawn's properties  
    APlayer();  
  
    // Called when the game starts or when spawned  
    virtual void BeginPlay() override;  
  
    // Called to bind functionality to input  
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;  
  
    // Handlers for input  
    void MoveForward(float Value);  
    void MoveRight(float Value);  
    // ... Add more input handlers for other actions like shooting, jumping, etc.  
  
protected:  
    // Called for bound keys when they are pressed  
    void OnFirePressed();  
  
    // Components  
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")  
    UStaticMeshComponent* MeshComponent;  
  
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")  
    UCapsuleComponent* CapsuleComponent;  
  
    // ... Add more components if needed (e.g., for animations, weapons, etc.)  
};

 

2. 实现Player类

.cpp文件中实现APlayer类的函数。

// Player.cpp  
#include "Player.h"  
  
// Sets default values  
APlayer::APlayer()  
{  
    // Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.  
    PrimaryActorTick.bCanEverTick = true;  
  
    // Create mesh and collision components  
    MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));  
    CapsuleComponent = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComponent"));  
  
    // ... Initialize other components here  
}  
  
// Called when the game starts or when spawned  
void APlayer::BeginPlay()  
{  
    Super::BeginPlay();  
    // Initialize player state here  
}  
  
// Called to bind functionality to input  
void APlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)  
{  
    Super::SetupPlayerInputComponent(PlayerInputComponent);  
  
    // Bind axis movements to SetAxisValue on the movement component  
    PlayerInputComponent->BindAxis("MoveForward", this, &APlayer::MoveForward);  
    PlayerInputComponent->BindAxis("MoveRight", this, &APlayer::MoveRight);  
  
    // Bind actions to functions on this pawn  
    PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &APlayer::OnFirePressed);  
    // ... Bind more actions here  
}  
  
// Called for bound keys when they are pressed  
void APlayer::OnFirePressed()  
{  
    // Implement firing logic here  
    // For example, spawn a projectile at the player's position  
}  
  
// Handlers for input  
void APlayer::MoveForward(float Value)  
{  
    // Use the value to move the pawn forward/backward  
    // You might have a movement component to handle this  
}  
  
void APlayer::MoveRight(float Value)  
{  
    // Use the value to move the pawn left/right  
    // ...  
}  
  
// ... Implement other functions and handlers here

3. 在游戏中使用Player类

在UE4编辑器中,你需要创建一个蓝图或C++派生类来实例化APlayer类,并将其添加到场景中。你也可以通过蓝图或C++代码来控制角色的行为。

4. 注意事项

  • 确保你已经正确设置了项目的构建路径和依赖项,以便能够编译和运行C++代码。
  • 在UE4中,许多常见的游戏逻辑(如移动、射击等)可以通过蓝图系统来实现,而无需编写C++代码