Initialize PHY Codex workflow

This commit is contained in:
2026-04-25 23:43:40 +08:00
commit 5aacc79f03
38 changed files with 2804 additions and 0 deletions

20
.gitattributes vendored Normal file
View File

@@ -0,0 +1,20 @@
# Unreal binary assets
*.uasset filter=lfs diff=lfs merge=lfs -text
*.umap filter=lfs diff=lfs merge=lfs -text
*.ubulk filter=lfs diff=lfs merge=lfs -text
*.uexp filter=lfs diff=lfs merge=lfs -text
*.uptnl filter=lfs diff=lfs merge=lfs -text
# Common large source assets
*.fbx filter=lfs diff=lfs merge=lfs -text
*.obj filter=lfs diff=lfs merge=lfs -text
*.blend filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.ogg filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
*.mov filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text

35
.gitignore vendored Normal file
View File

@@ -0,0 +1,35 @@
# Unreal build output
Binaries/
DerivedDataCache/
Intermediate/
Saved/
# Project content policy: only track Content/AGame and its children.
Content/*
!Content/AGame/
!Content/AGame/**
# Visual Studio and Rider
.vs/
.idea/
*.sln.DotSettings.user
*.VC.db
*.VC.opendb
*.opensdf
*.sdf
*.suo
*.user
*.userosscache
*.rsuser
# Unreal local files
*.tmp
*.log
*.pid
*.sublime-workspace
*.code-workspace
# OS files
Thumbs.db
Desktop.ini
.DS_Store

19
.vsconfig Normal file
View File

@@ -0,0 +1,19 @@
{
"version": "1.0",
"components": [
"Component.Unreal.Debugger",
"Component.Unreal.Ide",
"Microsoft.Net.Component.4.6.2.TargetingPack",
"Microsoft.VisualStudio.Component.VC.14.38.17.8.ATL",
"Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.44.17.14.ATL",
"Microsoft.VisualStudio.Component.VC.14.44.17.14.x86.x64",
"Microsoft.VisualStudio.Component.VC.Llvm.Clang",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.Windows11SDK.22621",
"Microsoft.VisualStudio.Workload.CoreEditor",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Workload.NativeGame"
]
}

72
AGENTS.md Normal file
View File

@@ -0,0 +1,72 @@
# PHY Codex 工作协议
## 项目原则
- 项目以 C++ 和配置文件为主要实现手段,优先级固定为:`C++` > `项目配置文件` > `DataAsset` > `蓝图/编辑器装配`
- 只有插件强制要求、动画/UI 资产装配、或无法用 C++/配置表达时,才允许使用蓝图或 DataAsset使用时必须在交付说明里写明原因。
- 项目按多人优先设计:战斗、交互、背包、效果触发默认考虑 Server authority、复制、预测或回滚风险。
- 首期平台目标为 Win64 / UE 5.7。`AuroraDevs_UGC` 当前只声明 Win64因此不要承诺其他平台可用。
- Marketplace 插件源码只允许读取和适配,不直接修改 Engine 下的插件文件。
- Git 远程仓库固定为 `https://git.codable.cn/cit110/PHY.git`
- `Content` 目录只管理 `Content/AGame` 及其子文件;`Content/Collections``Content/Developers` 等其他目录默认不纳入版本控制。
- 每次完成修改并通过对应验证后,必须提交并推送到 `origin`;如果远程认证或冲突阻塞推送,必须在最终汇报中说明。
## 插件源码位置
- Generic Combat System`D:\ue\UE_5.7\Engine\Plugins\Marketplace\GenericCd51b9e2c8181V4`
- Runtime 模块:`GenericInputSystem``GenericGameplayAbilities``GenericGameplayAttributes``GenericCombatSystem`
- Generic Game System`D:\ue\UE_5.7\Engine\Plugins\Marketplace\GenericG08270e38e585V5`
- Runtime 模块:`GenericEffectsSystem``GenericCameraSystem``GenericUISystem``GenericGameSystem`
- Generic Inventory System`D:\ue\UE_5.7\Engine\Plugins\Marketplace\GenericI359982083d7bV3`
- Runtime 模块:`GenericInventorySystem`
- Smooth Locomotion System`D:\ue\UE_5.7\Engine\Plugins\Marketplace\SmoothLo6fa0c61bf7bdV5`
- Runtime 模块:`SLSCore``SmoothLocomotionSystem``TraversalSystem``FootStepSystem``SLSIntegration``SLSCameraModeSystem`
- Ultimate Gameplay Camera`D:\ue\UE_5.7\Engine\Plugins\Marketplace\Ultimate683e2e68927aV34`
- Runtime 模块:`AuroraDevs_UGC`
## Agent 职责和汇报链
- 总架构/协调 Agent 是唯一总负责人,直接向用户汇报;所有专家向它汇报。它负责接口边界、任务拆分、跨系统决策、合并顺序、是否允许使用蓝图/DataAsset。
- 相机专家向总架构汇报。主责 `AuroraDevs_UGC`、战斗锁定/瞄准/移动相机状态;不得主动引入 `GenericCameraSystem``SLSCameraModeSystem` 作为玩法层依赖。
- 战斗/GAS 专家向总架构汇报。主责 ASC、Ability、Attribute、GameplayTag、GameplayCue、伤害、复制、预测。
- 输入专家向总架构汇报。主责 `GenericInputSystem``EnhancedInput`、输入到 GAS/UGC/运动/UI 的路由。
- 运动专家向总架构汇报。主责 `SmoothLocomotionSystem``SLSCore``TraversalSystem``SLSIntegration``FootStepSystem`;运动状态只通过项目接口通知相机。
- UI 专家向总架构汇报。主责 `GenericUISystem``CommonUI`、UMG、HUD、输入模式切换。
- 背包专家向总架构汇报。主责 `GenericInventorySystem`、物品、装备、拾取、战斗/UI 联动。
- 交互/效果专家向总架构汇报。主责 `GenericGameSystem``GenericEffectsSystem``SmartObjects``TargetingSystem`、Niagara。
- 验证 Agent 向总架构汇报,但拥有阻断权;构建、测试、多人验证失败时不得合并。
- Git/仓库 Agent 向总架构汇报只在验证通过后处理提交、分支、LFS、忽略规则。
## 工作流
- 用户需求先交给总架构 Agent总架构拆成单系统任务或跨系统任务并指定唯一 owner。
- 专家进入实现前先读项目源码、配置和对应插件源码;不得直接修改 Engine Marketplace 插件源码。
- 专家方案必须说明 C++ 接口、配置文件、是否需要蓝图/DataAsset、多人影响、依赖模块。
- 单系统任务由 owner 完成;跨系统任务由总架构先定接口,再分派给对应专家,避免互相改同一批文件。
- 专家交付必须包含:`改动范围``新增/修改接口``配置文件``蓝图/DataAsset 使用原因``验证结果``遗留风险`
- 验证 Agent 通过构建和必要测试后Git/仓库 Agent 才能提交;总架构最终向用户汇报结果。
- Git/仓库 Agent 初始化仓库时必须设置 `origin=https://git.codable.cn/cit110/PHY.git`,启用 Git LFS并确认 `Content` 跟踪范围仅限 `Content/AGame/**`
- Git/仓库 Agent 在每次修改完成后负责提交并推送当前改动,不保留已完成但未提交的工作树。
- 相机/输入/运动/战斗之间的接口冲突、是否使用蓝图/DataAsset、是否引入插件模块依赖统一由总架构裁决。
## 相机规则
- 项目相机主入口统一使用 Ultimate Gameplay Camera`AuroraDevs_UGC`
- `GenericCameraSystem``SLSCameraModeSystem` 只允许作为插件内部依赖、示例资产参考或薄适配层依赖;项目玩法层尽可能不用。
- 相机状态由项目级接口接收输入、运动和战斗状态,不允许业务代码到处直接耦合多个相机系统。
## C++ 和配置规则
- 配置按功能拆分,不把项目自定义设置堆进一个 ini。
- 项目自有设置使用 `UCLASS(Config=PHYCombat, DefaultConfig)` 这类配置类,对应 `Config/DefaultPHYCombat.ini`
- UE 引擎强制读取的内容仍放在标准文件中,例如 `DefaultEngine.ini``DefaultInput.ini``DefaultGame.ini`;项目玩法参数尽量迁移到功能专属配置类。
- 建议功能配置文件:`DefaultPHYCore.ini``DefaultPHYInput.ini``DefaultPHYCombat.ini``DefaultPHYCamera.ini``DefaultPHYLocomotion.ini``DefaultPHYUI.ini``DefaultPHYInventory.ini``DefaultPHYInteraction.ini``DefaultPHYEffects.ini`
- `.h` 文件注释使用符合 Doxygen 风格的中文注释:公开类、结构体、枚举、函数、属性使用 `/** ... */`,需要时使用 `@brief``@param``@return`
- `.cpp` 文件也使用中文注释,但不用 Doxygen 风格;避免在实现文件里写 `/** ... */` 形式的 API 文档。
- 包含 `*.generated.h` 的头文件,其对应 `.cpp` 必须在包含自身头文件后使用 `#include UE_INLINE_GENERATED_CPP_BY_NAME(文件基名)`
- 反射声明禁止 `ClassGroup`,也禁止在 `meta=(...)` 中写 class 分组。
- Gameplay Tags 全部使用 Native Gameplay Tags 宏,按功能域拆分到 `Source/PHY/Public/GameplayTags``Source/PHY/Private/GameplayTags``PHYGameplayTags.h` 只作为聚合入口,不直接堆放声明。
- 新增 Gameplay Tag 时按职责放入对应领域文件,例如输入、状态、能力、事件、效果;如果领域不匹配,先新增清晰命名的领域文件,不把所有 Tag 写在一个文件里。
- 核心 Tag 禁止只写在 ini、蓝图字符串或裸字符串里。
## 验证命令
- 基线构建:
`D:\ue\UE_5.7\Engine\Build\BatchFiles\Build.bat PHYEditor Win64 Development -Project="D:\ue\Projects\PHY\PHY.uproject" -WaitMutex -NoHotReloadFromIDE`
- Git 验证:`git status --short --branch` 不应显示 `Binaries``Intermediate``Saved``DerivedDataCache`
- 代码审查检查中文注释、Doxygen 规则、`UE_INLINE_GENERATED_CPP_BY_NAME`、反射 metadata、Native GameplayTags。
- 相机验证UGC 能响应移动、战斗锁定、瞄准、UI 输入模式;业务层不得新增 `GenericCameraSystem` / `SLSCameraModeSystem` 直接依赖。
- 多人验证:战斗、输入、交互、背包、效果改动至少做双客户端 PIE 或 dedicated server smoke test。

0
Config/DefaultEditor.ini Normal file
View File

161
Config/DefaultEngine.ini Normal file
View File

@@ -0,0 +1,161 @@
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Game/AGame/Map/Map_Test.Map_Test
EditorStartupMap=/Game/AGame/Map/Map_Test.Map_Test
[/Script/Engine.RendererSettings]
r.AllowStaticLighting=False
r.GenerateMeshDistanceFields=True
r.DynamicGlobalIlluminationMethod=1
r.ReflectionMethod=1
r.SkinCache.CompileShaders=True
r.RayTracing=True
r.RayTracing.RayTracingProxies.ProjectEnabled=True
r.Substrate=True
r.Substrate.ProjectGBufferFormat=0
r.Shadow.Virtual.Enable=1
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True
r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8
r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
-D3D12TargetedShaderFormats=PCD3D_SM5
+D3D12TargetedShaderFormats=PCD3D_SM6
-D3D11TargetedShaderFormats=PCD3D_SM5
+D3D11TargetedShaderFormats=PCD3D_SM5
Compiler=Default
AudioSampleRate=48000
AudioCallbackBufferFrameSize=1024
AudioNumBuffersToEnqueue=1
AudioMaxChannels=0
AudioNumSourceWorkers=4
SpatializationPlugin=
SourceDataOverridePlugin=
ReverbPlugin=
OcclusionPlugin=
CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
CacheSizeKB=65536
MaxChunkSizeOverrideKB=0
bResampleForDevice=False
MaxSampleRate=48000.000000
HighSampleRate=32000.000000
MedSampleRate=24000.000000
LowSampleRate=12000.000000
MinSampleRate=8000.000000
CompressionQualityModifier=1.000000
AutoStreamingThreshold=0.000000
SoundCueCookQualityIndex=-1
[/Script/LinuxTargetPlatform.LinuxTargetSettings]
-TargetedRHIs=SF_VULKAN_SM5
+TargetedRHIs=SF_VULKAN_SM6
[/Script/MacTargetPlatform.MacTargetSettings]
-TargetedRHIs=SF_METAL_SM5
+TargetedRHIs=SF_METAL_SM6
[/Script/HardwareTargeting.HardwareTargetingSettings]
TargetedHardwareClass=Desktop
AppliedTargetedHardwareClass=Desktop
DefaultGraphicsPerformance=Maximum
AppliedDefaultGraphicsPerformance=Maximum
[/Script/WorldPartitionEditor.WorldPartitionEditorSettings]
CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'
[/Script/Engine.UserInterfaceSettings]
bAuthorizeAutomaticWidgetVariableCreation=False
FontDPIPreset=Standard
FontDPI=72
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/PHY")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/PHY")
[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
bEnablePlugin=True
bAllowNetworkConnection=True
SecurityToken=29325E42430BEA3414A72C80FBF480D7
bIncludeInShipping=False
bAllowExternalStartInShipping=False
bCompileAFSProject=False
bUseCompression=False
bLogFiles=False
bReportStats=False
ConnectionType=USBOnly
bUseManualIPAddress=False
ManualIPAddress=
[/Script/Engine.CollisionProfile]
-Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False)
-Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ",bCanModify=False)
-Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ",bCanModify=False)
-Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic",Response=ECR_Block),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.",bCanModify=False)
-Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors",bCanModify=False)
-Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors",bCanModify=False)
-Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.",bCanModify=False)
-Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.",bCanModify=False)
-Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Block),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
+Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision")
+Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.")
+Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ")
+Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ")
+Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic"),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.")
+Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.")
+Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors")
+Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors")
+Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.")
+Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.")
+Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.")
+Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.")
+Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.")
+Profiles=(Name="UI",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility"),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ")
+Profiles=(Name="TraversalMantleCollision",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="Default TraversalMantleCollision Profile (Created by Smooth Locomotion System -> TraversalSystem Plugin)")
+Profiles=(Name="WaterBodyCollision",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="",CustomResponses=((Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="Default Water Collision Profile (Created by Water Plugin)")
-ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
-ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn")
-ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic")
-ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor")
-ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic")
+ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
+ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn")
+ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic")
+ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor")
+ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic")
-CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic")
-CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic")
-CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
-CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")
+CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic")
+CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic")
+CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
+CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")

8
Config/DefaultGame.ini Normal file
View File

@@ -0,0 +1,8 @@
[/Script/CommonUI.CommonUISettings]
CommonButtonAcceptKeyHandling=TriggerClick
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=E7C26E1F4D195F0DBE49C2A3E5017988
CopyrightNotice=

84
Config/DefaultInput.ini Normal file
View File

@@ -0,0 +1,84 @@
[/Script/Engine.InputSettings]
-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
+AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
bAltEnterTogglesFullscreen=True
bF11TogglesFullscreen=True
bUseMouseForTouch=False
bEnableMouseSmoothing=True
bEnableFOVScaling=True
bCaptureMouseOnLaunch=True
bEnableLegacyInputScales=True
bEnableMotionControls=True
bFilterInputByPlatformUser=False
bShouldFlushPressedKeysOnViewportFocusLost=True
bAlwaysShowTouchInterface=False
bShowConsoleOnFourFingerTap=True
bEnableGestureRecognizer=False
bUseAutocorrect=False
DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
DefaultViewportMouseLockMode=LockOnCapture
FOVScale=0.011110
DoubleClickTime=0.200000
DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput
DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent
DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
-ConsoleKeys=Tilde
+ConsoleKeys=Tilde

View File

@@ -0,0 +1,5 @@
[/Script/PHY.PHYCameraSettings]
bUseUltimateGameplayCamera=True
bAllowGenericCameraFallback=False
bAllowSLSCameraFallback=False
LockOnBlendTime=0.250000

View File

@@ -0,0 +1,4 @@
[/Script/PHY.PHYCombatSettings]
bRequireServerAuthority=True
bEnableClientPrediction=True
DefaultHitConfirmWindow=0.200000

View File

@@ -0,0 +1,5 @@
[/Script/PHY.PHYCoreSettings]
ConfigVersion=1
bMultiplayerFirst=True
bPreferCodeAndConfig=True
TargetPlatformName=Win64

View File

@@ -0,0 +1,4 @@
[/Script/PHY.PHYEffectsSettings]
bUseGenericEffectsSystem=True
bReplicateGameplayCues=True
EffectCullDistance=5000.000000

View File

@@ -0,0 +1,4 @@
[/Script/PHY.PHYInputSettings]
DefaultMappingPriority=0
bRouteInputThroughGenericInputSystem=True
bBlockGameplayInputWhenUIFocused=True

View File

@@ -0,0 +1,4 @@
[/Script/PHY.PHYInteractionSettings]
bRequireServerConfirmedInteraction=True
InteractionTraceDistance=350.000000
bUseSmartObjects=True

View File

@@ -0,0 +1,4 @@
[/Script/PHY.PHYInventorySettings]
bReplicateInventory=True
MaxQuickSlots=8
bAllowEquipmentGameplayEffects=True

View File

@@ -0,0 +1,4 @@
[/Script/PHY.PHYLocomotionSettings]
bUseSmoothLocomotionSystem=True
bReplicateTraversalState=True
MaxSprintSpeed=650.000000

4
Config/DefaultPHYUI.ini Normal file
View File

@@ -0,0 +1,4 @@
[/Script/PHY.PHYUISettings]
bUseCommonUI=True
bOpenMenusWithGameplayPause=False
DefaultHUDLayerName=HUD

BIN
Content/AGame/Map/Map_Test.umap LFS Normal file

Binary file not shown.

1826
PHY.sln Normal file

File diff suppressed because it is too large Load Diff

50
PHY.uproject Normal file
View File

@@ -0,0 +1,50 @@
{
"FileVersion": 3,
"EngineAssociation": "5.7",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "PHY",
"Type": "Runtime",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "ModelingToolsEditorMode",
"Enabled": true,
"TargetAllowList": [
"Editor"
]
},
{
"Name": "GenericCombatSystem",
"Enabled": true,
"MarketplaceURL": "com.epicgames.launcher://ue/Fab/product/d4d45c2c-c698-4274-bb14-5474b7880a01"
},
{
"Name": "GenericGameSystem",
"Enabled": true,
"MarketplaceURL": "com.epicgames.launcher://ue/Fab/product/6904d4d1-c7af-4973-b10e-a88c4436dab5"
},
{
"Name": "GenericInventorySystem",
"Enabled": true,
"MarketplaceURL": "com.epicgames.launcher://ue/Fab/product/9a9b6f10-4d4c-4897-90ec-809854653402"
},
{
"Name": "SmoothLocomotionSystem",
"Enabled": true,
"MarketplaceURL": "com.epicgames.launcher://ue/Fab/product/643ae212-8cfe-4238-bb56-c41"
},
{
"Name": "AuroraDevs_UGC",
"Enabled": true,
"MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/291971d9abb1443897deb57e80731270",
"SupportedTargetPlatforms": [
"Win64"
]
}
]
}

15
Source/PHY.Target.cs Normal file
View File

@@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class PHYTarget : TargetRules
{
public PHYTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V6;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_7;
ExtraModuleNames.Add("PHY");
}
}

23
Source/PHY/PHY.Build.cs Normal file
View File

@@ -0,0 +1,23 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class PHY : ModuleRules
{
public PHY(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayTags" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}

6
Source/PHY/PHY.cpp Normal file
View File

@@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "PHY.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, PHY, "PHY" );

6
Source/PHY/PHY.h Normal file
View File

@@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"

View File

@@ -0,0 +1,13 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameplayTags/PHYGameplayTags_Ability.h"
// 能力 Tag 由战斗/GAS 专家维护,新增时同步 Ability 输入绑定和多人语义。
namespace PHYGameplayTags
{
UE_DEFINE_GAMEPLAY_TAG(Ability_Attack_Primary, "Ability.Attack.Primary");
UE_DEFINE_GAMEPLAY_TAG(Ability_Attack_Secondary, "Ability.Attack.Secondary");
UE_DEFINE_GAMEPLAY_TAG(Ability_Dodge, "Ability.Dodge");
UE_DEFINE_GAMEPLAY_TAG(Ability_Jump, "Ability.Jump");
UE_DEFINE_GAMEPLAY_TAG(Ability_Interact, "Ability.Interact");
}

View File

@@ -0,0 +1,9 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameplayTags/PHYGameplayTags_Effect.h"
// 效果 Tag 由交互/效果专家维护,新增时同步表现复制策略。
namespace PHYGameplayTags
{
UE_DEFINE_GAMEPLAY_TAG(Effect_Hit, "Effect.Hit");
}

View File

@@ -0,0 +1,10 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameplayTags/PHYGameplayTags_Event.h"
// 事件 Tag 用于系统间消息和 GAS Event新增时避免与状态 Tag 混用。
namespace PHYGameplayTags
{
UE_DEFINE_GAMEPLAY_TAG(Event_Combat_Hit, "Event.Combat.Hit");
UE_DEFINE_GAMEPLAY_TAG(Event_Interaction_Begin, "Event.Interaction.Begin");
}

View File

@@ -0,0 +1,18 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameplayTags/PHYGameplayTags_Input.h"
// 输入 Tag 由输入专家维护,新增 Tag 时必须同步输入路由和配置说明。
namespace PHYGameplayTags
{
UE_DEFINE_GAMEPLAY_TAG(Input_Move, "Input.Move");
UE_DEFINE_GAMEPLAY_TAG(Input_Look, "Input.Look");
UE_DEFINE_GAMEPLAY_TAG(Input_Jump, "Input.Jump");
UE_DEFINE_GAMEPLAY_TAG(Input_Sprint, "Input.Sprint");
UE_DEFINE_GAMEPLAY_TAG(Input_Interact, "Input.Interact");
UE_DEFINE_GAMEPLAY_TAG(Input_Attack_Primary, "Input.Attack.Primary");
UE_DEFINE_GAMEPLAY_TAG(Input_Attack_Secondary, "Input.Attack.Secondary");
UE_DEFINE_GAMEPLAY_TAG(Input_Aim, "Input.Aim");
UE_DEFINE_GAMEPLAY_TAG(Input_LockOn, "Input.LockOn");
UE_DEFINE_GAMEPLAY_TAG(Input_Inventory_Toggle, "Input.Inventory.Toggle");
}

View File

@@ -0,0 +1,13 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameplayTags/PHYGameplayTags_State.h"
// 状态 Tag 是跨系统通信入口,新增前需要总架构确认语义边界。
namespace PHYGameplayTags
{
UE_DEFINE_GAMEPLAY_TAG(State_Combat, "State.Combat");
UE_DEFINE_GAMEPLAY_TAG(State_Aiming, "State.Aiming");
UE_DEFINE_GAMEPLAY_TAG(State_LockedOn, "State.LockedOn");
UE_DEFINE_GAMEPLAY_TAG(State_Interacting, "State.Interacting");
UE_DEFINE_GAMEPLAY_TAG(State_UI_Open, "State.UI.Open");
}

View File

@@ -0,0 +1,7 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "PHYConfigSettings.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYConfigSettings)
// 配置类仅承载默认值和 ini 绑定,具体玩法读取逻辑由各系统的项目包装层实现。

View File

@@ -0,0 +1,26 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "NativeGameplayTags.h"
/**
* @brief PHY 能力相关原生 Gameplay Tag。
*/
namespace PHYGameplayTags
{
/** @brief 主攻击能力。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Attack_Primary);
/** @brief 副攻击能力。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Attack_Secondary);
/** @brief 闪避能力。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Dodge);
/** @brief 跳跃能力。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Jump);
/** @brief 交互能力。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Interact);
}

View File

@@ -0,0 +1,14 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "NativeGameplayTags.h"
/**
* @brief PHY 效果相关原生 Gameplay Tag。
*/
namespace PHYGameplayTags
{
/** @brief 通用命中特效。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Effect_Hit);
}

View File

@@ -0,0 +1,17 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "NativeGameplayTags.h"
/**
* @brief PHY 事件相关原生 Gameplay Tag。
*/
namespace PHYGameplayTags
{
/** @brief 命中事件。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Event_Combat_Hit);
/** @brief 交互开始事件。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Event_Interaction_Begin);
}

View File

@@ -0,0 +1,41 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "NativeGameplayTags.h"
/**
* @brief PHY 输入相关原生 Gameplay Tag。
*/
namespace PHYGameplayTags
{
/** @brief 移动输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Move);
/** @brief 视角输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Look);
/** @brief 跳跃输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Jump);
/** @brief 冲刺输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Sprint);
/** @brief 交互输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Interact);
/** @brief 主攻击输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Attack_Primary);
/** @brief 副攻击输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Attack_Secondary);
/** @brief 瞄准输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Aim);
/** @brief 锁定目标输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_LockOn);
/** @brief 背包开关输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Inventory_Toggle);
}

View File

@@ -0,0 +1,26 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "NativeGameplayTags.h"
/**
* @brief PHY 状态相关原生 Gameplay Tag。
*/
namespace PHYGameplayTags
{
/** @brief 角色处于战斗状态。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(State_Combat);
/** @brief 角色处于瞄准状态。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(State_Aiming);
/** @brief 角色处于锁定目标状态。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(State_LockedOn);
/** @brief 角色正在执行交互。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(State_Interacting);
/** @brief UI 占用主要输入。 */
UE_DECLARE_GAMEPLAY_TAG_EXTERN(State_UI_Open);
}

View File

@@ -0,0 +1,213 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "PHYConfigSettings.generated.h"
/**
* @brief PHY 项目核心配置。
*/
UCLASS(Config=PHYCore, DefaultConfig)
class PHY_API UPHYCoreSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 当前配置版本,用于后续迁移检查。 */
UPROPERTY(Config)
int32 ConfigVersion = 1;
/** @brief 是否默认按多人优先路径设计核心系统。 */
UPROPERTY(Config)
bool bMultiplayerFirst = true;
/** @brief 是否优先使用 C++ 和配置文件表达项目规则。 */
UPROPERTY(Config)
bool bPreferCodeAndConfig = true;
/** @brief 首期目标平台名称。 */
UPROPERTY(Config)
FName TargetPlatformName = TEXT("Win64");
};
/**
* @brief PHY 输入系统配置。
*/
UCLASS(Config=PHYInput, DefaultConfig)
class PHY_API UPHYInputSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 默认输入映射优先级。 */
UPROPERTY(Config)
int32 DefaultMappingPriority = 0;
/** @brief 是否通过 GenericInputSystem 路由 Gameplay 输入。 */
UPROPERTY(Config)
bool bRouteInputThroughGenericInputSystem = true;
/** @brief UI 聚焦时是否阻断 Gameplay 输入。 */
UPROPERTY(Config)
bool bBlockGameplayInputWhenUIFocused = true;
};
/**
* @brief PHY 战斗和 GAS 配置。
*/
UCLASS(Config=PHYCombat, DefaultConfig)
class PHY_API UPHYCombatSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 战斗结果是否必须由服务端确认。 */
UPROPERTY(Config)
bool bRequireServerAuthority = true;
/** @brief 是否允许客户端预测能力表现。 */
UPROPERTY(Config)
bool bEnableClientPrediction = true;
/** @brief 默认命中确认窗口,单位为秒。 */
UPROPERTY(Config)
float DefaultHitConfirmWindow = 0.2f;
};
/**
* @brief PHY 相机配置。
*/
UCLASS(Config=PHYCamera, DefaultConfig)
class PHY_API UPHYCameraSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 是否使用 Ultimate Gameplay Camera 作为主相机系统。 */
UPROPERTY(Config)
bool bUseUltimateGameplayCamera = true;
/** @brief 是否允许 GenericCameraSystem 作为玩法层备用方案。 */
UPROPERTY(Config)
bool bAllowGenericCameraFallback = false;
/** @brief 是否允许 SLSCameraModeSystem 作为玩法层备用方案。 */
UPROPERTY(Config)
bool bAllowSLSCameraFallback = false;
/** @brief 默认锁定目标相机混合时间,单位为秒。 */
UPROPERTY(Config)
float LockOnBlendTime = 0.25f;
};
/**
* @brief PHY 运动系统配置。
*/
UCLASS(Config=PHYLocomotion, DefaultConfig)
class PHY_API UPHYLocomotionSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 是否使用 Smooth Locomotion System 作为主运动系统。 */
UPROPERTY(Config)
bool bUseSmoothLocomotionSystem = true;
/** @brief 是否复制特殊移动和穿越状态。 */
UPROPERTY(Config)
bool bReplicateTraversalState = true;
/** @brief 默认冲刺速度。 */
UPROPERTY(Config)
float MaxSprintSpeed = 650.0f;
};
/**
* @brief PHY UI 配置。
*/
UCLASS(Config=PHYUI, DefaultConfig)
class PHY_API UPHYUISettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 是否使用 CommonUI 承载主要 UI 流程。 */
UPROPERTY(Config)
bool bUseCommonUI = true;
/** @brief 打开菜单时是否暂停 Gameplay。 */
UPROPERTY(Config)
bool bOpenMenusWithGameplayPause = false;
/** @brief 默认 HUD 层名称。 */
UPROPERTY(Config)
FName DefaultHUDLayerName = TEXT("HUD");
};
/**
* @brief PHY 背包配置。
*/
UCLASS(Config=PHYInventory, DefaultConfig)
class PHY_API UPHYInventorySettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 是否复制背包状态。 */
UPROPERTY(Config)
bool bReplicateInventory = true;
/** @brief 默认快捷栏数量。 */
UPROPERTY(Config)
int32 MaxQuickSlots = 8;
/** @brief 装备变化是否允许触发 GameplayEffect。 */
UPROPERTY(Config)
bool bAllowEquipmentGameplayEffects = true;
};
/**
* @brief PHY 交互配置。
*/
UCLASS(Config=PHYInteraction, DefaultConfig)
class PHY_API UPHYInteractionSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 交互是否必须由服务端确认。 */
UPROPERTY(Config)
bool bRequireServerConfirmedInteraction = true;
/** @brief 默认交互检测距离。 */
UPROPERTY(Config)
float InteractionTraceDistance = 350.0f;
/** @brief 是否允许使用 SmartObjects 承载复杂交互。 */
UPROPERTY(Config)
bool bUseSmartObjects = true;
};
/**
* @brief PHY 效果配置。
*/
UCLASS(Config=PHYEffects, DefaultConfig)
class PHY_API UPHYEffectsSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 是否使用 GenericEffectsSystem 管理通用效果。 */
UPROPERTY(Config)
bool bUseGenericEffectsSystem = true;
/** @brief 是否通过 GameplayCue 复制关键战斗表现。 */
UPROPERTY(Config)
bool bReplicateGameplayCues = true;
/** @brief 默认效果裁剪距离。 */
UPROPERTY(Config)
float EffectCullDistance = 5000.0f;
};

View File

@@ -0,0 +1,16 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameplayTags/PHYGameplayTags_Ability.h"
#include "GameplayTags/PHYGameplayTags_Effect.h"
#include "GameplayTags/PHYGameplayTags_Event.h"
#include "GameplayTags/PHYGameplayTags_Input.h"
#include "GameplayTags/PHYGameplayTags_State.h"
/**
* @brief PHY 项目的原生 Gameplay Tag 聚合入口。
*
* 具体 Tag 必须按功能域拆分到 Source/PHY/Public/GameplayTags 和
* Source/PHY/Private/GameplayTags 下维护,本文件只负责聚合包含。
*/

View File

@@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class PHYEditorTarget : TargetRules
{
public PHYEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V6;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_7;
ExtraModuleNames.Add("PHY");
}
}