自由学习记录(134)
别人的 Derived Data Cache 你没有UE shader 编译结果不会存进 Git/项目里而是存在DerivedDataCache典型路径C:\Users\user\AppData\Local\UnrealEngine\Common\DerivedDataCache当你第一次打开项目或换机器或升级 UE 版本UE 就必须重新编译全部 shader。DDC 没有共享团队项目通常会用Shared Derived Data Cache例如\\server\UE-DDC或者DDC Cloud这样新人打开项目基本不需要编译 shader。如果没有共享 DDC每个人都会重新编译。Shared DDC团队服务器大型团队通常配置\\Server\UE-DDC或者 UE5 的Zen DDC server这种情况下所有开发者所有项目共享同一份缓存。例如开发者A编译了 20000 shaders开发者B打开项目时几乎不用编译。UE版本之间的复用DDC key 里包含Engine versionShader compiler version所以UE版本是否复用DDC5.3 → 5.3.2基本复用5.3 → 5.4大量失效5.4 → 5.5基本重建因为 shader compiler 可能变化。DDC实际体积UE5项目Nanite Lumen典型项目规模DDC小项目10–20GB中型项目50–150GB大型项目200GBDDC 会随着你打开不同项目不断增长。触发快捷键时当前活动标签页是 chrome://... 页面chrome.scripting.executeScript 不能注入到这类受保护页面所以 Promise 直接抛错了。我要把 background.js 补上 URL 白名单判断和统一的异常兜底避免这种页面把后台脚本打红。一是在执行前过滤 chrome://、edge://、about: 这类不可注入页面二是把整个命令处理包进 try/catch避免任何一次注入失败都变成未捕获异常。Console会打在哪里会打在这个扩展自己的后台控制台里不是普通网页的 DevTools Console。你这类 MV3 扩展是 service worker 后台所以看这里打开 chrome://extensions/开启“开发者模式”找到你的扩展 CSDN Quick Paste点 Service worker 旁边的“检查视图 / Inspect”console.warn(send-to-csdn failed:, error) 就会出现在那个 DevTools 的 Console 里。补充一下如果是 chrome.scripting.executeScript({ func: ... }) 里注入到网页内部的 console.log那会出现在目标网页自己的 DevTools Console如果是 background.js 顶层的 console.*那就在扩展的 Service Worker Console为什么ddc还会增长?不同项目即有共用部分也有不共用部分的ddc?DDCDerived Data Cache衍生数据缓存源资产如纹理、网格体、材质派生出的特定平台格式数据的机制即使两个项目使用同一份模型或贴图只要构建条件不同也会生成新的 DDC 数据。例如TextureAProject1 → BC7 compressionProject2 → Virtual Texture BC7就会产生两个不同缓存条目。第二个原因是Shader permutation 的指数增长。UE 的 shader key 会包含material graph hashstatic switchplatformshader modelfeature flagsNanite / Lumen / VSM / Strata一个 material 在不同项目可能生成完全不同的 permutation 集合。打开过 Android、Win64、Linux、PS5 项目同一个资源会产生不同的缓存DDC默认不会自动删除旧数据。UE 的缓存策略是Append-only cache只添加不主动删除。因此随着你打开越来越多项目缓存目录会越来越大。开发者通常不会把 Project DDC 提交到 Git因为可重建[Request Derived Data by Key] | v ---------------- | Memory Cache | ---------------- | hit? ---- yes -- return | no v ---------------- | Local DDC | | AppData/Common | ---------------- | hit? ---- yes -- load - promote to memory - return | no v ---------------- | Project DDC | | Project/DDC | ---------------- | hit? ---- yes -- load - maybe write back local/memory - return | no v ---------------- | Shared/Server | | DDC / Zen | ---------------- | hit? ---- yes -- download - promote to local/memory - return | no v ---------------- | Rebuild | | shader/tex/etc | ---------------- | v write to configured writable backends | v returnMemory Cache进程内临时缓存生命周期最短。Local DDC本机全局缓存通常在用户目录下。跨项目复用。Project DDC项目目录下的缓存层。是否真在用、用多少取决于配置。Shared / Server DDC团队共享缓存通常是 NAS 路径或 Zen DDC 服务。谁先查、谁可写取决于 backend graph 配置。不同项目、不同 UE 版本、不同团队会有不同顺序。但思路都一样先查缓存 miss 再构建再回写。服务器 DDC 缓存的是“派生数据本身”不是“项目 DDC 文件夹内容的镜像”。比如某个 Shader KeySHA(Key: MaterialX DX12 SM6 Lumen Nanite)服务器上存的是这个 key 对应的结果不是“某台机器项目目录里那个 DerivedDataCache 文件夹”。把插件定义为不直接改引擎源码、但可以扩展 Editor 或 Runtime 的可选组件明确插件类型建立.uplugin和模块结构写Module的启动/卸载逻辑接入你要扩展的系统菜单、工具栏、Slate、Asset、Blueprint、Subsystem、渲染或 Runtime处理依赖、打包、版本兼容MyPlugin/├─ MyPlugin.uplugin├─ Source/│ ├─ MyPlugin/│ │ ├─ MyPlugin.Build.cs│ │ ├─ Public/│ │ └─ Private/│ │ ├─ MyPlugin.cpp│ │ └─ MyPlugin.h├─ Resources/├─ Content/└─ Config/InUnreal Engine, theMyPlugin.Build.csfile isaC# scriptthat tells theUnreal Build Tool (UBT)how to compile and link your plugin module. It is essential for defining which other engine modules your plugin depends on to function.Build.cs。这个决定依赖图。PublicDependencyModuleNames.AddRange(new[]{Core,CoreUObject,Engine});PrivateDependencyModuleNames.AddRange(new[]{CoreUObject,Engine,Slate,SlateCore,UnrealEd,ToolMenus,LevelEditor,Projects});具体依赖项该怎么配Epic 的模块文档和 Module Properties 文档就是官方基准。模块是 Unreal Build Tool 的基本构造单元属性和依赖都在这里定义。Epic Games Developers1真正开始写代码时入口一般是IModuleInterfaceCStartupModule()里做几类事注册菜单和工具栏注册自定义样式/图标注册 AssetTypeActions注册 Details 面板定制注册 Console Commands初始化通信或后台服务ShutdownModule()做对称清理反注册菜单反注册扩展点释放句柄关线程/关 socket如果你要做最常见的Editor 工具插件标准落地路径其实是第一步插件壳子建起来直接在 UE 里用 Plugin Wizard 建一个 C 插件选 Editor Toolbar Button 或 Blank Plugin 都可以。如果只是研究结构Editor Toolbar Button模板最快因为它已经给你好了Module菜单入口Slate 命令注册插件按钮回调第二步把“按钮回调”换成你自己的业务层不要把逻辑全堆在PluginButtonClicked()里。建议拆成UI layer菜单、按钮、面板Command/Application layer命令分发Domain layer资产处理、Actor 操作、蓝图操作Infrastructure layer文件、JSON、HTTP、Socket、MCP这样你后面不管接本地 CLI 还是 MCPEditor UI 都不用重写。自带的 Built-in 插件第三方插件必须先放到项目目录然后 UE 才会扫描到。插件不会自动启用UE 插件Build Tool 编译Unity拖 DLL 就用只编译Development EditorShipping无法使用的。编译是通过UnrealBuildToolUBT.uplugin / .uproject↓UBT解析模块↓生成 Build.cs 依赖图↓调用 MSVC / Clang↓生成 DLL / LIB选项显示为灰色不可点击通常是因为当前项目被识别为纯蓝图项目或者系统缺少必要的编译环境。虚幻引擎不会为没有源代码的项目生成 IDE 工程文件。游戏逻辑全部由Blueprint VMKismet VM执行UE 为非程序员或快速原型开发提供的一种模式No C Targets - 不需要IDE工程没有用户自己的 C Module。创建了Source/项目名/创建了一个项目自己的Module生成了.Build.cs和.Target.cs让 UBT 认为这个项目现在是“有代码项目”从此 IDE 工程、C 编译、UHT 反射生成都会进入这条链所以“蓝图项目改成 C 项目”本质上不是改一个开关而是给项目引入自己的 C 编译单元和构建规则。自己的 C 编译单元和构建纯蓝图项目没有自己的模块定义声明了一个 Runtime Module名叫MyProject。加了 C.uproject往往会出现你的项目代码本质上只是和这些 Engine Modules 一起被构建*.Build.cs是Module 的构建规则。它不是 C是 C# 脚本由 UBT 读取。模块依赖UE 的编译不是普通 C 编译而是两阶段头文件扫描(UHT) - 生成反射代码 - C 编译(UBT 调编译器)它右侧显示的是 Edit in Blueprint这基本说明这个组件是蓝图类里定义的默认组件不是你在关卡实例上临时加的组件做成预编译插件大多数插件首先是开发资产不是发行资产。改一次都要重新为目标平台、目标配置、目标引擎版本重新打包。源码模式虽然进项目时更脆但开发效率更高也更符合 UE 的工程化习惯。发预编译包代价很高预编译插件对版本高度敏感Binaries的位置取决于它属于哪个编译单元Module/Plugin/Project。在 UE 的构建体系里每个构建目标都会有自己的 Binaries 目录。UBT 没生成 DLL。正常情况下会生成UnrealEditor-UnrealMCP.dllUnrealEditor-UnrealMCP.pdb插件从未成功编译Module 名称不匹配比如.upluginModules:Name: UnrealMCP但Build.cspublic class MCP : ModuleRules这种会导致模块不生成 DLL。插件 DLL 名字不是 PluginName.dll而是UnrealEditor-ModuleName.dll例如UnrealEditor-UnrealMCP.dll所以你要找的是Plugins/UnrealMCP/Binaries/Win64/UnrealEditor-UnrealMCP.dllUE 有三种 Animation Mode1. Use Animation Blueprint最常用Animation Mode Animation BlueprintAnim Class ABP_xxx动画由 AnimGraph 驱动StateMachineBlendSpaceIKMontage2. Use Animation AssetAnimation Mode Animation AssetAnimToPlay Walk / Idle只播放单个动画。没有 AnimGraph。3. Custom Mode通常用于ControlRig特殊动画系统Runtime控制你现在的情况可能是这个角色蓝图里已经设置了 AnimBP而你是在实例组件层看。因为截图右上角显示Edit in Blueprint说明这个 SkeletalMeshComponent 来自Base_42 BlueprintAnimClass 可能在Blueprint Class Defaults里设置。你可以点Edit in Blueprint然后查看Mesh → Animation → Anim Class你这张图里关系是当前打开M_actor_laevat_body_01它的父级M_Common_Skin_RainControl_Inst再往上的父级M_Common_Skin这三层通常分别意味着M_Common_Skin真正的母材质这里面有材质节点图和核心实现逻辑M_Common_Skin_RainControl_Inst一个中间材质实例在母材质基础上预设了一批参数可能专门加了雨水/湿润控制这类风格M_actor_laevat_body_01你当前这个具体角色身体材质实例主要负责做最终项目里的具体参数覆盖所以这个 Hierarchy 的作用就是帮你看清这个材质从哪里继承来的真正逻辑在哪一层当前这一层只是改参数还是自己就是母材质左边这些勾选项这是 Show Flags控制视口里“显示什么、不显示什么”。比如Grid地面网格Fog雾Decals贴花Skeletal Meshes骨骼模型Static Meshes静态网格Translucency半透明Collision碰撞可视化Navigation导航数据Landscape地形Widget Components3D UI 组件本质上是“渲染层开关”。2. 右边这串列表这是 Viewport Stats控制你要不要在视口里显示某类运行/渲染统计信息。比如FPSMemoryRHISceneRenderingUnit以及更细的高级分类AIAnimAudioChaosNiagaraSequencer等等这些一般用于性能分析渲染调试子系统观察开发排查也就是说左边更偏“画面显示哪些内容”右边更偏“叠加显示哪些统计信息”你现在打开的是Viewport 菜单进入了 Viewport Stats再展开了 Advanced所以你现在看的是 Unreal 提供的一套视口调试/统计开关不是你项目自定义的功能。Unreal 永远是 Z-up不会变成 Unity 的 Y-up不是因为 SSS 很强而是因为 diffuse lobe、spec lobe、AO、rim、shadow softness 共同把脸部 major planes 交代清楚了SSS 或 profile scattering 的使用是否克制。值得学习的不是“开了没”而是它是否只在耳朵边缘、鼻翼、脸颊薄区、手指等地方产生合理的透光而不是把整张脸洗成蜡。很多人做皮肤失败问题不在 SSS 强度而在于 diffuse、specular 和 subsurface 的能量配比失衡。虹膜深度感是几何实现、法线骗术还是视差瞳孔、虹膜边缘、巩膜血丝、湿润边缘有没有控制到“可见但不过分”眼睑边缘、泪阜、下眼睑湿线是否建立了真实的湿润感眼球转动时高光、遮蔽和接触阴影是否自然。出书吧gpt大人它是不是新建项目都会有不一定每个项目都一模一样但UE 模板项目里很常见很多关卡都会放一个 PostProcessVolume尤其是演示、影视、角色展示场景基本都会有另外即使你不放 PostProcessVolumeUnreal 也不是完全“没有后处理”引擎本身就有默认曝光和 tone mappingPostProcessVolume 只是给你一个更明确、可控的覆盖入口你的灯光和曝光体系没有做到“全局自然平衡”现在是靠这个 box 里的后处理参数把画面压回正常角色展示、小型打光区、摄影棚场景时其实挺常见box 内是专门调好的展示区box 外没认真做全局曝光控制所以视觉反差会很大PPV 这个盒子本身几乎不是性能重点一个 PostProcessVolume Actor 本身开销很小不是因为场景里放了个 box 就变卡2. 真正耗性能的是里面的效果比较常见的开销来源BloomDepth of FieldMotion BlurAmbient OcclusionScreen Space ReflectionsChromatic AberrationLens FlareLocal ExposureColor GradingExposure各种高质量后处理链其中一般更敏感的是Depth of FieldSSR / ReflectionsAO高质量 Bloom一些电影感镜头效果3. 你这个场景如果只是基础曝光/调色那性能影响通常不算大。如果它还开了强景深镜头光晕高质量反射大量屏幕空间效果那就会明显吃 GPU。less whyway much better things to doActor 层和Component 层。UE 的 Details 面板实际上是把 Component 的属性“向上暴露”到 Actor 的 Inspector所以你会看到很多看似属于 Actor 的属性其实来自 Component。SkeletalMeshActor└── SkeletalMeshComponent右侧 Details 里当前选中的是SkeletalMeshComponent只是 UE 把它显示在 Actor 详情页里。Actor 负责Transform生命周期蓝图逻辑挂载组件Component 负责渲染MeshAnimationPhysicsLOD 等所以你看到SkeletalMesh、Animation、Physics、Rendering这些分类其实都是SkeletalMeshComponent 的属性。SkeletalMesh(模型网格 绑定骨骼权重)Skeleton骨骼层级定义骨骼树 bind poseAnimation作用在 Skeleton 上的动画数据多个 SkeletalMesh 可以共用同一个 Skeleton例如SK_Character_ASK_Character_BSK_Character_C↓Skeleton这样动画可以复用。假设你导入一个角色SK_AnimeGirl.uasset内部包含Mesh SkinWeight并引用SK_AnimeGirl_SkeletonSkeleton 内部结构类似root├─ pelvis│ ├─ spine_01│ │ ├─ spine_02│ │ │ └─ neck│ │ │ └─ head│ ├─ thigh_l│ └─ thigh_r动画文件Run.animIdle.animJump.anim都是绑定在这个 Skeleton 上。SkeletalMeshComponent 里有三个核心字段Skeletal MeshAnimation ModeAnim Class含义Skeletal Mesh→ 使用哪个模型Animation ModeAnimation BlueprintAnimation AssetCustomAnim Class→ 使用哪个 AnimBlueprintGet Float Channel这个节点Get Float Channel意思是从某个Control 的 Channel读取一个 float。右侧 Details 面板你可以看到Control Name : ChannelAnimation Type : Animation ChannelValue Type : Float所以这个 Control 其实不是 transform control而是一个数值控制器。用途通常是表情权重corrective blendmaterial parametermorph target weightSet Curve Value然后把这个值写入Set Curve ValueCurve : MT_Nose这个Curve实际上就是 SkeletalMesh 的Animation Curve / Morph Curve。典型 pipeline 是Control Rig Control↓Get Float Channel↓Set Curve Value↓Animation Curve↓Morph TargetControlRig 的优势是统一控制系统。例如UI slider↓ControlRig Control↓同时驱动MorphTargetBone offsetMaterial parameter所以 ControlRig 常用来做facial rigprocedural animationruntime rig logic直接改 MorphTarget 可以ControlRig 的 Graph 最终会被编译成RigVM bytecode运行时执行顺序类似Execute_ForwardSolve(){value Control.ChannelCurve[MT_Nose] value}整个 RigVM 是一个解释执行 VM而不是 Blueprint VM。优点更低 runtime costdeterministic executionanimation thread 可运行材质参数分组那个也还在只是它是在材质参数的 Group 属性里用于Material Instance 面板分组显示参数不是图里这种节点框选分组。5.7 相关文档也还在https://dev.epicgames.com/documentation/en-us/unreal-engine/creating-and-using-material-instances-in-unreal-enginehttps://dev.epicgames.com/documentation/en-us/unreal-engine/BlueprintAPI/MaterialEditing/RenameMaterialParameterGroup结论节点视觉分组/一起拖动现在看的是 Comment Box参数分组Group 还在所以 UE 5.7 里不是没了而是你现在这个场景里应该用 Comment不是找单独的 Group如果你愿意我可以顺手告诉你 UE 5.7 里 Material Editor 里 Comment / Collapse Nodes / Named Reroute 三者分别该怎看右侧 Details找这个参数的 Group填你想要的组名比如 Surface、Normal、FX保存父材质再回到实例这样实例右边就会按你写的组名显示。Epic 的 5.7 API 文档也写得很直接参数节点有一个 Group 字段作用就是 “display in MaterialInstance Editor”https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/UMaterialExpressionTextureSample-https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/UMaterialExpressionTextureCollectionParameter另外两个关键点如果你用的不是 Parameter 节点而是普通常量/贴图节点是不会出现在实例里的组名相同的参数会自动并到同一个组里没有单独“创建组”按钮组是靠参数的 Group 字段“生成”的
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414957.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!