Experience如何定义了在特定游戏情境下(如主菜单、特定地图、特定模式)应该使用哪些Pawn数据、能力集、动作输入、相机等

体验(Experience):ULyraExperienceDefinition

路径:/LyraGame/GameModes/LyraExperienceDefinition.h
学习内容:这是Lyra架构的核心创新之一。Experience 像一个数据资产,定义了在特定游戏情境下(如主菜单、特定地图、特定模式)应该使用哪些Pawn数据、能力集、动作输入、相机等。这实现了游戏逻辑与具体地图的强解耦。
问题:
1.Experience如何定义了在特定游戏情境下(如主菜单、特定地图、特定模式)应该使用哪些Pawn数据、能力集、动作输入、相机等.
2.怎样实现了游戏逻辑与具体地图的强解耦。

非常好!你指出了 Lyra 游戏架构中一个非常核心和先进的设计概念。ULyraExperienceDefinition(体验定义)确实是 Lyra 项目解耦和灵活性的关键。

下面我们来详细解答你的两个问题。

1. Experience 如何定义特定游戏情境下的配置

ULyraExperienceDefinition 本身是一个数据资产(UPrimaryDataAsset),它不包含逻辑,而是作为一个配置容器组织者。它通过以下几个核心属性来定义游戏情境:

// 1. 定义默认的Pawn数据
UPROPERTY(EditDefaultsOnly, Category=Gameplay)
TObjectPtr<const ULyraPawnData> DefaultPawnData;
  • 作用ULyraPawnData 本身也是一个数据资产,它通常会包含:
    • Pawn类:在此体验中玩家应该使用什么类型的Pawn。
    • 输入配置:绑定输入操作(Input Action)和输入上下文(Input Context),定义了玩家可以执行哪些操作。
    • 相机模式:指定默认的相机模式,以及可能用到的其他相机模式。
    • 能力集:一个 ULyraAbilitySet 的数组,定义了此Pawn初始拥有的所有游戏技能(Gameplay Abilities)和属性(Attributes)。
  • 通过这一项,Experience 就定义了“玩家角色”的核心行为和外貌。
// 2. 定义要执行的游戏特性动作
UPROPERTY(EditDefaultsOnly, Instanced, Category="Actions")
TArray<TObjectPtr<UGameFeatureAction>> Actions;
  • 作用:这是 Experience 系统最强大的部分。UGameFeatureAction 是一个基类,可以派生出各种具体功能的动作。
  • 如何工作:当 Experience 被加载和激活时,它会遍历这个数组并执行每个 Action 的 OnGameFeatureRegisteringOnGameFeatureLoadingOnGameFeatureActivating 等方法。当 Experience 卸载时,则会执行对应的反操作(Deactivating, Unloading等)。
  • 具体Action示例
    • UGameFeatureAction_AddInputContextMapping:为此体验添加特定的输入映射上下文,实现输入配置的动态加载。
    • UGameFeatureAction_AddAbilities:为特定的Actor(如玩家控制的Pawn)添加一套技能。
    • UGameFeatureAction_AddCameraMode:向游戏中添加可用的相机模式。
    • UGameFeatureAction_AddComponents:动态地为Actor添加新的组件。
    • UGameFeatureAction_AddSpawnedActors:在关卡中动态生成Actor(如游戏规则Actor、HUD管理器等)。
  • 通过这一系列可配置的 Action,Experience 能够动态地、按需地改变游戏世界的规则、UI、输入和实体,而无需硬编码。
// 3. 定义要启用的游戏特性插件
UPROPERTY(EditDefaultsOnly, Category = Gameplay)
TArray<FString> GameFeaturesToEnable;
  • 作用:Lyra 使用了一套名为“Game Features”的插件系统。一个 Game Feature 插件可以包含上述的各种 UGameFeatureAction、新的角色模型、音效、关卡片段等。
  • 如何工作:当 Experience 加载时,它会激活这个列表中指定的 Game Feature 插件。这些插件本身也包含自己的 Action,从而进一步扩展和定制游戏体验。这使得功能的模块化和按需加载成为可能。
// 4. 组合其他操作集
UPROPERTY(EditDefaultsOnly, Category=Gameplay)
TArray<TObjectPtr<ULyraExperienceActionSet>> ActionSets;
  • 作用:为了促进复用,可以将一组常用的 Actions 打包到另一个数据资产 ULyraExperienceActionSet 中。
  • 如何工作:Experience 在激活时,不仅会执行自己的 Actions,还会递归地执行所有 ActionSets 中包含的 Actions。这允许设计师创建一些基础的动作集合(例如“基础FPS体验”、“基础载具体验”),然后在多个不同的 Experience 中重复使用它们。

总结流程
当游戏切换到某个特定的 Experience(例如,从主菜单进入“死亡竞赛”地图)时:

  1. 加载并激活 DeathMatchExperience 数据资产。
  2. 激活 GameFeaturesToEnable 列表中的插件。
  3. DefaultPawnData 赋予玩家状态,从而为玩家创建正确的Pawn、输入和技能。
  4. 按顺序执行所有 ActionsActionSets 中的 Actions,从而:
    • 配置HUD。
    • 生成游戏规则管理器。
    • 添加地图特定的输入上下文。
    • 生成AI敌人。
    • …等等。

2. 如何实现游戏逻辑与具体地图的强解耦

这是通过将游戏模式的逻辑配置从地图中剥离出来实现的。

传统UE架构的问题:

  • 在传统项目中,AGameModeBase 的子类通常是在地图的“世界设置”中硬性指定的。
  • 这意味着,这张地图就永远和这个游戏模式绑定了。如果你想在同一张地图上玩不同的模式(例如,在“沙漠”地图上玩“团队死斗”和“夺旗”),你需要复制地图,或者在地图中编写复杂的、条件性的初始化逻辑,这非常不灵活且难以维护。

Lyra 的解决方案:

  1. 唯一的、全局的 GameMode:Lyra 通常只有一个 ALyraGameMode。这个 GameMode 不包含特定模式的硬编码逻辑。它的主要职责是管理游戏状态和决定并加载当前应该使用的 Experience

  2. Experience 的决策动态化:GameMode 通过一个 ULyraExperienceManagerComponent 来决定使用哪个 Experience。决策逻辑可以是:

    • 根据 URL 参数(?Game=ExperienceName)。
    • 根据地图资产中配置的默认 Experience。
    • 根据玩家投票或其他游戏状态。
    • 关键在于,这个决策是运行时发生的,而不是编译时或地图编辑时硬编码的。
  3. 地图与模式的解耦

    • 一张地图资产不再直接指定一个 GameMode 类。
    • 它只需要(或者甚至不需要)指定一个默认的 ULyraExperienceDefinition 数据资产。
    • 同一张地图,如果加载了不同的 Experience,就会变成完全不同的游戏体验。
    • 例子
      • Map_Desert 地图。
      • 加载 EXP_TeamDeathMatch:地图上会生成团队基地、团队专属武器,并启用团队记分规则。
      • 加载 EXP_CaptureTheFlag:地图上会生成旗帜点,并启用夺旗规则。
      • 这两种体验的差异完全由它们各自的数据资产(EXP_TeamDeathMatchEXP_CaptureTheFlag)中定义的 DefaultPawnDataActionsGameFeaturesToEnable 来决定,而无需修改 Map_Desert 地图本身
  4. Game Feature 插件的支持:这种解耦因为 Game Feature 系统而变得更加强大。一个游戏模式(如夺旗)的所有特定内容(旗帜Actor、规则逻辑、UI等)都可以被打包到一个独立的 Game Feature 插件中。只有当加载了需要它的 Experience 时,这个插件才会被激活和加载。这实现了内容的“按需流送”,避免了内存的浪费。

结论:

ULyraExperienceDefinition 通过将游戏配置数据化、模块化和动态化,实现了前所未有的灵活性。它把“游戏是什么”从一个硬编码的类(AGameMode)转变为一个可组合的数据资产。这使得设计师能够像搭积木一样,通过组合不同的 PawnData、ActionSets 和 GameFeatures 来创造新的游戏模式,而程序员则可以专注于编写可复用的 UGameFeatureAction,从而极大地提升了项目的迭代速度和内容创作的自由度。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值