深入 UE5 第三人称游戏:目录结构全解析与代码示例

目录

项目根目录:项目的基石

Content 目录:游戏内容的核心仓库

LevelPrototyping 目录

StarterContent 目录

ThirdPerson 目录

Intermediate 目录

Saved 目录

其他特殊目录

目录结构优化与最佳实践

总结


 

在虚幻引擎 5(UE5)的开发领域中,第三人称游戏以其独特的视角和丰富的交互体验深受玩家喜爱。对于开发者而言,理解并合理运用 UE5 第三人称游戏的目录结构,是构建高质量游戏的关键基础。本文将深入剖析常见的目录分类,结合实际代码示例,全面展现目录结构在游戏开发中的重要性和应用方式。

项目根目录:项目的基石

 

项目根目录是 UE5 项目的核心起始点,包含了一系列对项目运行和管理至关重要的文件和文件夹,它们构成了整个游戏项目的基础框架。

 

  1. .uproject 文件:这是项目的核心标识文件,如同项目的 “钥匙”,存储着项目的基本信息、依赖项以及与 UE5 引擎相关的配置。当双击打开该文件时,UE5 编辑器会依据其中的设置加载项目所需的各类资源和插件,从而启动项目开发环境。例如,在创建新的 UE5 第三人称游戏项目时,生成的.uproject文件会记录项目的名称、创建时间、使用的引擎版本等关键信息,确保每次打开项目时,编辑器都能正确初始化项目状态。
  2. Config 文件夹:此文件夹犹如项目的 “控制中心”,存放着各种配置文件,这些文件用于调整 UE5 引擎和游戏的各种行为和属性。
    • DefaultEngine.ini:主要负责配置 UE5 引擎的基础运行参数,对游戏的整体性能和表现有着深远影响。例如,通过修改以下代码片段,可以优化游戏的渲染性能:
[SystemSettings]
r.DefaultFeature.AntiAliasing=2
r.ShadowQuality=2

上述代码将抗锯齿和阴影质量设置为中等水平(值为 2)。在实际开发中,开发者可以根据目标平台的硬件性能和游戏的视觉需求,灵活调整这些参数。对于配置较低的移动设备,可以降低抗锯齿和阴影质量,以提高游戏的帧率和流畅度;而在高端 PC 平台上,则可以提高这些参数,以获得更逼真的视觉效果。

 

  • DefaultGame.ini:专注于游戏的特定设置,包括游戏模式、角色属性、物品属性等方面。例如,若要调整第三人称角色的初始生命值和移动速度,可以添加如下代码:

 

[MyCharacterSettings]
StartingHealth=100
DefaultMoveSpeed=600.0

 

这样,在游戏开始时,角色将拥有 100 点生命值,并且默认的移动速度为每秒 600 个单位。开发者还可以在这个文件中配置游戏的难度等级、资源掉落概率等各种游戏性相关的参数,以实现不同的游戏体验。

 

  • DefaultInput.ini:负责定义游戏的输入设置,涵盖键盘、鼠标、手柄等各种输入设备的按键绑定。以下代码展示了如何绑定常见的游戏动作到特定按键:

 

[/Script/Engine.InputSettings]
bEnableMouseSmoothing=True
; 绑定鼠标移动和视角控制
AxisMappings=(AxisName="MouseX", Key=MouseX, Scale=0.1)
AxisMappings=(AxisName="MouseY", Key=MouseY, Scale=0.1)
; 绑定跳跃按键
ActionMappings=(ActionName="Jump", Key=SpaceBar)
; 绑定攻击按键
ActionMappings=(ActionName="Attack", Key=LeftMouseButton)

 

在游戏运行时,这些配置会实时生效,确保玩家的输入操作能够准确地转化为游戏中的相应动作。例如,当玩家按下空格键时,角色会执行跳跃动作;移动鼠标时,角色的视角会相应地转动。

Content 目录:游戏内容的核心仓库

 

Content 目录是存放游戏核心内容的主要场所,涵盖了从角色、场景到各种资源的丰富内容,是游戏开发的核心区域。

 

  1. Characters 目录:这个目录是游戏中角色相关资源的集中存储地,包含多个子目录,每个子目录都专注于管理特定类型的角色资源,共同塑造出角色的外观、动作和行为。
    • Animations 子目录:存储角色的各类动画资源,是实现角色生动动作表现的关键所在。以ABP_Manny.uasset为例,这是角色 Manny 的动画蓝图,它通过构建复杂的动画状态机来管理一系列动画的播放和过渡逻辑。以下是一个简化的动画状态机切换逻辑示例,用 C++ 代码展示:

 

  • Animations 子目录
// 假设在角色的动画蓝图类中
class UMyCharacterAnimBP : public UAnimInstance
{
public:
    // 定义变量表示角色的速度
    float CharacterSpeed;
    // 动画更新函数
    void UpdateAnimation(float InSpeed)
    {
        CharacterSpeed = InSpeed;
        // 根据速度切换动画状态
        if (CharacterSpeed > 500.0f)
        {
            // 切换到奔跑动画
            Montage_Play(RunMontage);
        }
        else if (CharacterSpeed > 100.0f && CharacterSpeed <= 500.0f)
        {
            // 切换到行走动画
            Montage_Play(WalkMontage);
        }
        else
        {
            // 切换到闲置动画
            Montage_Play(IdleMontage);
        }
    }
};

 

在实际游戏中,角色的速度会根据玩家操作实时更新。通过这样的动画状态机逻辑,当角色速度超过 500.0f 时,播放奔跑动画;速度在 100.0f 到 500.0f 之间时,播放行走动画;速度低于 100.0f 时,播放闲置动画,从而实现角色动作的自然流畅切换。

 

  • Materials 子目录:包含角色材质相关文件,这些文件决定了角色的外观质感。基础材质定义了角色表面的基本属性,如颜色、粗糙度、金属度等。材质函数则用于实现一些可复用的材质计算逻辑,比如模拟金属的反射效果、布料的纹理细节等。材质实例是在基础材质的基础上进行个性化调整的结果,通过修改材质实例的参数,可以快速创建不同风格的角色材质。例如,有一个基础的金属材质,通过材质函数添加了划痕和磨损效果,然后创建多个材质实例,分别调整颜色和磨损程度,就可以用于不同的金属装备或角色部件。
  • Meshes 子目录:存放角色的网格模型,这些模型是角色在游戏场景中的可视化基础。高精度的网格模型可以呈现出丰富的细节,但会增加性能开销;低精度模型虽然细节较少,但能提高游戏的运行效率。在开发过程中,需要根据游戏的需求和目标平台的性能进行权衡。例如,在移动端游戏中,为了保证帧率,可能会使用相对低精度的角色网格模型,并通过纹理和材质来增强细节;而在高端 PC 游戏中,则可以使用高精度模型来展现极致的视觉效果。同时,还会涉及到模型的 LOD(Level of Detail)技术,即根据角色与相机的距离,自动切换不同精度的模型,进一步优化性能。
  • Rigs 子目录:与角色的骨骼绑定和动画控制密切相关。骨骼绑定是将角色的网格模型与骨骼结构连接起来,使得骨骼的运动能够带动网格模型变形,从而实现自然的动画效果。动画控制相关的资源则用于调整和优化动画的表现,如设置骨骼的运动范围、添加 IK(Inverse Kinematics,反向运动学)约束等。以一个简单的角色攀爬动作举例,通过 IK 约束可以确保角色的手和脚能够准确地抓住攀爬的物体表面,使动作更加真实。
  • Textures 子目录:存储角色使用的纹理资源,包括漫反射纹理、法线纹理、粗糙度纹理等。漫反射纹理决定了角色表面的基本颜色和图案,法线纹理用于模拟表面的凹凸细节,粗糙度纹理则控制表面的光泽度。这些纹理相互配合,能够为角色增添丰富的细节和真实感。比如一个角色的皮肤纹理,漫反射纹理呈现出皮肤的颜色和肤色差异,法线纹理模拟皮肤的毛孔和皱纹,粗糙度纹理则表现出皮肤的光滑或粗糙程度。

LevelPrototyping 目录

 

用于存放关卡原型相关资源,在游戏开发的初期阶段发挥着重要作用。这个目录是开发者进行创意实验和关卡布局探索的地方,可以快速搭建关卡原型,尝试不同的玩法和设计理念。

 

  • Materials 子目录:包含关卡原型使用的材质,这些材质可以是简单的测试材质,用于快速搭建场景,也可以是具有特殊效果的材质,用于验证某种设计思路。例如,在创建一个科幻风格的关卡原型时,可能会使用具有发光效果的材质来模拟能量装置,通过调整材质的参数,如发光颜色、强度等,来达到理想的视觉效果。
  • Meshes 子目录:存放关卡原型所需的网格模型,如简单的地形块、建筑模块等。这些模型通常是低精度的,用于快速搭建场景结构,验证关卡布局和空间感。例如,使用简单的立方体和圆柱体网格来构建建筑物的基本框架,通过快速组合和调整这些模型,能够快速呈现关卡的大致形态,帮助开发者直观感受关卡的规模、路径规划是否合理等,为后续的精细制作提供方向。
  • Textures 子目录:提供相应的纹理资源,为关卡原型的网格模型增添细节和视觉效果。与正式游戏的纹理相比,关卡原型的纹理可能相对简单,但同样能起到区分不同场景元素、营造氛围的作用。比如,使用简单的纹理来区分草地、道路和建筑表面,让开发者在早期就能对关卡的视觉风格有初步的把握,确定后续纹理制作的方向。

StarterContent 目录

 

这是 UE5 提供的起始内容目录,包含了丰富多样的基础资源,为游戏开发提供了便捷的起点。

 

  • Architecture 子目录:拥有各种建筑相关的网格模型,如墙壁、地板、柱子、门窗等。这些模型是搭建游戏场景的基础元素,具有不同的尺寸和风格,可以满足多种场景搭建需求。例如,利用Wall_400x400.uassetFloor_400x400.uasset等模型,可以快速构建室内场景的基本框架;而Wall_Door_400x300.uassetWall_Window_400x300.uasset等模型则为场景增添了功能性和细节。在实际使用中,可以通过蓝图脚本实现门的开关功能,示例代码如下:

 

// 在门的蓝图类中
class AMyDoor : public AActor
{
public:
    UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    UStaticMeshComponent* DoorMesh;
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    float OpenAngle = 90.0f;
    bool bIsOpen = false;

    UFUNCTION(BlueprintCallable)
    void OpenDoor()
    {
        if (!bIsOpen)
        {
            FRotator targetRotation = DoorMesh->GetRelativeRotation();
            targetRotation.Yaw += OpenAngle;
            DoorMesh->SetRelativeRotation(targetRotation, false, 0, ETeleportType::None);
            bIsOpen = true;
        }
    }

    UFUNCTION(BlueprintCallable)
    void CloseDoor()
    {
        if (bIsOpen)
        {
            FRotator targetRotation = DoorMesh->GetRelativeRotation();
            targetRotation.Yaw -= OpenAngle;
            DoorMesh->SetRelativeRotation(targetRotation, false, 0, ETeleportType::None);
            bIsOpen = false;
        }
    }
};

 

  • Audio 子目录:存放各种音频资源,涵盖环境音效、事件音效、背景音乐等。环境音效如风声、雨声、鸟鸣声等,能够营造出逼真的游戏环境氛围;事件音效则与游戏中的特定事件相关,如爆炸、射击、开门声等,增强游戏的交互感和沉浸感;背景音乐则为游戏定下情感基调,根据不同的场景和情节进行切换。例如,在战斗场景中,激昂的背景音乐和激烈的战斗音效能够提升玩家的紧张感和兴奋感;而在宁静的乡村场景中,舒缓的背景音乐和自然环境音效则能让玩家感受到轻松和平静。在蓝图中添加音频组件并播放音效的代码示例如下:

 

// 在包含音频的蓝图类的构造函数中
void AMyActor::AMyActor()
{
    // 创建音频组件
    AudioComponent = CreateDefaultSubobject(TEXT("AudioComponent"));
    // 设置音频组件的音效
    static ConstructorHelpers::FObjectFinder SoundAsset(TEXT("/Game/StarterContent/Audio/Explosion_Cue.Explosion_Cue"));
    if (SoundAsset.Succeeded())
    {
        AudioComponent->SetSound(SoundAsset.Object);
    }
    // 将音频组件附加到根组件
    AudioComponent->SetupAttachment(RootComponent);
}

// 在需要播放音效的函数中
void AMyActor::PlayExplosionSound()
{
    if (AudioComponent)
    {
        AudioComponent->Play();
    }
}

 

  • Blueprints 子目录:包含各种蓝图资源,这些蓝图是快速创建游戏对象和实现功能的重要工具。比如Blueprint_CeilingLight.uassetBlueprint_WallSconce.uasset等蓝图,分别用于创建天花板灯和壁灯对象。通过蓝图,开发者可以直观地设置灯光的属性,如颜色、亮度、照射范围等,而无需编写复杂的代码。在蓝图中,还可以添加交互逻辑,使灯光能够响应玩家的操作,例如玩家靠近时自动亮起,离开时自动熄灭。下面是一段简单的蓝图交互逻辑代码示例(使用蓝图可视化脚本语言):

 

graph TD;
    A[玩家进入碰撞区域] --> B{是否在灯光交互范围内};
    B --> |是| C[触发灯光亮起事件];
    B --> |否| D[不执行操作];
    C --> E[设置灯光亮度为最大];

玩家进入碰撞区域

是否在灯光交互范围内

触发灯光亮起事件

不执行操作

设置灯光亮度为最大

 

这段逻辑表示当玩家进入特定的碰撞区域时,系统会检查玩家是否在灯光的交互范围内。如果在范围内,就触发灯光亮起事件,将灯光亮度设置为最大;如果不在范围内,则不执行任何操作。

 

  • HDRI 子目录:存储 HDRI(高动态范围图像)资源,HDRI 在游戏场景照明中起着关键作用。例如HDRI_Epic_Courtyard_Daylight.uasset,它可以为场景提供逼真的自然光照效果,模拟真实世界中的光照环境,包括阳光的强度、颜色和阴影的柔和度等。在 UE5 的关卡中使用 HDRI 时,通过调整相关参数,如旋转角度、强度和色调映射等,可以轻松营造出不同时间和天气条件下的场景氛围。比如在白天场景中,使用明亮且偏暖色调的 HDRI 来模拟阳光明媚的效果;在夜晚场景中,使用较暗且偏冷色调的 HDRI 来营造出宁静的氛围。
  • Maps 子目录:存放游戏地图,像StarterMap.umap等。这些地图是游戏世界的载体,包含了场景布局、地形地貌、物体放置等信息。在 UE5 的地图编辑器中,开发者可以对地图进行可视化编辑,添加和调整各种游戏元素。同时,地图还关联着一些辅助数据文件,如StarterMap_BuiltData.uasset,用于存储地图的构建数据,包括光照烘焙结果、导航网格数据等。光照烘焙可以预先计算场景中的光照效果,提高游戏运行时的性能和视觉质量;导航网格数据则用于实现角色在场景中的自动寻路功能。在代码中,可以通过以下方式获取地图中的特定 Actor:

 

// 在关卡脚本中获取地图中的某个Actor
AActor* AMyLevelScriptActor::FindSpecificActorInMap()
{
    TArray actors;
    GetWorld()->GetActorsOfClass(ASpecificActorClass::StaticClass(), actors);
    if (actors.Num() > 0)
    {
        return actors[0];
    }
    return nullptr;
}

 

  • Materials 子目录:提供了丰富多样的材质资源,涵盖从建筑材料到自然材质等各种类型。这些材质为场景中的物体赋予了不同的外观和质感,例如M_Brick_Clay_New.uasset用于模拟新的粘土砖块材质,M_Ground_Grass.uasset用于呈现草地的效果。材质可以通过材质编辑器进行深度定制,开发者可以调整颜色、纹理、粗糙度、金属度等属性,还可以添加各种材质节点来实现复杂的效果,如模拟水的流动、金属的反射等。下面是一个简单的材质节点连接示例(使用 UE5 材质编辑器的节点表示法):

 

 

graph TD;
    A[基础颜色节点] --> B[材质输出节点];
    C[法线纹理节点] --> B;
    D[粗糙度节点] --> B;

基础颜色节点

材质输出节点

法线纹理节点

粗糙度节点

 

 

在这个示例中,基础颜色节点提供材质的基本颜色信息,法线纹理节点用于模拟表面的凹凸细节,粗糙度节点控制表面的光泽度,它们都连接到材质输出节点,共同构成一个完整的材质效果。

 

  • Particles 子目录:包含各种粒子效果资源,如P_Explosion.uassetP_Fire.uasset等。粒子系统在游戏中用于创建动态的视觉效果,如爆炸、火焰、烟雾、灰尘等。通过调整粒子系统的参数,如粒子的发射速率、速度、大小、寿命、颜色变化等,可以实现各种逼真的效果。例如,在制作爆炸效果时,增加粒子的发射速率,在制作爆炸效果时,增加粒子的发射速率和初始速度,使爆炸看起来更具冲击力;通过设置粒子的颜色从明亮的黄色到暗灰色的渐变,模拟爆炸过程中的能量释放和烟雾产生。同时,粒子系统还可以与其他游戏元素进行交互,比如与碰撞体交互时改变粒子的运动轨迹。在蓝图中创建和控制粒子系统的代码示例如下:
// 在包含粒子系统的蓝图类的构造函数中
void AMyExplosionActor::AMyExplosionActor()
{
    // 创建粒子系统组件
    ParticleSystemComponent = CreateDefaultSubobject(TEXT("ParticleSystemComponent"));
    // 设置粒子系统的模板
    static ConstructorHelpers::FObjectFinder ParticleAsset(TEXT("/Game/StarterContent/Particles/P_Explosion.P_Explosion"));
    if (ParticleAsset.Succeeded())
    {
        ParticleSystemComponent->SetTemplate(ParticleAsset.Object);
    }
    // 将粒子系统组件附加到根组件
    ParticleSystemComponent->SetupAttachment(RootComponent);
}

// 在需要触发爆炸效果的函数中
void AMyExplosionActor::TriggerExplosion()
{
    if (ParticleSystemComponent)
    {
        ParticleSystemComponent->Activate(true);
    }
}

 

  • Props 子目录:存放各种道具模型,如SM_Chair.uassetSM_TableRound.uasset等。这些道具模型丰富了游戏场景,增加了场景的真实感和交互性。道具模型可以与玩家进行交互,例如玩家可以拿起、移动或使用这些道具。在代码中,可以通过碰撞检测来实现玩家与道具的交互逻辑。例如,当玩家靠近椅子时,显示提示信息,允许玩家坐下。示例代码如下:

 

// 在椅子的蓝图类中
class AMyChair : public AActor
{
public:
    UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    UStaticMeshComponent* ChairMesh;

    UFUNCTION(BlueprintNativeEvent)
    void OnPlayerOverlap(AActor* OverlappedActor, AActor* OtherActor);

    void OnPlayerOverlap_Implementation(AActor* OverlappedActor, AActor* OtherActor)
    {
        if (OtherActor->IsA())
        {
            // 显示提示信息,例如通过HUD显示“按下E键坐下”
            // 这里假设存在一个HUD类,有显示提示信息的函数
            AMyHUD* MyHUD = Cast(GetWorld()->GetFirstPlayerController()->GetHUD());
            if (MyHUD)
            {
                MyHUD->ShowPromptMessage("按下E键坐下");
            }
        }
    }

    // 假设在玩家角色类中有处理坐下操作的函数
    UFUNCTION(BlueprintCallable)
    void SitOnChair(APlayerCharacter* Player)
    {
        // 实现玩家坐下的逻辑,例如调整玩家的位置和动画
        Player->SetActorLocation(GetActorLocation() + FVector(0, 0, -50));
        // 播放坐下动画,假设玩家角色类中有播放动画的函数
        Player->PlaySitAnimation();
    }
};

 

  • Shapes 子目录:提供各种基础形状的网格模型,如立方体、球体、圆柱体等。这些简单的形状是构建复杂模型的基础,也可以直接用于游戏场景中,例如作为碰撞体、简单的障碍物或装饰元素。在实际开发中,可以通过组合和变形这些基础形状来创建更复杂的物体。例如,将多个立方体组合成一个建筑物的框架,或者将球体作为游戏中的道具或角色的头部模型。在代码中,可以通过修改这些形状的变换属性(位置、旋转、缩放)来实现不同的效果。示例代码如下:

 

// 在包含形状模型的蓝图类中
class AMyShapeActor : public AActor
{
public:
    UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    UStaticMeshComponent* ShapeMesh;

    UFUNCTION(BlueprintCallable)
    void ScaleShape(float ScaleFactor)
    {
        if (ShapeMesh)
        {
            FVector currentScale = ShapeMesh->GetRelativeScale3D();
            ShapeMesh->SetRelativeScale3D(currentScale * ScaleFactor);
        }
    }
};

 

  • Textures 子目录:存储大量的纹理资源,这些纹理是赋予材质真实感和细节的关键。从砖石的表面纹理到金属的光泽纹理,再到自然环境中的草地、岩石纹理等,一应俱全。例如,T_Brick_Clay_Beveled_D.uasset是一种带有斜边的粘土砖漫反射纹理,它定义了砖块的基本颜色和图案。在材质编辑器中,将这类漫反射纹理与法线纹理(如T_Brick_Clay_Beveled_N.uasset)、粗糙度纹理等结合使用,可以创建出高度逼真的砖块材质。法线纹理通过改变光线反射方向来模拟表面的凹凸效果,粗糙度纹理则控制表面对光线的散射程度,从而实现不同的质感表现。在代码中,虽然通常不会直接操作纹理本身,但在材质实例化过程中,会涉及到纹理资源的引用和参数传递。例如,在创建一个材质实例蓝图类时:

 

// 创建一个材质实例蓝图类
class UMyBrickMaterialInstance : public UMaterialInstanceDynamic
{
public:
    // 构造函数
    UMyBrickMaterialInstance()
    {
        // 引用基础材质
        static ConstructorHelpers::FObjectFinder BrickMaterial(TEXT("/Game/StarterContent/Materials/M_Brick_Clay_Beveled.M_Brick_Clay_Beveled"));
        if (BrickMaterial.Succeeded())
        {
            SetParent(BrickMaterial.Object);
        }
        // 设置纹理参数,假设基础材质有一个名为“BaseColorTexture”的纹理参数
        static ConstructorHelpers::FObjectFinder BrickDiffuseTexture(TEXT("/Game/StarterContent/Textures/T_Brick_Clay_Beveled_D.T_Brick_Clay_Beveled_D"));
        if (BrickDiffuseTexture.Succeeded())
        {
            SetTextureParameterValue("BaseColorTexture", BrickDiffuseTexture.Object);
        }
    }
};

 

这段代码创建了一个基于特定砖块材质的动态材质实例,并设置了其漫反射纹理。通过这种方式,开发者可以在游戏运行时灵活地修改材质的外观,例如根据不同的光照条件或游戏进程切换纹理。

ThirdPerson 目录

 

  • Blueprints 子目录:包含与第三人称游戏玩法紧密相关的蓝图资源,其中BP_ThirdPersonCharacter.uassetBP_ThirdPersonGameMode.uasset是核心文件。BP_ThirdPersonCharacter蓝图定义了第三人称角色的属性、行为和外观。在这个蓝图中,开发者可以设置角色的移动速度、跳跃高度、生命值等属性,还可以添加各种组件来实现特定功能,如胶囊碰撞体组件用于检测碰撞,骨骼网格体组件用于显示角色模型和播放动画。通过蓝图可视化脚本,能够编写角色的移动逻辑、战斗逻辑等。例如,以下是角色移动逻辑的简化蓝图代码(以可视化节点形式描述):

 

获取玩家输入的移动方向

计算移动向量

应用移动向量到角色的位置

检查是否碰撞到障碍物

调整角色位置以避免穿透

继续移动

 

BP_ThirdPersonGameMode蓝图则负责管理游戏的整体流程和规则,如游戏的开始、结束条件,生成敌人和道具的逻辑,以及控制游戏的难度级别等。例如,在游戏模式蓝图中,可以编写代码来随机生成敌人:

 

// 在游戏模式蓝图类中
class AMyThirdPersonGameMode : public AGameModeBase
{
public:
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    TSubclassOf EnemyClass;

    UFUNCTION(BlueprintCallable)
    void SpawnEnemy()
    {
        // 随机生成一个位置
        FVector spawnLocation = FVector(FMath::RandRange(-1000.0f, 1000.0f), FMath::RandRange(-1000.0f, 1000.0f), 0.0f);
        FRotator spawnRotation = FRotator::ZeroRotator;
        // 生成敌人
        GetWorld()->SpawnActor(EnemyClass, spawnLocation, spawnRotation);
    }
};

 

  • Input 子目录(续):管理游戏的输入相关设置,包括输入映射和具体的输入动作定义。IMC_Default.uasset通常是输入映射配置文件,它将玩家的输入设备操作(如键盘按键、鼠标移动、手柄按钮等)映射到游戏中的具体动作。而Actions子目录下的IA_Jump.uassetIA_Look.uassetIA_Move.uasset等文件,则分别定义了跳跃、视角控制、移动等具体输入动作。

 

在 UE5 中,输入系统的配置和代码实现紧密结合。例如,在IA_Move.uasset对应的输入动作定义中,会关联到角色移动的逻辑代码。在角色蓝图类中,通过接收输入动作的事件,来驱动角色的移动:

// 在第三人称角色蓝图类中
class AThirdPersonCharacter : public ACharacter
{
public:
    // 定义移动速度变量
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
    float MoveSpeed;

    // 移动函数,绑定到输入动作
    void MoveForward(float Value)
    {
        if (Value != 0.0f)
        {
            FVector MoveDirection = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
            AddMovementInput(MoveDirection, Value * MoveSpeed);
        }
    }

    void MoveRight(float Value)
    {
        if (Value != 0.0f)
        {
            FVector MoveDirection = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
            AddMovementInput(MoveDirection, Value * MoveSpeed);
        }
    }
};

 

IMC_Default.uasset中,会将键盘的WASD按键或者手柄的左摇杆操作映射到MoveForwardMoveRight函数,从而实现玩家对角色的移动控制。

 

  • Maps 子目录:存放第三人称游戏特定的地图文件,如ThirdPersonMap.umap。这些地图专为第三人称视角的游戏体验而设计,包含了适合该玩法的场景布局、地形设置以及各种游戏元素的摆放。与其他通用地图不同,第三人称地图更注重玩家视角的呈现和角色在场景中的交互。例如,地图中会设置合适的视野遮挡物和开阔区域,以营造出真实的空间感;同时,还会精心设计角色的行走路径和交互区域,确保玩家在游戏过程中能够流畅地进行探索和任务。

 

在地图构建过程中,需要考虑到第三人称角色的视野范围和移动特性。比如,在设计室内场景时,要保证角色在行走过程中不会因为模型碰撞而出现不自然的卡顿,并且玩家能够清晰地看到周围环境和可交互元素。在代码层面,地图可能会关联特定的游戏逻辑,例如在某个区域触发剧情任务或者生成敌人。下面是一个简单的地图区域触发逻辑示例:

 

// 在地图关卡脚本类中
class AThirdPersonMapLevelScript : public ALevelScriptActor
{
public:
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    TSubclassOf EnemySpawnerClass;

    // 区域触发事件处理函数
    void OnPlayerEnterTriggerZone(AActor* OverlappedActor, AActor* OtherActor)
    {
        if (OtherActor->IsA())
        {
            // 生成敌人
            FVector spawnLocation = GetActorLocation();
            FRotator spawnRotation = FRotator::ZeroRotator;
            GetWorld()->SpawnActor(EnemySpawnerClass, spawnLocation, spawnRotation);
        }
    }
};

 

在 UE5 的关卡编辑器中,可以通过设置碰撞体和绑定事件,将上述代码逻辑应用到地图中的特定区域,当玩家角色进入该区域时,就会触发敌人的生成。

Intermediate 目录

 

Intermediate 目录用于存放项目在编译和构建过程中生成的中间文件,这些文件对于项目的构建和运行起着重要的辅助作用,但通常不需要开发者直接修改。

 

  • CachedAssetRegistry_0.bin:这是资产注册表缓存文件,存储了项目中资产的相关信息,包括资产的路径、类型、依赖关系等。在项目启动和资产加载过程中,UE5 会读取这个文件来快速获取资产的元数据,提高资产加载的效率。例如,当在关卡中添加一个新的模型资源时,资产注册表会记录该模型的相关信息,下次加载关卡时,引擎可以直接从缓存中获取这些信息,而不需要重新扫描整个项目目录来查找和解析该模型的文件。
  • Config/CoalescedSourceConfigs 目录:该目录下存放着合并后的配置文件,这些文件是由多个源配置文件合并生成的。例如,GameUserSettings.ini文件可能会整合来自不同模块或插件的用户设置,确保游戏在运行时能够正确加载和应用统一的用户配置。这种合并机制有助于管理复杂的配置系统,避免配置冲突,并提供了一种集中管理配置的方式。在游戏启动时,UE5 会读取这些合并后的配置文件,根据其中的设置来初始化游戏的各种参数,如分辨率、音效设置、控制选项等。
  • PipInstall 目录:主要用于 Python 相关的依赖管理。在 UE5 项目中,可能会使用 Python 脚本来实现一些自动化工具或扩展功能。extra_urls.txt文件用于指定额外的 Python 包源地址,merged_requirements.in列出了项目所需的 Python 包及其版本要求,pyreqs_plugins.list则记录了与插件相关的 Python 包依赖。例如,如果项目使用了一个自定义的 Python 插件,该插件依赖于numpypandas库,那么在这些文件中就会记录相应的依赖信息,通过pip工具可以根据这些信息自动安装所需的 Python 包,确保项目的 Python 环境配置正确。
  • ReimportCache 目录:存储资产重新导入的缓存数据。当资产在外部工具(如 3D 建模软件)中进行修改并重新导入到 UE5 项目时,UE5 会将导入过程中的一些数据缓存到这个目录。这样,在后续再次导入相同资产时,如果资产的关键属性没有改变,UE5 可以利用缓存数据快速完成导入操作,节省导入时间。例如,一个复杂的角色模型,其导入过程可能涉及到纹理映射、骨骼绑定等多个步骤,第一次导入后,相关的缓存数据会存储在ReimportCache目录。当对模型进行小的修改并再次导入时,UE5 可以直接使用缓存中的部分数据,避免重复执行一些耗时的操作,提高工作效率。
  • ShaderAutogen 目录:包含自动生成的着色器文件。在 UE5 中,着色器是实现图形渲染效果的关键代码片段。ShaderAutogen目录下的文件是根据项目的材质、光照设置和目标平台的特性自动生成的。例如,PCD3D_SM5\AutogenShaderHeaders.ush文件包含了针对 PC 平台和 DirectX 11(Shader Model 5)的自动生成的着色器头文件。这些文件定义了着色器的输入输出变量、函数声明等内容,与材质编辑器中创建的材质节点网络紧密相关。材质节点网络会被编译成具体的着色器代码,而这些自动生成的头文件为着色器的编译和运行提供了必要的支持。在项目开发过程中,当修改了材质的属性或光照设置时,UE5 会重新生成相应的着色器文件,以确保渲染效果的正确性和高效性。

Saved 目录

 

Saved 目录用于存储项目在运行和开发过程中产生的各种临时和持久化数据,这些数据对于项目的正常运行、调试以及用户体验的个性化定制起着关键作用。

 

  • Config 目录:存放不同平台和模块的配置文件,这些文件记录了游戏在运行过程中的用户设置和系统状态。
    • CrashReportClient 目录:存储崩溃报告相关的配置文件。当游戏发生崩溃时,UE5 会根据CrashReportClient.ini中的配置信息收集崩溃现场的数据,如调用堆栈、内存状态等,并将这些信息发送给开发者进行分析。例如,在CrashReportClient.ini中可以配置崩溃报告的上传服务器地址、是否包含详细的调试信息等。这样,开发者可以通过分析崩溃报告来定位和解决游戏中的潜在问题,提高游戏的稳定性。
    • WindowsEditor 目录:包含在 Windows 编辑器环境下的配置文件。EditorPerProjectUserSettings.ini记录了针对当前项目的编辑器用户设置,如界面布局、插件启用状态等;Game.iniGameUserSettings.ini则分别存储游戏的运行时配置和用户自定义的游戏设置。在GameUserSettings.ini中,玩家可以保存自己的游戏偏好设置,如画面质量、音效音量、控制方案等。在代码中,可以通过以下方式读取和修改这些设置:

 

// 读取游戏用户设置中的音量值
float GetSoundVolume()
{
    UGameUserSettings* UserSettings = GetGameUserSettings();
    if (UserSettings)
    {
        return UserSettings->SoundVolume;
    }
    return 0.5f; // 默认音量值
}

// 修改游戏用户设置中的音量值
void SetSoundVolume(float NewVolume)
{
    UGameUserSettings* UserSettings = GetGameUserSettings();
    if (UserSettings)
    {
        UserSettings->SoundVolume = NewVolume;
        UserSettings->ApplySettings();
    }
}

 

  • Logs 目录:保存游戏运行过程中的日志文件,如test.log。日志文件记录了游戏运行时的各种事件和信息,包括游戏启动、资源加载、错误信息、调试输出等。在游戏开发和调试过程中,开发者可以通过查看日志文件来追踪游戏的运行状态,定位和解决问题。例如,如果游戏在加载某个资源时出现错误,日志文件中会记录详细的错误信息,如资源路径、错误类型等,帮助开发者快速找到问题所在。在代码中,可以通过UE_LOG宏来输出自定义的日志信息:

 

// 输出调试日志信息
UE_LOG(LogTemp, Warning, TEXT("This is a warning message from the game."));

 

  • ShaderDebugInfo 目录:存储着色器调试信息。当启用着色器调试功能时,UE5 会将相关的调试数据存储在这个目录下。例如,PCD3D_SM5\WorldGridMaterial_6f0e152f210315b1\Default\DDCKey - Editor.txt文件可能包含特定材质在 PC 平台上使用 DirectX 11(Shader Model 5)渲染时的调试信息,如着色器的编译过程、性能数据等。这些信息对于优化着色器性能、修复渲染错误非常重要。开发者可以通过分析这些调试数据,找出着色器中存在的性能瓶颈或逻辑错误,从而进行针对性的优化和修复。
  • SourceControl 目录:存放与版本控制系统相关的数据,如UncontrolledChangelists.json。这个文件记录了未被版本控制系统管理的文件变更信息。在团队开发环境中,版本控制系统(如 Git、Perforce 等)用于管理项目文件的变更历史和协同开发。当项目中的文件发生变更但尚未被提交到版本控制系统时,这些变更信息会被记录在UncontrolledChangelists.json中,方便开发者查看和管理未提交的修改,确保项目文件的一致性和可追溯性。

其他特殊目录

 

在 UE5 第三人称游戏项目中,还有一些特殊目录,它们在游戏开发和运行中也有着独特的作用。

 

  • __ExternalActors__和__ExternalObjects__目录:这两个目录存放的是外部引用的演员(Actors)和对象(Objects)相关资源。在大型项目开发中,可能会从其他项目、插件或资源库中引入一些预定义的演员或对象,这些资源就会被放置在这两个目录下。以__ExternalActors__\ThirdPerson\Maps\ThirdPersonMap路径下的资源为例,这些外部演员可能是具有特殊功能或外观的角色、道具等,它们可以快速丰富游戏内容,减少重复开发工作。然而,使用这些外部资源时需要注意兼容性和版权问题。在代码中引用这些外部资源时,需要按照特定的路径和方式进行加载。例如:

 

// 加载外部演员资源
AActor* LoadExternalActor()
{
    static ConstructorHelpers::FObjectFinder ExternalActor(TEXT("/Game/__ExternalActors__/ThirdPerson/Maps/ThirdPersonMap/0/43/HYQWORMY4JDQ5X3OKZXFLC.HYQWORMY4JDQ5X3OKZXFLC"));
    if (ExternalActor.Succeeded())
    {
        return ExternalActor.Object;
    }
    return nullptr;
}

 

  • DerivedDataCache 目录(未在提供文件列表中,但在 UE5 项目中常见):该目录是 UE5 的派生数据缓存目录。在项目运行和开发过程中,UE5 会生成大量的派生数据,例如光照烘焙数据、材质编译后的中间数据、纹理压缩后的版本等。这些数据被存储在DerivedDataCache目录中,以便下次使用时可以快速读取,而不需要重新生成。这大大提高了项目的加载速度和开发效率。例如,在进行光照烘焙时,生成的光照数据会缓存到该目录。当再次打开关卡或修改了一些不影响光照烘焙结果的内容时,UE5 可以直接从缓存中读取光照数据,避免了长时间的重新烘焙过程。不过,随着项目的发展,该目录可能会占用大量磁盘空间,开发者可以根据需要定期清理缓存,以释放磁盘空间。清理缓存后,UE5 会在需要时重新生成相应的派生数据。

目录结构优化与最佳实践

 

  1. 目录命名规范:在项目开发过程中,保持一致且有意义的目录命名规范至关重要。目录名应清晰反映其内容,使用英文单词或常见缩写,避免使用特殊字符和中文。例如,对于存放武器相关资源的目录,可以命名为 “Weapons”,而不是使用模糊的缩写或随意的组合。这样,团队成员在查找和管理资源时能够迅速定位,提高工作效率。同时,遵循 UE5 官方推荐的命名约定,有助于与引擎的功能和其他插件更好地兼容。
  2. 资源分类细化:根据游戏内容的不同特性,进一步细化资源分类。除了常见的目录分类,还可以根据游戏的功能模块、资源类型的子类别等进行更细致的划分。比如,在Content目录下,可以为不同的游戏场景创建单独的子目录,如Content\Scenes\CitySceneContent\Scenes\ForestScene等,每个场景目录下再分别存放该场景独有的角色、道具、地形等资源。对于材质资源,可以按照材质的用途细分为Content\Materials\CharacterMaterialsContent\Materials\EnvironmentMaterials等。这样的细化分类可以提高资源管理的效率,减少资源冲突,并且在团队协作时便于不同成员分工管理各自负责的资源。
  3. 版本控制与备份策略:结合版本控制系统(如 Git)对项目目录进行有效的版本管理。将整个项目目录纳入版本控制,包括所有的资源文件、配置文件和代码文件。定期提交代码和资源更新,详细记录每次提交的内容和目的,方便追溯和回滚。同时,制定备份策略,除了依赖版本控制系统的备份,还可以定期将项目目录备份到外部存储设备或云存储服务中,以防止数据丢失。例如,每周进行一次全量备份,每天进行增量备份。在备份时,标注好备份的时间和版本号,以便在需要时能够快速恢复到特定的项目状态。
  4. 跨平台考虑:如果游戏计划发布到多个平台,在目录结构设计时要考虑跨平台的兼容性。不同平台可能对资源的格式、路径长度等有不同的要求。例如,某些移动平台对文件路径长度有限制,在目录命名和资源存放时要避免过长的路径。可以创建平台特定的子目录,如Content\Platforms\MobileContent\Platforms\PC,将针对不同平台优化的资源分别存放在相应目录下。同时,在代码中通过条件编译等方式,根据不同的目标平台加载特定的资源或执行特定的逻辑,确保游戏在各个平台上都能正常运行。
  5. 自动化工具与脚本支持:利用 UE5 的自动化工具和脚本功能,辅助目录结构的管理和资源处理。例如,编写 Python 脚本或使用 UE5 的蓝图脚本,实现资源的自动导入、分类和重命名。可以创建一个脚本,在导入新的角色模型时,自动将其放置到Characters\Meshes目录下,并按照统一的命名规范进行重命名。还可以编写脚本定期清理IntermediateSaved目录下的无用文件,释放磁盘空间,保持项目的整洁和高效。这些自动化工具和脚本可以大大减少重复性工作,提高开发效率和目录管理的准确性。

总结

 

深入理解 UE5 第三人称游戏的目录结构是高效开发游戏的基础。从项目根目录的配置文件,到Content目录丰富的游戏资源,再到IntermediateSaved目录的辅助数据管理,每个目录都在游戏的构建、运行和维护中扮演着不可或缺的角色。通过合理规划目录结构、遵循命名规范、优化资源分类以及结合版本控制和自动化工具,开发者能够更好地组织项目,提高开发效率,减少错误,打造出高质量的第三人称游戏。在实际开发过程中,不断积累经验,根据项目的特点和需求灵活调整目录结构,将有助于应对各种开发挑战,实现游戏的成功开发和发布。

 

 

 

你可能感兴趣的:(游戏开发,ue5,游戏)