93 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						||
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模块。 |