BlueRoseNote/03-UnrealEngine/Gameplay/Lyra/UE5 Lyra学习笔记(1)—LyraEditor.md
2023-06-29 11:55:02 +08:00

93 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: UE5 Lyra学习笔记(1)—LyraEditor
date: 2022-08-09 13:55:15
tags: Lyra Editor
rating: ⭐️⭐️
---
# LyraEditor
主要的实现内容为:
- ULyraEditorEngine
- UCommandlet
- UEditorValidator
- 3个全局命令
- 1个自定义Asset
- FGameEditorStyle
在FLyraEditorModule启动与载入时增加GameplayCueNotify类与GameplayCue路径。并且绑定OnBeginPIE()与OnEndPIE()。
## ULyraEditorEngine
在DefaultEngine.ini的[/Script/Engine.Engine]中指定了这个类,来进行替换编辑器功能:
```ini
UnrealEdEngine=/Script/LyraEditor.LyraEditorEngine
EditorEngine=/Script/LyraEditor.LyraEditorEngine
```
- 重写了PreCreatePIEInstances()
- 根据ALyraWorldSettings的布尔变量ForceStandaloneNetMode来强制设置成**PIE_Standalone**网络模式。
- 调用ULyraDeveloperSettings与ULyraPlatformEmulationSettings类的OnPlayInEditorStarted()向FSlateNotificationManager传递消息。
- 返回父类函数结果。
- 实现了FirstTickSetup()并在Tick()中只调用一次。
- 让ContenBrowser显示插件文件夹
- 判断用户是否有修改停止PIE按键无修改情况下修改按键为Shift+ESC
## UCommandlet
参考https://zhuanlan.zhihu.com/p/512610557
它的应用场景主要为:
- 借助 Commandlet ,我们无需打开 UE 编辑器,即可在命令行下执行某段 C++ 代码。可用来批量处理 UE 工程中的资源等。结合 Jenkins 等自动化处理方案,可较方便地实现 UE 工程的自动化处理。
- 典型应用场景如 Resave Packages 、Fixup Redirects、Cooking、Localization Pipeline 、ImportAsset、ContentValidation等。
引擎中实现了几十个Commandlet具体可以查看引擎中的UCommandlet的子类。
#### 使用与实现
采用命令行启动:
`D:\\MyProject\\MyProjectDir\\MyProject.uproject -skipcompile -run={自定义的Commandlet的名字} {需要的各种参数}`
实现方法:重写`virtual int32 Main(const FString& Params) override;`即可。
#### Lyra中的实现
在Lyra中实现了UContentValidationCommandlet类。主要用于使用命令对修改过的Asset进行有效性检测。功能基于P4V所以对于其他版本管理软件需要花点时间进行改写。大致逻辑如下
- 从P4V取得所有修改文件列表并将信息添加到ChangedPackageNames、DeletedPackageNames、ChangedCode、ChangedOtherFiles中。
- 根据命令行InPath、OfType、Packages参数获取包名并添加到ChangedPackageNames数组中。
- 调用`GShaderCompilingManager->FinishAllCompilation()`停止其他Shader的编译。这样就不会让有效性检测范围外的Shader错误影响到检测结果。
- 调用UEditorValidator::ValidatePackages()与UEditorValidator::ValidateProjectSettings(),最后返回检测结果。
## UEditorValidator
该功能依赖于DataValidation插件。文档地址https://docs.unrealengine.com/5.0/en-US/data-validation/
目前只有2种创建验证规则的方式
1. 覆盖UObject的IsDataValid()。
2. 创建UEditorValidatorBase的派生类。
关键函数是CanValidateAsset()与ValidateLoadedAsset()。ValidateLoadedAsset()必须为其每个Asset返回AssetPasses或AssetFails。C++与蓝图实现的Validator将在编辑器启动时自动注册而Python版本的需要UEditorValidatorSubsystem中调用AddValidator()来进行注册。
验证资产有2种方法
1. 主动验证。在Asset上右键Asset Action -> Validate Assets。
2. 保存时验证。默认情况下是开启的。设置选项位于Edit -> Editor Preferences -> Advanced -> Data Validation -> Validate On Save
UEditorValidator几个函数的逻辑为
- ValidateCheckedOutContent取得ISourceControlModule与AssetRegistryModule根据文件状态加入对Asset进行验证调用ValidatePackages()如果是h文件会调用GetChangedAssetsForCode()进行验证。最后返回错误信息。会在点击UToolMenus的CheckGameContent按钮时执行这个函数。
- ValidatePackages:验证所有Asset返回结果与所有警告与错误字符串。
- ValidateProjectSettings:读取**PythonScriptPluginSettings**的**bDeveloperMode**变量。如果为bDeveloperMode为1打印错误信息并返回false。
- IsInUncookedFolder:判断指定的package是否处于Uncooked文件夹中并返回文件夹名。
- ShouldAllowFullValidation:是否需要完整验证。
- CanValidateAsset_Implementation:判断是否可以验证Asset默认为处于需要烘焙的文件夹中就为true。
- UEditorValidator_Load:定义检测函数GetLoadWarningsAndErrorsForPackage()。
- UEditorValidator_Blueprints:验证非数据蓝图如有警告与错误则返回EDataValidationResult::Invalid
- UEditorValidator_MaterialFunctions:验证AssetClass为UMaterial的Asset如有警告与错误则返回EDataValidationResult::Invalid
- UEditorValidator_SourceControl:检查Asset的依赖是否加入版本管理
## 3个全局命令
- Lyra.CheckChaosMeshCollision:检查所有载入的StaticMesh的Chaos碰撞数据。
- Lyra.CreateRedirectorPackage:创建Asset Redirector并且重定向替换引用。
- Lyra.DiffCollectionReferenceSupport:It will list the assets in Old that 'support' assets introduced in New (are referencers directly/indirectly) as well as any loose unsupported assets.The optional third argument controls whether or not multi-supported assets will be de-duplicated (true) or not (false)
## 自定义Asset
主要功能:
构建一个EffectTag->Context(物理材质表面类型Tag)与MetaSound Source的表。按需求载入对应的Sound与NiagaraAsset并且在需要的时候进行播放。在ULyraContextEffectsSubsystem(WorldSubsystem)与AnimNotify_LyraContextEffects中有引用。
LyraEditor中的实现文件为
- FAssetTypeActions_LyraContextEffectsLibrary
- ULyraContextEffectsLibraryFactory
Asset的UObject对象ULyraContextEffectsLibrary对象定义在LyraGame模块。