WangShuXian6 / blog

FE-BLOG
https://wangshuxian6.github.io/blog/
MIT License
46 stars 10 forks source link

Lyra UML #185

Open WangShuXian6 opened 9 months ago

WangShuXian6 commented 9 months ago

Lyra UML

Lyra项目是Epic Games为Unreal Engine 5开发的一个示例项目,旨在展示如何构建一个模块化、可扩展的游戏系统。这个项目涵盖了一系列的关键游戏开发领域,包括但不限于游戏玩法能力系统、动画、音频、相机系统、角色设计、装备和物品系统、交互系统、游戏设置、用户界面(UI)设计等。我将分几个部分来详细解释这个项目的各个方面。

游戏玩法能力系统(GAS) Lyra项目利用GAS框架来定义和管理角色的各种能力,例如攻击、防御、治疗等。这一框架的核心是UAbilitySystemComponent,Lyra通过ULyraAbilitySystemComponent扩展了这一组件,以支持项目特有的功能。能力(Abilities)是通过UGameplayAbility类实现的,Lyra则通过ULyraGameplayAbility来扩展它,以便添加特定的游戏逻辑。同样,属性(Attributes)和效果(Effects)也通过UAttributeSet和UGameplayEffect进行管理,Lyra项目中有LyraAttributeSet、LyraHealthSet和LyraCombatSet等定制的属性集,用于管理角色的生命值、伤害值等。

动画系统 Lyra项目的动画系统展示了如何使用Unreal Engine的动画蓝图(Animation Blueprints)和状态机(State Machines)来控制角色动画。LyraAnimInstance类是动画实例的核心,它处理动画状态的变更和动画参数的更新。动画蓝图利用这些参数来决定应该播放哪个动画序列,以及如何进行过渡。

音频系统 Lyra项目中的音频系统展示了如何在游戏中实现环境声音、效果音和背景音乐。LyraAudioSettings类用于管理音频设置,而LyraAudioMixEffectsSubsystem则负责处理音频效果,如混响和其他后处理效果。

相机系统 Lyra项目提供了灵活的相机系统,支持多种相机模式,例如第三人称视角。LyraCameraComponent和LyraPlayerCameraManager是实现定制相机行为的关键类。此外,LyraCameraMode和它的派生类,如LyraCameraMode_ThirdPerson,允许开发者为不同的游戏场景定制相机设置。

装备和物品系统 在Lyra项目中,装备和物品系统允许角色与游戏世界中的物品进行互动,比如装备武器或使用消耗品。LyraInventoryManagerComponent管理角色的背包,而LyraEquipmentManagerComponent管理角色的装备。物品通过LyraInventoryItemDefinition类定义,它包含了物品的所有属性和可能的效果。

交互系统 Lyra的交互系统使得角色能够与游戏世界中的其他对象进行动态交互。这是通过ULyraGameplayAbility_Interact和一系列的任务(Tasks)来实现的,例如AbilityTask_WaitForInteractableTargets,它允许角色等待和选择交互目标。

用户界面(UI) Lyra项目提供了一套丰富的UI组件,用于创建游戏内的HUD、菜单和其他界面元素。这包括从基础的按钮和进度条到更高级的组件如设置屏幕和指示器系统。UI组件通常使用Unreal Motion Graphics (UMG) 设计,并通过蓝图或C++代码与游戏逻辑相连接。

WangShuXian6 commented 9 months ago

Lyra项目的整体架构

Lyra项目的主要系统和组件,包括游戏玩法能力系统、角色管理、装备和物品系统、交互系统、UI组件、消息系统、设置系统、游戏阶段管理、性能统计系统、网络和重播系统、音频和特效系统、动画和物理系统、团队系统、多人游戏支持、热更新系统,以及游戏特性管理系统。

@startuml LyraProject

!define RECTANGLE class

package "Gameplay Ability System" {
    RECTANGLE UAbilitySystemComponent
    RECTANGLE UGameplayAbility
    RECTANGLE UAttributeSet
    RECTANGLE ULyraAbilitySystemComponent
    RECTANGLE ULyraGameplayAbility
    RECTANGLE ULyraAttributeSet

    UAbilitySystemComponent <|-- ULyraAbilitySystemComponent
    UGameplayAbility <|-- ULyraGameplayAbility
    UAttributeSet <|-- ULyraAttributeSet
}

package "Character Management" {
    RECTANGLE ALyraCharacter
    RECTANGLE ULyraCharacterMovementComponent
    RECTANGLE ULyraHealthComponent

    ALyraCharacter -- ULyraCharacterMovementComponent : "uses >"
    ALyraCharacter -- ULyraHealthComponent : "uses >"
    ALyraCharacter -- ULyraAbilitySystemComponent : "uses >"
}

package "Equipment and Inventory" {
    RECTANGLE ULyraEquipmentManagerComponent
    RECTANGLE ULyraInventoryManagerComponent
    RECTANGLE ULyraEquipmentDefinition
    RECTANGLE ULyraInventoryItemDefinition

    ALyraCharacter -- ULyraEquipmentManagerComponent : "uses >"
    ALyraCharacter -- ULyraInventoryManagerComponent : "uses >"
    ULyraEquipmentManagerComponent -- ULyraEquipmentDefinition : "manages >"
    ULyraInventoryManagerComponent -- ULyraInventoryItemDefinition : "manages >"
}

@enduml

image

游戏玩法技能系统(Gameplay Ability System, GAS)

@startuml Lyra_GAS

!define RECTANGLE class

package "游戏玩法能力系统" {
    RECTANGLE UAbilitySystemComponent
    RECTANGLE UGameplayAbility
    RECTANGLE UAttributeSet
    RECTANGLE ULyraAbilitySystemComponent
    RECTANGLE ULyraGameplayAbility
    RECTANGLE ULyraAttributeSet

    UAbilitySystemComponent <|-- ULyraAbilitySystemComponent : 扩展
    UGameplayAbility <|-- ULyraGameplayAbility : 扩展
    UAttributeSet <|-- ULyraAttributeSet : 扩展
}

@enduml

image UAbilitySystemComponent是所有能力系统的基础,而UGameplayAbility和UAttributeSet分别定义了角色可以执行的动作和角色的各种属性。Lyra通过ULyraAbilitySystemComponent、ULyraGameplayAbility和ULyraAttributeSet对这些基础类进行了扩展,以添加特定于Lyra的逻辑和功能。

角色管理

@startuml Lyra_CharacterManagement

!define RECTANGLE class

package "角色管理" {
    RECTANGLE ALyraCharacter
    RECTANGLE ULyraCharacterMovementComponent
    RECTANGLE ULyraHealthComponent
    RECTANGLE ULyraAbilitySystemComponent
    RECTANGLE ULyraPawnExtensionComponent

    ALyraCharacter -- ULyraCharacterMovementComponent : "包含 >"
    ALyraCharacter -- ULyraHealthComponent : "包含 >"
    ALyraCharacter -- ULyraAbilitySystemComponent : "包含 >"
    ALyraCharacter -- ULyraPawnExtensionComponent : "包含 >"
}

@enduml

image ALyraCharacter是Lyra项目中所有角色的基类。它包含了角色的基本功能,如移动、健康状况和能力系统的集成。ULyraCharacterMovementComponent负责处理角色的移动逻辑,ULyraHealthComponent管理角色的健康状况,ULyraAbilitySystemComponent是GAS的扩展,为角色提供了使用各种能力的能力,而ULyraPawnExtensionComponent提供了对角色进行扩展的能力,使得角色能够根据不同的游戏模式或需求进行自定义。

装备和物品系统

@startuml Lyra_EquipmentInventory

!define RECTANGLE class

package "装备系统" {
    RECTANGLE ULyraEquipmentManagerComponent
    RECTANGLE ULyraEquipmentDefinition
    RECTANGLE ULyraEquipmentInstance

    ULyraEquipmentManagerComponent -- ULyraEquipmentDefinition : "管理 >"
    ULyraEquipmentManagerComponent -- ULyraEquipmentInstance : "实例化 >"
}

package "物品系统" {
    RECTANGLE ULyraInventoryManagerComponent
    RECTANGLE ULyraInventoryItemDefinition
    RECTANGLE ULyraInventoryItemInstance

    ULyraInventoryManagerComponent -- ULyraInventoryItemDefinition : "管理 >"
    ULyraInventoryManagerComponent -- ULyraInventoryItemInstance : "实例化 >"
}

package "角色" {
    RECTANGLE ALyraCharacter
}

ALyraCharacter -- ULyraEquipmentManagerComponent : "包含 >"
ALyraCharacter -- ULyraInventoryManagerComponent : "包含 >"

@enduml

image ULyraEquipmentManagerComponent负责管理角色的装备,包括装备的定义(ULyraEquipmentDefinition)和实例(ULyraEquipmentInstance)。类似地,ULyraInventoryManagerComponent负责管理角色的物品库存,包括物品的定义(ULyraInventoryItemDefinition)和实例(ULyraInventoryItemInstance)。

这两个系统都与ALyraCharacter紧密相关,ALyraCharacter通过包含这些组件来获得管理装备和物品的能力。这样的设计允许角色能够灵活地装备不同的物品和装备,同时也方便了物品和装备管理的扩展和自定义。

交互系统

@startuml Lyra_InteractionSystem

!define RECTANGLE class

package "交互系统" {
    RECTANGLE ULyraGameplayAbility_Interact
    RECTANGLE UAbilityTask_WaitForInteractableTargets
    RECTANGLE UInteractableTargetInterface
    RECTANGLE UInteractionOption

    ULyraGameplayAbility_Interact -- UAbilityTask_WaitForInteractableTargets : "使用 >"
    UAbilityTask_WaitForInteractableTargets .. UInteractableTargetInterface : "交互目标 <<interface>>"
    UAbilityTask_WaitForInteractableTargets -- UInteractionOption : "提供 >"
}

package "角色" {
    RECTANGLE ALyraCharacter
}

ALyraCharacter -- ULyraGameplayAbility_Interact : "拥有 >"

@enduml

image

ULyraGameplayAbility_Interact代表了角色进行交互的能力,比如与NPC对话或与物品互动。这个能力通过UAbilityTask_WaitForInteractableTargets任务来等待和识别交互目标。UInteractableTargetInterface是一个接口,定义了可以交互的目标需要实现的方法。UInteractionOption提供了与特定目标交互时可用的不同选项。

角色(ALyraCharacter)通过拥有ULyraGameplayAbility_Interact能力,可以与实现了UInteractableTargetInterface接口的对象进行交互。这个系统为在游戏中创建复杂的交互逻辑提供了基础。

UI组件

@startuml Lyra_UIComponents

!define RECTANGLE class

package "UI组件" {
    RECTANGLE ULyraHUD
    RECTANGLE ULyraUIMenu
    RECTANGLE ULyraGameplayWidget
    RECTANGLE ULyraAbilityWidget

    ULyraHUD -- ULyraGameplayWidget : "展示 >"
    ULyraHUD -- ULyraUIMenu : "包含 >"
    ULyraGameplayWidget <|-- ULyraAbilityWidget : "特化 >"
}

package "角色" {
    RECTANGLE ALyraCharacter
}

ALyraCharacter -- ULyraHUD : "拥有 >"

@enduml

image ULyraHUD是游戏HUD的核心,负责展示游戏信息和状态。ULyraUIMenu代表游戏中的菜单系统,可能包括主菜单、设置菜单等。ULyraGameplayWidget是游戏中所有游戏玩法相关UI组件的基类,而ULyraAbilityWidget是专门用于展示能力相关信息的UI组件,它是ULyraGameplayWidget的一个特化形式。

角色(ALyraCharacter)通常会与HUD直接关联,HUD会根据角色的状态和环境来更新显示的信息。

消息系统

@startuml Lyra_MessageSystem

!define RECTANGLE class

package "消息系统" {
    RECTANGLE UGameplayMessageProcessor
    RECTANGLE UGameplayMessageListenerInterface
    RECTANGLE ULyraGameplayMessage

    UGameplayMessageProcessor .. UGameplayMessageListenerInterface : "通知 <<interface>>"
    UGameplayMessageProcessor -- ULyraGameplayMessage : "处理 >"
}

@enduml

image UGameplayMessageProcessor是处理和分发游戏内消息的核心组件。UGameplayMessageListenerInterface是一个接口,所有希望接收游戏消息的类都需要实现这个接口。ULyraGameplayMessage代表了一个具体的游戏消息,它可以包含各种数据,用于不同的游戏逻辑和交互。

设置系统

@startuml Lyra_SettingsSystem

!define RECTANGLE class

package "设置系统" {
    RECTANGLE UGameSettingRegistry
    RECTANGLE UGameSetting
    RECTANGLE UGameSettingValue
    RECTANGLE ULyraSettingScreen

    UGameSettingRegistry -- UGameSetting : "注册 >"
    UGameSetting -- UGameSettingValue : "包含 >"
    ULyraSettingScreen -- UGameSettingRegistry : "使用 >"
}

@enduml

image

在设置系统的代码中,UGameSettingRegistry负责注册和管理所有游戏设置。UGameSetting代表一个具体的设置项,而UGameSettingValue代表设置项的可能值。ULyraSettingScreen是设置界面的UI组件,它利用UGameSettingRegistry来展示和修改游戏设置。

游戏阶段管理

@startuml Lyra_GamePhaseManagement

!define RECTANGLE class

package "游戏阶段管理" {
    RECTANGLE ALyraGameState
    RECTANGLE ULyraGamePhaseSubsystem
    RECTANGLE ULyraGamePhaseAbility

    ALyraGameState -- ULyraGamePhaseSubsystem : "包含 >"
    ULyraGamePhaseSubsystem -- ULyraGamePhaseAbility : "使用 >"
}

@enduml

image ALyraGameState用于表示游戏的当前状态,它包含了ULyraGamePhaseSubsystem,后者负责管理游戏不同阶段的逻辑,如游戏开始、游戏进行中和游戏结束等。ULyraGamePhaseAbility是特定游戏阶段中角色可能拥有的能力,由ULyraGamePhaseSubsystem管理。

性能统计系统

@startuml Lyra_PerformanceStats

!define RECTANGLE class

package "性能统计系统" {
    RECTANGLE ULyraPerformanceStatSubsystem
    RECTANGLE ULyraPerformanceStatComponent
    RECTANGLE ULyraPerformanceData

    ULyraPerformanceStatSubsystem -- ULyraPerformanceStatComponent : "包含 >"
    ULyraPerformanceStatComponent -- ULyraPerformanceData : "收集 >"
}

@enduml

image 在性能统计系统的代码中,ULyraPerformanceStatSubsystem是性能统计的核心,负责管理和协调性能数据的收集。ULyraPerformanceStatComponent是附加在需要收集性能数据的对象上的组件,如玩家角色或其他重要的游戏对象。ULyraPerformanceData代表收集的具体性能数据,如帧率、内存使用情况等。

网络系统

@startuml Lyra_NetworkSystem

!define RECTANGLE class

package "网络系统" {
    RECTANGLE UNetDriver
    RECTANGLE UPlayerController
    RECTANGLE ALyraPlayerState
    RECTANGLE ALyraGameSession

    UNetDriver -- UPlayerController : "连接 >"
    UPlayerController -- ALyraPlayerState : "拥有 >"
    ALyraGameSession -- ALyraPlayerState : "注册 >"
}

@enduml

image UNetDriver是Unreal Engine网络层的核心,负责管理客户端和服务器之间的连接。UPlayerController代表了一个连接到服务器的玩家,并与ALyraPlayerState相关联,后者存储了玩家的游戏状态和信息。ALyraGameSession管理游戏会话,包括玩家的加入和退出。

重播系统

@startuml Lyra_ReplaySystem

!define RECTANGLE class

package "重播系统" {
    RECTANGLE UDemoNetDriver
    RECTANGLE UReplaySubsystem
    RECTANGLE ALyraReplaySpectator

    UDemoNetDriver -- UReplaySubsystem : "管理 >"
    UReplaySubsystem -- ALyraReplaySpectator : "允许观看 >"
}

@enduml

image 重播系统使玩家能够回放之前的游戏场景。UDemoNetDriver是Unreal Engine用于处理游戏录制和回放的网络驱动。UReplaySubsystem管理重播的创建、保存和加载,而ALyraReplaySpectator是一个为观看重播而设计的特殊玩家控制器。

音频系统

@startuml Lyra_AudioSystem

!define RECTANGLE class

package "音频系统" {
    RECTANGLE UAudioComponent
    RECTANGLE USoundCue
    RECTANGLE ULyraAudioSubsystem
    RECTANGLE ULyraSoundSettings

    UAudioComponent -- USoundCue : "播放 >"
    ULyraAudioSubsystem -- UAudioComponent : "管理 >"
    ULyraAudioSubsystem -- ULyraSoundSettings : "配置 >"
}

@enduml

image UAudioComponent是Unreal Engine中用于播放声音的组件,它与USoundCue相关联,后者定义了如何播放一个特定的声音,包括音量、音调和循环等属性。ULyraAudioSubsystem是一个专门为Lyra设计的系统,负责管理游戏中所有声音的播放和设置,而ULyraSoundSettings则提供了音频相关的配置选项。

特效系统

@startuml Lyra_EffectSystem

!define RECTANGLE class

package "特效系统" {
    RECTANGLE UParticleSystemComponent
    RECTANGLE UNiagaraSystem
    RECTANGLE ULyraEffectManager

    UParticleSystemComponent -- UNiagaraSystem : "使用 >"
    ULyraEffectManager -- UParticleSystemComponent : "管理 >"
}

@enduml

image 特效系统负责游戏中视觉效果的管理,包括粒子效果和Niagara系统效果。UParticleSystemComponent是Unreal Engine用于播放传统粒子系统效果的组件,而UNiagaraSystem则是一个更高级的可编程可视化效果系统。ULyraEffectManager是专门为Lyra项目设计的,用于管理和调度这些视觉效果的播放。

动画系统

@startuml Lyra_AnimationSystem

!define RECTANGLE class

package "动画系统" {
    RECTANGLE USkeletalMeshComponent
    RECTANGLE UAnimBlueprint
    RECTANGLE ULyraAnimInstance
    RECTANGLE ULyraAnimationSubsystem

    USkeletalMeshComponent -- UAnimBlueprint : "使用 >"
    UAnimBlueprint -- ULyraAnimInstance : "实例化 >"
    ULyraAnimationSubsystem -- ULyraAnimInstance : "管理 >"
}

@enduml

image USkeletalMeshComponent用于展示和控制带骨骼的网格,如角色和其他动画实体。UAnimBlueprint是创建复杂动画逻辑的工具,允许开发者通过可视化编程来定义动画状态机和逻辑。ULyraAnimInstance是从UAnimBlueprint实例化的动画实例,用于控制具体的动画播放。ULyraAnimationSubsystem负责管理游戏中所有动画实例的状态和更新。

物理系统

@startuml Lyra_PhysicsSystem

!define RECTANGLE class

package "物理系统" {
    RECTANGLE UPhysicsAsset
    RECTANGLE UPhysicalMaterial
    RECTANGLE ULyraPhysicsSubsystem
    RECTANGLE ULyraCollisionHandler

    UPhysicsAsset -- UPhysicalMaterial : "引用 >"
    ULyraPhysicsSubsystem -- UPhysicsAsset : "使用 >"
    ULyraPhysicsSubsystem -- ULyraCollisionHandler : "处理 >"
}

@enduml

image 物理系统负责游戏中所有物理交互和碰撞检测的管理。UPhysicsAsset包含了一个物体的物理属性,如碰撞形状和刚体约束。UPhysicalMaterial定义了物理交互时的表面属性,比如摩擦力和弹性。ULyraPhysicsSubsystem管理游戏中的物理环境和规则,而ULyraCollisionHandler负责处理物理碰撞和反应。

团队系统

@startuml Lyra_TeamSystem

!define RECTANGLE class

package "团队系统" {
    RECTANGLE ALyraTeamInfo
    RECTANGLE ULyraTeamSubsystem
    RECTANGLE ULyraTeamMemberComponent
    RECTANGLE ULyraTeamAssignmentStrategy

    ALyraTeamInfo -- ULyraTeamMemberComponent : "包含 >"
    ULyraTeamSubsystem -- ALyraTeamInfo : "管理 >"
    ULyraTeamSubsystem -- ULyraTeamAssignmentStrategy : "使用 >"
}

@enduml

image ALyraTeamInfo是一个存储团队信息和状态的类,比如团队成员和团队得分。ULyraTeamSubsystem是负责管理游戏中所有团队的子系统,它使用ULyraTeamAssignmentStrategy来决定如何将玩家分配到不同的团队。ULyraTeamMemberComponent是附加到每个玩家角色上的组件,用于标识玩家所属的团队。

多人游戏支持

@startuml Lyra_MultiplayerSupport

!define RECTANGLE class

package "多人游戏支持" {
    RECTANGLE UMultiplayerSubsystem
    RECTANGLE ALyraPlayerController
    RECTANGLE ALyraPlayerState
    RECTANGLE ALyraGameMode

    UMultiplayerSubsystem -- ALyraPlayerController : "连接 >"
    ALyraPlayerController -- ALyraPlayerState : "同步 >"
    ALyraGameMode -- ALyraPlayerState : "管理 >"
}

@enduml

image UMultiplayerSubsystem是处理多人游戏连接和会话管理的子系统。ALyraPlayerController代表了连接到游戏的玩家控制器,负责处理玩家输入和与玩家相关的游戏逻辑。ALyraPlayerState存储了玩家的游戏状态和信息,如分数和游戏进度,这些信息在多人游戏中需要与其他玩家同步。ALyraGameMode定义了游戏的规则和逻辑,包括如何开始和结束游戏,以及如何处理玩家的胜利和失败。

热更新系统

@startuml Lyra_HotfixSystem

!define RECTANGLE class

package "热更新系统" {
    RECTANGLE UHotfixManager
    RECTANGLE UGameplayDataHotfix
    RECTANGLE ULyraHotfixableComponent

    UHotfixManager -- UGameplayDataHotfix : "应用 >"
    UHotfixManager -- ULyraHotfixableComponent : "更新 >"
}

@enduml

image UHotfixManager是负责管理和应用热更新的核心组件,它可以处理来自开发者的实时更新,无需玩家下载和安装传统的游戏更新包。UGameplayDataHotfix代表了游戏数据的热更新,例如调整游戏平衡或修复错误。ULyraHotfixableComponent是可以接收热更新的游戏组件,确保游戏的关键部分可以实时更新,提高游戏维护的灵活性。

游戏特性管理系统

@startuml Lyra_GameFeatureSystem

!define RECTANGLE class

package "游戏特性管理系统" {
    RECTANGLE UGameFeatureManager
    RECTANGLE UGameFeatureData
    RECTANGLE ULyraGameFeatureComponent

    UGameFeatureManager -- UGameFeatureData : "加载 >"
    UGameFeatureData -- ULyraGameFeatureComponent : "实现 >"
}

@enduml

image UGameFeatureManager负责加载和管理游戏特性,它允许游戏动态地添加新的内容和功能,而无需完全重启游戏。UGameFeatureData定义了一个特定的游戏特性,包括所需的资源和逻辑。ULyraGameFeatureComponent是具体实现游戏特性的组件,它根据UGameFeatureData的定义激活特定的游戏功能。

摄像机系统

@startuml Lyra_CameraSystem

!define RECTANGLE class

package "摄像机系统" {
    RECTANGLE ACameraActor
    RECTANGLE UCameraComponent
    RECTANGLE ULyraCameraManager
    RECTANGLE ULyraCameraMode

    ACameraActor -- UCameraComponent : "包含 >"
    ULyraCameraManager -- UCameraComponent : "控制 >"
    ULyraCameraManager -- ULyraCameraMode : "管理 >"
}

package "角色" {
    RECTANGLE ALyraCharacter
}

ALyraCharacter -- ULyraCameraManager : "使用 >"

@enduml

image ACameraActor是Unreal Engine中的摄像机Actor,用于在游戏世界中放置摄像机。 UCameraComponent是附加到Actor上的组件,提供了摄像机的视角和配置,如视野(FOV)、裁剪平面等。 ULyraCameraManager是Lyra项目特有的系统,负责管理游戏中的摄像机行为和设置。它控制着UCameraComponent的配置,并根据游戏逻辑和玩家输入动态调整摄像机视角。 ULyraCameraMode定义了摄像机的不同模式,如第一人称视角、第三人称视角等。ULyraCameraManager会根据游戏情景或玩家选择切换不同的ULyraCameraMode,以提供最佳的游戏视角。 ALyraCharacter与ULyraCameraManager相连接,表示玩家角色通常会有一个摄像机管理器来控制与角色相关的摄像机设置和行为。这种设计允许摄像机系统灵活地响应游戏中的各种情况,如战斗、探索或特定的游戏事件,从而为玩家提供最佳的视觉体验。

摄像机系统是任何游戏项目中的关键部分,特别是在需要精细控制玩家视角和体验的项目中。通过调整和扩展Lyra项目中的摄像机系统,开发者可以为玩家创造独特且沉浸式的游戏世界。

Cosmetics 装饰系统

@startuml Lyra_CosmeticsSystem

!define RECTANGLE class

package "Cosmetics系统" {
    RECTANGLE FLyraCharacterPart
    RECTANGLE ULyraControllerComponent_CharacterParts
    RECTANGLE ULyraPawnComponent_CharacterParts
    RECTANGLE FLyraAnimLayerSelectionSet
    RECTANGLE ULyraCosmeticCheats
    RECTANGLE ULyraCosmeticDeveloperSettings
    RECTANGLE FLyraAnimBodyStyleSelectionSet

    FLyraCharacterPart -- ULyraControllerComponent_CharacterParts : "请求 >"
    ULyraControllerComponent_CharacterParts -- ULyraPawnComponent_CharacterParts : "应用 >"
    ULyraPawnComponent_CharacterParts -- FLyraAnimLayerSelectionSet : "使用 >"
    ULyraPawnComponent_CharacterParts -- FLyraAnimBodyStyleSelectionSet : "选择 >"
    ULyraControllerComponent_CharacterParts <.. ULyraCosmeticCheats : "作弊 >"
    ULyraControllerComponent_CharacterParts <.. ULyraCosmeticDeveloperSettings : "开发者设置 >"
}

@enduml

image

Lyra项目中的Cosmetics(化妆品)系统涉及角色部件的定制和管理,包括角色外观的动态更改。这个系统支持为角色添加、移除或更改装备的外观部件,如服装或配件,并允许基于游戏内逻辑或玩家选择进行定制。以下是根据这些代码片段的PlantUML表示,展示了Cosmetics系统的主要组件和它们之间的关系:

FLyraCharacterPart 结构定义了一个角色部件的请求,包括部件类别、附着的骨骼插槽名和碰撞模式等信息。 ULyraControllerComponent_CharacterParts 是一个控制器组件,负责管理角色部件的添加和移除请求。它可以通过作弊命令或开发者设置来添加角色部件。 ULyraPawnComponent_CharacterParts 是一个Pawn组件,实际上在角色上应用和管理这些角色部件。它负责根据控制器组件的请求,在角色上创建和移除角色部件。 FLyraAnimLayerSelectionSet 和 FLyraAnimBodyStyleSelectionSet 结构用于基于角色部件的游戏玩法标签选择最适合的动画层或身体风格的网格。 ULyraCosmeticCheats 和 ULyraCosmeticDeveloperSettings 提供了作弊和开发者工具来动态地添加和管理角色部件,以便于测试和开发。

输入系统

@startuml Lyra_InputSystem

!define RECTANGLE class

package "Input系统" {
    RECTANGLE ULyraInputComponent
    RECTANGLE ALyraPlayerController
    RECTANGLE UGameplayAbility
    RECTANGLE InputMapping

    ALyraPlayerController -- ULyraInputComponent : "使用 >"
    ULyraInputComponent -- InputMapping : "定义 >"
    InputMapping .. UGameplayAbility : "触发 >"
}

@enduml

image

ULyraInputComponent 是一个自定义的Input组件,用于处理玩家的输入动作。它可能包含一些特定于Lyra项目的逻辑,以适应游戏的特定需求。

ALyraPlayerController 代表玩家控制器,它使用 ULyraInputComponent 来处理玩家的输入。玩家控制器是玩家与游戏世界交互的中介。

InputMapping 代表输入映射,它将具体的按键或操作(如键盘按键、鼠标点击或游戏手柄按钮)映射到游戏动作上。这些映射通常在项目的配置文件中定义,或者可以通过游戏的设置菜单进行自定义。

UGameplayAbility 是来自游戏玩法能力系统(GAS)的能力,可以通过输入映射的游戏动作被触发。这表明玩家的输入可以直接影响角色的能力执行。

Weapon系统

@startuml Lyra_WeaponSystem

!define RECTANGLE class

package "Weapon系统" {
    RECTANGLE ULyraWeaponInstance
    RECTANGLE ULyraGameplayAbility_RangedWeapon
    RECTANGLE ULyraWeaponStateComponent
    RECTANGLE UInventoryFragment_ReticleConfig
    RECTANGLE ULyraReticleWidgetBase
    RECTANGLE ULyraDamageLogDebuggerComponent
    RECTANGLE ALyraWeaponSpawner

    ULyraWeaponInstance -- ULyraGameplayAbility_RangedWeapon : "赋予能力 >"
    ULyraWeaponInstance -- ULyraWeaponStateComponent : "状态管理 >"
    ULyraWeaponInstance -- UInventoryFragment_ReticleConfig : "配置 >"
    UInventoryFragment_ReticleConfig -- ULyraReticleWidgetBase : "使用 >"
    ULyraWeaponInstance -- ULyraDamageLogDebuggerComponent : "伤害日志 >"
    ALyraWeaponSpawner -- ULyraWeaponInstance : "生成 >"
}

@enduml

image Lyra项目中的Weapon系统涉及多个类和组件,主要包括武器实例、武器能力、武器状态组件以及与武器相关的UI配置

GPT 根据您提供的代码片段,Lyra项目中的Weapon系统涉及多个类和组件,主要包括武器实例、武器能力、武器状态组件以及与武器相关的UI配置。以下是根据这些代码片段的PlantUML表示,展示了Weapon系统的主要组件和它们之间的关系:

Weapon系统的PlantUML表示 plantuml Copy code @startuml Lyra_WeaponSystem

!define RECTANGLE class

package "Weapon系统" { RECTANGLE ULyraWeaponInstance RECTANGLE ULyraGameplayAbility_RangedWeapon RECTANGLE ULyraWeaponStateComponent RECTANGLE UInventoryFragment_ReticleConfig RECTANGLE ULyraReticleWidgetBase RECTANGLE ULyraDamageLogDebuggerComponent RECTANGLE ALyraWeaponSpawner

ULyraWeaponInstance -- ULyraGameplayAbility_RangedWeapon : "赋予能力 >"
ULyraWeaponInstance -- ULyraWeaponStateComponent : "状态管理 >"
ULyraWeaponInstance -- UInventoryFragment_ReticleConfig : "配置 >"
UInventoryFragment_ReticleConfig -- ULyraReticleWidgetBase : "使用 >"
ULyraWeaponInstance -- ULyraDamageLogDebuggerComponent : "伤害日志 >"
ALyraWeaponSpawner -- ULyraWeaponInstance : "生成 >"

}

@enduml 在这个表示中:

ULyraWeaponInstance 表示武器的一个实例,是所有武器类型的基类。 ULyraGameplayAbility_RangedWeapon 表示与远程武器关联的特定游戏能力,例如射击。 ULyraWeaponStateComponent 用于跟踪和管理武器的状态,如最后一次使用时间和屏幕上的伤害标记。 UInventoryFragment_ReticleConfig 用于配置武器的准星UI,可能会根据武器类型或状态改变准星的外观。 ULyraReticleWidgetBase 是准星UI的基础Widget类。 ULyraDamageLogDebuggerComponent 用于记录和调试武器造成的伤害,便于开发和测试。 ALyraWeaponSpawner 代表游戏世界中的一个武器生成器,负责在指定位置生成武器实例供玩家捡起。

游戏标签

@startuml Lyra_GameplayTags

!define TAG class

package "GameplayTags" {
    TAG Ability_ActivateFail_IsDead
    TAG Ability_ActivateFail_Cooldown
    TAG Ability_ActivateFail_Cost
    TAG Ability_ActivateFail_TagsBlocked
    TAG Ability_ActivateFail_TagsMissing
    TAG Ability_ActivateFail_Networking
    TAG Ability_ActivateFail_ActivationGroup
    TAG Ability_Behavior_SurvivesDeath
    TAG InputTag_Move
    TAG InputTag_Look_Mouse
    TAG InputTag_Look_Stick
    TAG InputTag_Crouch
    TAG InputTag_AutoRun
    TAG InitState_Spawned
    TAG InitState_DataAvailable
    TAG InitState_DataInitialized
    TAG InitState_GameplayReady
    TAG GameplayEvent_Death
    TAG GameplayEvent_Reset
    TAG GameplayEvent_RequestReset
    TAG SetByCaller_Damage
    TAG SetByCaller_Heal
    TAG Cheat_GodMode
    TAG Cheat_UnlimitedHealth
    TAG Status_Crouching
    TAG Status_AutoRunning
    TAG Status_Death
    TAG Status_Death_Dying
    TAG Status_Death_Dead
    TAG Movement_Mode_Walking
    TAG Movement_Mode_NavWalking
    TAG Movement_Mode_Falling
    TAG Movement_Mode_Swimming
    TAG Movement_Mode_Flying
    TAG Movement_Mode_Custom
}

' Relationships
Ability_ActivateFail_IsDead .. Ability_ActivateFail : "分类 >"
Ability_ActivateFail_Cooldown .. Ability_ActivateFail : "分类 >"
Ability_ActivateFail_Cost .. Ability_ActivateFail : "分类 >"
Ability_ActivateFail_TagsBlocked .. Ability_ActivateFail : "分类 >"
Ability_ActivateFail_TagsMissing .. Ability_ActivateFail : "分类 >"
Ability_ActivateFail_Networking .. Ability_ActivateFail : "分类 >"
Ability_ActivateFail_ActivationGroup .. Ability_ActivateFail : "分类 >"
Ability_Behavior_SurvivesDeath .. Ability_Behavior : "分类 >"
InputTag_Move .. InputTag : "分类 >"
InputTag_Look_Mouse .. InputTag : "分类 >"
InputTag_Look_Stick .. InputTag : "分类 >"
InputTag_Crouch .. InputTag : "分类 >"
InputTag_AutoRun .. InputTag : "分类 >"
InitState_Spawned .. InitState : "分类 >"
InitState_DataAvailable .. InitState : "分类 >"
InitState_DataInitialized .. InitState : "分类 >"
InitState_GameplayReady .. InitState : "分类 >"
GameplayEvent_Death .. GameplayEvent : "分类 >"
GameplayEvent_Reset .. GameplayEvent : "分类 >"
GameplayEvent_RequestReset .. GameplayEvent : "分类 >"
SetByCaller_Damage .. SetByCaller : "分类 >"
SetByCaller_Heal .. SetByCaller : "分类 >"
Cheat_GodMode .. Cheat : "分类 >"
Cheat_UnlimitedHealth .. Cheat : "分类 >"
Status_Crouching .. Status : "分类 >"
Status_AutoRunning .. Status : "分类 >"
Status_Death .. Status : "分类 >"
Status_Death_Dying .. Status_Death : "分类 >"
Status_Death_Dead .. Status_Death : "分类 >"
Movement_Mode_Walking .. Movement_Mode : "分类 >"
Movement_Mode_NavWalking .. Movement_Mode : "分类 >"
Movement_Mode_Falling .. Movement_Mode : "分类 >"
Movement_Mode_Swimming .. Movement_Mode : "分类 >"
Movement_Mode_Flying .. Movement_Mode : "分类 >"
Movement_Mode_Custom .. Movement_Mode : "分类 >"

@enduml

image image image image image 将各个游戏玩法标签归类为Ability(能力)、InputTag(输入标签)、InitState(初始化状态)、GameplayEvent(游戏事件)、SetByCaller(调用者设置)、Cheat(作弊)、Status(状态)和Movement_Mode(移动模式)等几个主要类别。每个标签都代表了游戏中的一个特定的状态或行为,例如Ability_ActivateFail_IsDead表示一个能力因为角色已死亡而无法激活,而Movement_Mode_Walking则代表角色的行走移动模式。

WangShuXian6 commented 9 months ago

Lyra 插件

UIExtension

Lyra项目的UIExtension插件提供了一套用于UI扩展和定制的系统,允许开发者在游戏的UI中动态地插入和管理自定义内容。这套系统主要基于UUIExtensionSubsystem,它允许注册和管理UI扩展点(FUIExtensionPoint)和UI扩展(FUIExtension)

@startuml Lyra_UIExtensionSystem

!define RECTANGLE class

package "UIExtension系统" {
    RECTANGLE UUIExtensionSubsystem
    RECTANGLE FUIExtensionPoint
    RECTANGLE FUIExtension
    RECTANGLE UUIExtensionPointWidget
    RECTANGLE UUIExtensionHandleFunctions
    RECTANGLE UUIExtensionPointHandleFunctions

    UUIExtensionSubsystem -- FUIExtensionPoint : "管理 >"
    UUIExtensionSubsystem -- FUIExtension : "管理 >"
    FUIExtensionPoint -- FUIExtension : "匹配 >"
    UUIExtensionPointWidget -- UUIExtensionSubsystem : "使用 >"
    UUIExtensionPointWidget -- FUIExtensionPointHandle : "注册 >"
    UUIExtensionHandleFunctions -- UUIExtensionSubsystem : "功能 >"
    UUIExtensionPointHandleFunctions -- UUIExtensionSubsystem : "功能 >"
}

@enduml

image UUIExtensionSubsystem 是这个系统的核心,负责管理所有的UI扩展点和UI扩展。 FUIExtensionPoint 代表一个可以被扩展的UI区域或插槽,例如一个菜单栏或HUD元素。 FUIExtension 代表一个实际的UI扩展,如一个自定义的菜单项或HUD组件。 UUIExtensionPointWidget 是一个动态条目框基类(UDynamicEntryBoxBase)的子类,用于在UI中实现和展示UI扩展点。 UUIExtensionHandleFunctions 和 UUIExtensionPointHandleFunctions 提供了一系列用于在蓝图中管理UI扩展和扩展点的函数。

Pocket Worlds 口袋世界

Lyra项目中的Pocket Worlds插件为游戏提供了一个系统,允许动态地创建、管理和渲染游戏世界中的小型独立区域,这些区域可以称为“口袋世界”。这个系统包括捕捉口袋世界的视觉表示、管理这些口袋世界的实例以及将它们集成到玩家的世界中。

@startuml Lyra_PocketWorldsSystem

!define RECTANGLE class

package "Pocket Worlds系统" {
    RECTANGLE UPocketCapture
    RECTANGLE UPocketCaptureSubsystem
    RECTANGLE UPocketLevel
    RECTANGLE UPocketLevelInstance
    RECTANGLE UPocketLevelSubsystem

    UPocketCapture -- UPocketCaptureSubsystem : "使用 >"
    UPocketLevel -- UPocketLevelInstance : "实例化 >"
    UPocketLevelInstance -- UPocketLevelSubsystem : "管理 >"
    UPocketCaptureSubsystem -- UPocketLevelSubsystem : "交互 >"
}

@enduml

image UPocketCapture 是一个抽象类,用于定义口袋世界的视觉捕捉和渲染逻辑。它可以创建不同类型的渲染目标,如漫反射、阿尔法蒙版和特效。 UPocketCaptureSubsystem 作为世界子系统存在,负责管理UPocketCapture实例,包括创建和销毁渲染器。 UPocketLevel 是一个数据资产,定义了口袋世界的静态属性,如要流式传输的关卡和口袋世界的边界大小。 UPocketLevelInstance 表示口袋世界的一个动态实例,负责流式传输口袋世界的关卡,并处理关卡的加载和显示。 UPocketLevelSubsystem 是另一个世界子系统,用于管理所有的UPocketLevelInstance实例,并提供接口来为玩家创建和获取口袋世界的实例。

Modular Gameplay Actors

@startuml Lyra_ModularGameplayActors

!define RECTANGLE class

package "Modular Gameplay Actors系统" {
    RECTANGLE AModularAIController
    RECTANGLE AModularCharacter
    RECTANGLE AModularGameModeBase
    RECTANGLE AModularGameMode
    RECTANGLE AModularGameStateBase
    RECTANGLE AModularGameState
    RECTANGLE AModularPawn
    RECTANGLE AModularPlayerController

    AModularAIController --|> AAIController : "继承 >"
    AModularCharacter --|> ACharacter : "继承 >"
    AModularGameModeBase --|> AGameModeBase : "继承 >"
    AModularGameMode --|> AGameMode : "继承 >"
    AModularGameStateBase --|> AGameStateBase : "继承 >"
    AModularGameState --|> AGameState : "继承 >"
    AModularPawn --|> APawn : "继承 >"
    AModularPlayerController --|> APlayerController : "继承 >"
}

@enduml

image

Modular Gameplay Actors插件提供了一套模块化游戏对象,包括AI控制器、角色、游戏模式、游戏状态和玩家控制器,这些游戏对象都设计为易于通过游戏功能插件进行扩展。这种模块化设计支持高度的可定制性和可扩展性,允许开发者根据需要为游戏对象添加新的行为和功能。

每个模块化类(如AModularAIController、AModularCharacter等)都继承自Unreal Engine的标准游戏框架类(如AAIController、ACharacter等)。 这种继承关系允许这些模块化类保留基类的核心功能,同时提供接口和框架以便通过游戏功能插件进行扩展和自定义。

LyraExtTool

@startuml LyraExtTool_Plugin

!define RECTANGLE class

package "LyraExtTool 插件" {
    RECTANGLE UBPFunctionLibrary {
        +ChangeMeshMaterials(Mesh: TArray<UStaticMesh*>, Material: UMaterialInterface*): bool {static}
    }

    RECTANGLE FLyraExtToolModule {
        +StartupModule(): void
        +ShutdownModule(): void
    }

    note right of UBPFunctionLibrary : 提供更改静态网格材质的功能
    note right of FLyraExtToolModule : 管理模块的生命周期
}

@enduml

image

该插件包含了一个蓝图函数库UBPFunctionLibrary,其中包含一个静态函数ChangeMeshMaterials,用于更改一组静态网格(UStaticMesh)的材质。这个函数接受一个静态网格数组和一个新的材质(UMaterialInterface),然后遍历每个网格,将其所有材质更改为指定的新材质。

此外,还有一个模块类FLyraExtToolModule,实现了IModuleInterface接口。该类在模块启动时执行自定义初始化代码,在模块关闭时执行清理代码。

UBPFunctionLibrary类提供了一个静态方法ChangeMeshMaterials,用于更改一组静态网格的材质。 FLyraExtToolModule类包含模块的启动和关闭逻辑,控制模块的生命周期。

Lyra Example Content

Game Subtitles

@startuml Game_Subtitles_Plugin

!define RECTANGLE class

package "Game Subtitles 插件" {
    RECTANGLE USubtitleDisplaySubsystem {
        +SetSubtitleDisplayOptions(InOptions: FSubtitleFormat): void
        +GetSubtitleDisplayOptions(): FSubtitleFormat
    }

    RECTANGLE USubtitleDisplayOptions {
        +Font: FSlateFontInfo
        +DisplayTextSizes: int32[]
        +DisplayTextColors: FLinearColor[]
        +DisplayBorderSize: float[]
        +DisplayBackgroundOpacity: float[]
        +BackgroundBrush: FSlateBrush
    }

    RECTANGLE SSubtitleDisplay {
        +SetCurrentSubtitleText(SubtitleText: FText): void
        +HasSubtitles(): bool
    }

    RECTANGLE USubtitleDisplay {
        +Format: FSubtitleFormat
        +Options: USubtitleDisplayOptions
        +WrapTextAt: float
        +HasSubtitles(): bool
    }

    RECTANGLE UMediaSubtitlesPlayer {
        +Play(): void
        +Stop(): void
        +SetSubtitles(Subtitles: UOverlays): void
        +BindToMediaPlayer(InMediaPlayer: UMediaPlayer): void
    }

    note right of USubtitleDisplaySubsystem : 管理字幕显示的全局设置
    note right of USubtitleDisplayOptions : 定义字幕显示的样式选项
    note right of SSubtitleDisplay : Slate UI组件,显示字幕文本
    note right of USubtitleDisplay : UMG组件,显示字幕
    note right of UMediaSubtitlesPlayer : 播放媒体字幕
}

@enduml

image

该插件包括了几个主要的组件来支持游戏中字幕的显示和管理。以下是每个组件的简要说明:

USubtitleDisplaySubsystem:这是一个游戏实例子系统,用于管理字幕显示的全局设置,例如字体大小、颜色、边框和背景透明度。它提供了设置和获取字幕显示选项的方法。

USubtitleDisplayOptions:这是一个数据资产,用于定义字幕显示的各种选项,包括字体、文本大小、文本颜色、边框样式和背景透明度等。这些选项可以通过编辑器进行设置。

SSubtitleDisplay:这是一个Slate UI组件,用于在视口中的某个位置显示字幕文本。它支持文本包裹,并可以根据USubtitleDisplayOptions中定义的样式进行配置。

USubtitleDisplay:这是一个继承自UWidget的UMG(Unreal Motion Graphics)组件,提供在UMG UI中显示字幕的功能。它使用SSubtitleDisplay来实际显示字幕,并提供了一些蓝图可用的方法,如检查当前是否有字幕等。

UMediaSubtitlesPlayer:这是一个用于播放媒体字幕的类,它可以与UMediaPlayer绑定,以同步字幕的播放、停止等操作。它还支持设置字幕源。

这个插件提供了一个全面的字幕显示解决方案,支持UMG UI和Slate UI,以及与媒体播放器的集成。通过这个插件,开发者可以在游戏中轻松地添加和管理字幕,增强游戏的可访问性和玩家的体验。

GameSettings

@startuml

class UGameSetting {
    +DisplayName: FText
    +DescriptionRichText: FText
    +Tags: FGameplayTagContainer
}

class UGameSettingRegistry {
    +RegistrySettings: TArray<UGameSetting>
}

class UGameSettingCollection {
    +Settings: TArray<UGameSetting>
}

class UGameSettingAction {
}

class UGameSettingValueScalar {
    +Value: double
}

class UGameSettingValueDiscrete {
    +Options: TArray<FText>
}

class UGameSettingValueScalarDynamic {
}

class UGameSettingValueDiscreteDynamic {
}

UGameSetting <|-- UGameSettingValueScalar
UGameSetting <|-- UGameSettingValueDiscrete
UGameSetting <|-- UGameSettingAction
UGameSetting <|-- UGameSettingCollection

UGameSettingValueScalar <|-- UGameSettingValueScalarDynamic
UGameSettingValueDiscrete <|-- UGameSettingValueDiscreteDynamic

UGameSettingRegistry "1" -- "*" UGameSetting
UGameSettingCollection "1" -- "*" UGameSetting

@enduml

image

该插件提供了一套用于管理游戏设置的框架。这个框架支持各种类型的设置,包括标量值、离散值、动态值、以及能够触发特定行为的设置。以下是每个组件的简要说明:

UGameSettingValueScalarDynamic: 用于表示可动态变化的标量值的游戏设置,例如音量或亮度。它支持定义值的范围、步长和默认值。

UGameSettingValueScalar: 表示基本的标量值游戏设置的基类,如滑块控制的音量。

UGameSettingValueDiscreteDynamic: 用于动态生成的离散选项的游戏设置,例如下拉菜单中的选项。它允许动态添加或移除选项。

UGameSettingValueDiscrete: 表示有固定选项集的游戏设置的基类,例如图形质量的预设选项。

UGameSettingRegistry: 管理和存储所有游戏设置的中心注册表,提供了用于查找和管理设置的方法。

UGameSetting: 所有游戏设置共有的基类,包含设置的基本信息和状态。

UGameSettingCollection: 用于组织相关设置的容器,允许将设置分组显示。

UGameSettingAction: 代表一个可以触发特定行为的设置项,例如“重置所有设置”按钮。

UGameSettingScreen: 游戏设置界面的根级别组件,用于展示和管理所有设置项。

UGameSettingPanel: 游戏设置面板的容器,负责显示和管理一组相关的设置项。

UGameSettingListView: 显示一系列设置项的UI组件,通常用于设置屏幕中的滚动列表。

UGameSettingListEntryBase: 设置项在列表中的表示,每种类型的设置(如标量、离散、动作)都有不同的派生类。

此框架提供了灵活的编辑条件和数据源接口,允许游戏设置根据游戏状态、平台特征或其他条件动态变化。通过这个插件,开发者可以为玩家提供丰富的游戏设置选项,并轻松地在游戏中管理和应用这些设置。

Gameplay Message Subsystem

@startuml

enum EGameplayMessageMatch {
    ExactMatch
    PartialMatch
}

class FGameplayMessageListenerParams {
    -MatchType : EGameplayMessageMatch
    -OnMessageReceivedCallback : TFunction
}

class FGameplayMessageListenerHandle {
    -Subsystem : UGameplayMessageSubsystem
    -Channel : FGameplayTag
    -ID : int32
}

class FGameplayMessageListenerData {
    -ReceivedCallback : TFunction
    -HandleID : int32
    -MatchType : EGameplayMessageMatch
}

class UGameplayMessageSubsystem {
    -ListenerMap : TMap
}

class UAsyncAction_ListenForGameplayMessage {
    -ReceivedMessagePayloadPtr : const void*
    -ListenerHandle : FGameplayMessageListenerHandle
}

class UK2Node_AsyncAction_ListenForGameplayMessages {
}

FGameplayMessageListenerParams --> "0..1" FGameplayMessageListenerHandle : uses > 
FGameplayMessageListenerHandle --> "0..*" FGameplayMessageListenerData : contains >
FGameplayMessageListenerData --> "1" UGameplayMessageSubsystem : registered in >
UGameplayMessageSubsystem --> "0..*" UAsyncAction_ListenForGameplayMessage : triggers >
UAsyncAction_ListenForGameplayMessage --> "1" UK2Node_AsyncAction_ListenForGameplayMessages : represented by >

@enduml

image

Gameplay Message Subsystem 插件通过消息传递机制,允许游戏内不同组件之间进行解耦通信

EGameplayMessageMatch: 定义了消息监听匹配规则的枚举,决定了监听器如何匹配消息通道。

FGameplayMessageListenerParams: 用于注册游戏消息监听器时指定高级行为的结构体,如匹配类型和接收回调函数。

FGameplayMessageListenerHandle: 表示一个已注册监听器的不透明句柄,可用于稍后移除该监听器。

FGameplayMessageListenerData: 存储单个已注册监听器的详细信息,包括接收回调和匹配类型。

UGameplayMessageSubsystem: 作为游戏实例的子系统,提供了消息传递的中心路由功能,包括消息广播和监听器注册。

UAsyncAction_ListenForGameplayMessage: 提供异步方式监听游戏消息的蓝图节点实现,允许在蓝图中等待特定消息的到来。

UK2Node_AsyncAction_ListenForGameplayMessages: 专门为UAsyncAction_ListenForGameplayMessage设计的蓝图节点,处理异步逻辑。

GameFeatures

TopDownArena

@startuml

interface IModuleInterface

class FTopDownArenaRuntimeModule {
    +StartupModule()
    +ShutdownModule()
}

class ULyraCameraMode

class ULyraCameraMode_TopDownArenaCamera {
    -ArenaWidth : float
    -ArenaHeight : float
    -DefaultPivotRotation : FRotator
    -BoundsSizeToDistance : FRuntimeFloatCurve
    +UpdateView(DeltaTime : float)
}

class ULyraAttributeSet

class UTopDownArenaAttributeSet {
    +BombsRemaining : FGameplayAttributeData
    +BombCapacity : FGameplayAttributeData
    +BombRange : FGameplayAttributeData
    +MovementSpeed : FGameplayAttributeData
}

class ULyraCharacterMovementComponent

class UTopDownArenaMovementComponent {
    +GetMaxSpeed() : float
}

class UGameplayEffectUIData

class UTopDownArenaPickupUIData {
    +Description : FText
    +ShortDescriptionForToast : FText
    +IconTexture : UTexture2D
    +PickupVFX : UNiagaraSystem
    +PickupSFX : USoundBase
}

IModuleInterface <|.. FTopDownArenaRuntimeModule
ULyraCameraMode <|-- ULyraCameraMode_TopDownArenaCamera
ULyraAttributeSet <|-- UTopDownArenaAttributeSet
ULyraCharacterMovementComponent <|-- UTopDownArenaMovementComponent
UGameplayEffectUIData <|-- UTopDownArenaPickupUIData

@enduml

image

用于支持顶视角竞技场类型游戏的组件和设置

FTopDownArenaRuntimeModule: 代表顶视角竞技场游戏模式的运行时模块,负责模块的启动和关闭逻辑。

ULyraCameraMode_TopDownArenaCamera: 一个特定的摄像机模式,用于实现固定于竞技场上方的第三人称视角。

UTopDownArenaAttributeSet: 定义了顶视角竞技场游戏模式特有的属性集,例如玩家剩余炸弹数量、炸弹爆炸范围等。

UTopDownArenaMovementComponent: 定制的角色移动组件,用于处理顶视角竞技场中的角色移动逻辑,可能包括速度调整等。

UTopDownArenaPickupUIData: 用于定义竞技场内拾取物的用户界面数据,例如拾取物的图标、描述、声音和视觉效果。

ShooterCore

@startuml

class UShooterCoreRuntimeSettings {
    +GetAimAssistCollisionChannel(): ECollisionChannel
}

interface IModuleInterface {
    +StartupModule()
    +ShutdownModule()
}

class FShooterCoreRuntimeModule {
    -ShooterCoreSettings: UShooterCoreRuntimeSettings*
}

class AActor
interface IInteractableTarget
interface IPickupable

class ALyraWorldCollectable {
    +GatherInteractionOptions()
    +GetPickupInventory(): FInventoryPickup
}

class FLyraControlPointStatusMessage {
    ControlPoint: AActor*
    OwnerTeamID: int32
}

class UGameplayMessageProcessor

class UAssistProcessor {
    -DamageHistory: TMap<APlayerState*, FPlayerAssistDamageTracking>
}

class UElimChainProcessor {
    -PlayerChainHistory: TMap<APlayerState*, FPlayerElimChainInfo>
}

class UElimStreakProcessor {
    -PlayerStreakHistory: TMap<APlayerState*, int32>
}

class UInputModifier

class UAimAssistInputModifier {
    -TargetCache0: TArray<FLyraAimAssistTarget>
    -TargetCache1: TArray<FLyraAimAssistTarget>
    -OwnerViewData: FAimAssistOwnerViewData
}

class UCapsuleComponent
interface IAimAssistTaget

class UAimAssistTargetComponent {
    +GatherTargetOptions(TargetData: FAimAssistTargetOptions)
}

class UGameStateComponent

class UAimAssistTargetManagerComponent {
    +GetVisibleTargets()
    +GetAimAssistChannel(): ECollisionChannel
}

class ULyraPlayerSpawningManagerComponent

class UTDM_PlayerSpawningManagmentComponent {
    +OnChoosePlayerStart(): AActor*
    +OnFinishRestartPlayer()
}

AGameModeBase <|-- ALyraWorldCollectable : Implements
IInteractableTarget <|.. ALyraWorldCollectable : Implements
IPickupable <|.. ALyraWorldCollectable : Implements
UGameplayMessageProcessor <|-- UAssistProcessor : Extends
UGameplayMessageProcessor <|-- UElimChainProcessor : Extends
UGameplayMessageProcessor <|-- UElimStreakProcessor : Extends
UInputModifier <|-- UAimAssistInputModifier : Extends
UCapsuleComponent <|-- UAimAssistTargetComponent : Extends
IAimAssistTaget <|.. UAimAssistTargetComponent : Implements
UGameStateComponent <|-- UAimAssistTargetManagerComponent : Extends
ULyraPlayerSpawningManagerComponent <|-- UTDM_PlayerSpawningManagmentComponent : Extends

@enduml

image image

GameFeatures 插件的 ShooterCore 部分涉及多个组件,包括运行时设置、模块管理、世界收集品、状态消息、助攻处理、连杀链处理、连杀记录、瞄准辅助和目标组件等

UShooterCoreRuntimeSettings: 定义 ShooterCore 插件的运行时设置,如瞄准辅助的碰撞通道。

FShooterCoreRuntimeModule: 为 ShooterCore 插件提供模块接口的实现,包括启动和关闭逻辑。

ALyraWorldCollectable: 表示游戏世界中可收集的物品,实现交互和可拾取接口。

FLyraControlPointStatusMessage: 用于表示控制点状态变化的消息结构。

UAssistProcessor: 处理玩家助攻,跟踪对其他玩家造成的伤害。

UElimChainProcessor: 跟踪连续击杀,如在一定时间内连续击杀多个玩家。

UElimStreakProcessor: 跟踪连杀记录,如玩家在未被击杀的情况下连续击杀多个玩家。

UAimAssistInputModifier: 提供瞄准辅助,帮助游戏手柄玩家更好地瞄准。

UAimAssistTargetComponent: 可添加到任何Actor上,使其成为瞄准辅助系统的目标。

UAimAssistTargetManagerComponent: 管理瞄准辅助目标,收集玩家视野内的目标。

UTDM_PlayerSpawningManagmentComponent: 提供玩家重生管理逻辑,选择玩家重生点。

ShooterExplorer

ShooterMaps

ShooterTests

@startuml

interface IModuleInterface {
    +StartupModule()
    +ShutdownModule()
}

class FShooterTestsRuntimeModule {
}

class AActor {
}

class AShooterTestsDevicePropertyTester {
    +DeviceProperties: TArray<TSubclassOf<UInputDeviceProperty>>
    +CollisionVolume: UCapsuleComponent*
    +PlatformMesh: UStaticMeshComponent*
    +ApplyDeviceProperties(UserId: FPlatformUserId)
    +RemoveDeviceProperties()
}

IModuleInterface <|.. FShooterTestsRuntimeModule
AActor <|-- AShooterTestsDevicePropertyTester

@enduml

image

包括一个模块和一个用于测试设备属性应用的测试器 FShooterTestsRuntimeModule: ShooterTests 部分的模块,提供模块接口的基本实现,包括启动和关闭模块的方法。

AShooterTestsDevicePropertyTester: 一个用于测试的 Actor,它在玩家控制器与其碰撞体重叠时应用设备属性,并在重叠结束时移除这些属性。这个测试器使用了一个胶囊碰撞体来检测重叠,并有一个静态网格组件作为可视化的平台。

FShooterTestsRuntimeModule 类实现了 IModuleInterface 接口,提供了模块的启动和关闭逻辑。AShooterTestsDevicePropertyTester 类继承自 AActor,实现了设备属性的应用和移除逻辑,用于测试设备属性功能。

CommonUser

@startuml
class CommonUserSubsystem {
    +InitializeForLocalPlay()
    +LoginForOnlinePlay()
    +ListenForLoginKeyInput()
    +TryToInitializeUser()
    +CancelUserInitialization()
    +TryToLogOutUser()
    +ResetUserState()
    +SendSystemMessage()
    +OnUserInitializeComplete
    +OnHandleSystemMessage
    +OnUserPrivilegeChanged
}

class CommonSessionSubsystem {
    +HostSession()
    +QuickPlaySession()
    +JoinSession()
    +FindSessions()
    +CleanUpSessions()
    +OnUserRequestedSessionEvent
    +OnJoinSessionCompleteEvent
    +OnCreateSessionCompleteEvent
    +OnPreClientTravelEvent
}

class UAsyncAction_CommonUserInitialize {
    +InitializeForLocalPlay()
    +LoginForOnlinePlay()
    +OnInitializationComplete
}

CommonUserSubsystem --|> UGameInstanceSubsystem
CommonSessionSubsystem --|> UGameInstanceSubsystem
UAsyncAction_CommonUserInitialize --|> UCancellableAsyncAction

@enduml

image

CommonUser 插件提供了用于管理用户身份、登录状态和在线会话的一系列功能和事件。以下是其主要组件的简要说明:

CommonUserSubsystem 提供对用户身份和登录状态查询和更改的接口,包括初始化本地玩家、登录在线玩家、监听登录按键输入等功能。 支持通过FCommonUserInitializeParams结构自定义初始化过程,允许开发者指定本地玩家索引、输入设备、请求的权限等参数。 包括对系统消息的处理,如错误或警告消息的发送和接收,以及用户权限变更的通知。 CommonSessionSubsystem 管理在线游戏会话的创建、搜索和加入流程,包括快速游玩、托管会话和加入会话等功能。 支持不同类型的在线模式(如离线、LAN、在线),并允许通过UCommonSession_HostSessionRequest和UCommonSession_SearchSessionRequest自定义会话请求参数。 提供了一系列事件,用于在会话创建、搜索、加入等操作完成时通知游戏逻辑。 UAsyncAction_CommonUserInitialize 异步操作,用于处理用户初始化、登录在线玩家等过程,提供了成功或失败的回调事件。 通过InitializeForLocalPlay和LoginForOnlinePlay静态方法启动异步操作,允许自定义初始化参数。 其他类型和枚举 包含了一系列枚举和结构体,用于描述用户的初始化状态、权限、在线模式、会话搜索结果等。 提供了FCommonUserTags结构,用于定义通用用户系统使用的标签,如系统消息类型和平台特性标签。

CommonUserSubsystem和CommonSessionSubsystem都继承自UGameInstanceSubsystem,提供用户和会话管理功能。UAsyncAction_CommonUserInitialize继承自UCancellableAsyncAction,用于处理异步的用户初始化和登录过程。

CommonLoadingScreen

@startuml
class SCommonPreLoadingScreenWidget {
    +Construct(FArguments)
}

class FCommonStartupLoadingScreenModule {
    +StartupModule()
    +ShutdownModule()
    +IsGameModule()
    -OnPreLoadScreenManagerCleanUp()
}

class FCommonPreLoadScreen {
    +Init()
    +GetWidget()
}

SCommonPreLoadingScreenWidget --|> SCompoundWidget
SCommonPreLoadingScreenWidget --|> FGCObject
FCommonStartupLoadingScreenModule --|> IModuleInterface
FCommonPreLoadScreen --|> FPreLoadScreenBase

@enduml

image

CommonLoadingScreen 插件提供了用于在游戏启动和加载期间显示加载屏幕的功能。以下是其主要组件的简要说明:

SCommonPreLoadingScreenWidget 继承自SCompoundWidget,是一个复合小部件,用于构建和显示加载屏幕的UI。 实现了FGCObject接口,以确保在垃圾回收期间正确处理引用的对象。 Construct方法用于初始化小部件并构建其UI布局。 FCommonStartupLoadingScreenModule 实现了IModuleInterface,作为一个插件模块提供了初始化和清理逻辑。 StartupModule方法中,插件将创建和注册一个FCommonPreLoadScreen实例,用于显示加载屏幕。 OnPreLoadScreenManagerCleanUp方法在预加载屏幕管理器清理时被调用,用于释放加载屏幕相关的资源。 FCommonPreLoadScreen 继承自FPreLoadScreenBase,提供了加载屏幕的基本逻辑和行为。 Init方法用于初始化加载屏幕,包括设置其UI组件。 GetWidget方法返回加载屏幕的主要UI小部件,以便显示在屏幕上。 使用方法 当游戏或应用启动并进入加载阶段时,FCommonStartupLoadingScreenModule将初始化并显示FCommonPreLoadScreen,玩家将看到配置的加载界面。 在加载过程完成或需要转换到游戏主界面时,加载屏幕将被清理和隐藏。

SCommonPreLoadingScreenWidget继承自SCompoundWidget和FGCObject,用于构建加载屏幕的UI。FCommonStartupLoadingScreenModule实现了IModuleInterface,负责插件的生命周期管理。FCommonPreLoadScreen继承自FPreLoadScreenBase,提供加载屏幕的逻辑和行为。

CommonGame

@startuml CommonGamePlugin

class UPrimaryGameLayout {
    -bIsDormant: bool
    +GetPrimaryGameLayoutForPlayer(): UPrimaryGameLayout
    +SetIsDormant(dormant: bool): void
    +PushWidgetToLayerStackAsync(): TSharedPtr<FStreamableHandle>
}

class UGameUIPolicy {
    -LocalMultiplayerInteractionMode: ELocalMultiplayerInteractionMode
    +GetGameUIPolicy(): UGameUIPolicy
    +AddLayoutToViewport(): void
    +RemoveLayoutFromViewport(): void
}

class UCommonUIExtensions {
    +GetOwningPlayerInputType(): ECommonInputType
    +PushContentToLayer_ForPlayer(): UCommonActivatableWidget
}

class UCommonPlayerInputKey {
    -bIsHoldKeybind: bool
    +UpdateKeybindWidget(): void
    +SetBoundKey(): void
    +SetForcedHoldKeybindStatus(): void
}

class ACommonPlayerController {
}

class UCommonLocalPlayer {
    -bIsPlayerViewEnabled: bool
    +GetRootUILayout(): UPrimaryGameLayout
    +SetIsPlayerViewEnabled(): void
}

class UCommonGameInstance {
    -RequestedSession: UCommonSession_SearchResult
    +HandleSystemMessage(): void
    +ResetUserAndSessionState(): void
    +SetRequestedSession(): void
}

class UCommonMessagingSubsystem {
    +ShowConfirmation(): void
    +ShowError(): void
}

class UCommonGameDialog {
    +SetupDialog(): void
    +KillDialog(): void
}

UPrimaryGameLayout --|> UCommonUserWidget : extends
UGameUIPolicy --|> UObject : extends
UCommonUIExtensions --|> UBlueprintFunctionLibrary : extends
UCommonPlayerInputKey --|> UCommonUserWidget : extends
ACommonPlayerController --|> AModularPlayerController : extends
UCommonLocalPlayer --|> ULocalPlayer : extends
UCommonGameInstance --|> UGameInstance : extends
UCommonMessagingSubsystem --|> ULocalPlayerSubsystem : extends
UCommonGameDialog --|> UCommonActivatableWidget : extends

@enduml

image

CommonGame 插件是一个用于 Unreal Engine 的高级 UI 系统,旨在为游戏开发者提供丰富的 UI 构建块和管理工具。以下是其关键组件的概述:

UPrimaryGameLayout 代表游戏中单个玩家的主 UI 布局。它定义了如何布局、推送和显示 UI 的各个层级,支持异步加载和管理 UI 元素。

UGameUIPolicy 定义了游戏 UI 的策略和行为,如多玩家交互模式(如分屏)和 UI 布局管理。它与 UGameUIManagerSubsystem 配合使用,后者作为游戏实例的子系统,负责管理当前的 UI 策略和玩家 UI 交互。

UCommonUIExtensions 提供一组静态函数,用于在游戏中扩展和操作 UI。例如,它可以用于根据玩家控制器推送内容到 UI 层,或者管理玩家输入的暂停和恢复。

UCommonPlayerInputKey 一个 UI 组件,用于显示和管理玩家输入绑定的可视化表示。支持显示按键绑定、处理长按动作等功能。

ACommonPlayerController 一个玩家控制器的扩展,提供了模块化的扩展点和游戏 UI 交互的集成。

UCommonLocalPlayer 一个本地玩家对象的扩展,增加了对玩家视图和 UI 布局管理的额外控制。

UCommonGameInstance 游戏实例的扩展,提供了对玩家会话、错误处理和 UI 对话框的高级管理。

UCommonMessagingSubsystem 作为本地玩家子系统,提供了一种机制来显示和管理游戏内消息和对话框,如确认对话框或错误消息。

UCommonGameDialog 和 UCommonGameDialogDescriptor 一组类,用于定义和显示游戏内对话框。支持自定义对话框标题、内容和按钮,以及处理用户响应。

异步操作 提供了一系列异步操作(如 UAsyncAction_ShowConfirmation、UAsyncAction_PushContentToLayerForPlayer、UAsyncAction_CreateWidgetAsync),使得在游戏逻辑中处理 UI 更新和玩家交互更加灵活和响应式。

这些组件共同构成了一个强大的 UI 管理框架,使得开发复杂且交互密集的游戏 UI 成为可能。

AsyncMixin

@startuml AsyncMixinPlugin

class FAsyncMixin {
    -OnStartedLoading(): void
    -OnFinishedLoading(): void
    +AsyncLoad(SoftClass: TSoftClassPtr, Callback: TFunction): void
    +AsyncLoad(SoftObject: TSoftObjectPtr, Callback: TFunction): void
    +AsyncPreloadPrimaryAssetsAndBundles(Assets: TArray, LoadBundles: TArray, Callback: FSimpleDelegate): void
    +AsyncCondition(Condition: TSharedRef<FAsyncCondition>, Callback: FSimpleDelegate): void
    +AsyncEvent(Callback: TFunction): void
    +StartAsyncLoading(): void
    +CancelAsyncLoading(): void
    +IsAsyncLoadingInProgress(): bool
}

class FAsyncScope {
    +AsyncLoad(SoftClass: TSoftClassPtr, Callback: TFunction): void
    +AsyncPreloadPrimaryAssetsAndBundles(Assets: TArray, LoadBundles: TArray, Callback: FSimpleDelegate): void
    +AsyncCondition(Condition: TSharedRef<FAsyncCondition>, Callback: FSimpleDelegate): void
    +AsyncEvent(Callback: TFunction): void
    +StartAsyncLoading(): void
    +CancelAsyncLoading(): void
    +IsAsyncLoadingInProgress(): bool
}

class FAsyncCondition {
    +FAsyncCondition(Condition: FAsyncConditionDelegate): void
    +FAsyncCondition(Condition: TFunction<EAsyncConditionResult()>): void
}

FAsyncMixin "1" -right- "0..*" FAsyncCondition : checks >
FAsyncScope "1" -right- "0..*" FAsyncCondition : checks >

@enduml

image

主要包括 FAsyncMixin, FAsyncScope, 和 FAsyncCondition 类。FAsyncMixin 和 FAsyncScope 类用于管理异步加载请求,并确保请求按顺序处理。FAsyncCondition 类允许定义自定义条件,这些条件必须满足才能继续异步加载过程。这个图表仅展示了类的核心方法和它们之间的关系

@startuml AsyncMixinModule

class IModuleInterface {
    {abstract} +StartupModule(): void
    {abstract} +ShutdownModule(): void
}

class FAsyncMixinModule {
    +StartupModule(): void
    +ShutdownModule(): void
}

IModuleInterface <|-- FAsyncMixinModule

@enduml

image

这个 UML 图表表示 FAsyncMixinModule 类实现了 IModuleInterface 接口,提供了 StartupModule() 和 ShutdownModule() 方法的具体实现。这表明 FAsyncMixinModule 是一个模块,它在模块加载到内存后执行初始化代码,并且在模块卸载或重新加载前执行清理代码。