自由学习记录(174)

Thank the Lord, the fine you has risen

这里明显是在玩宗教/复活那种说法,但故意用得很轻浮、很夸张。

has risen 会让人联想到:

"已经升起了 / 复活了 / 出现了"

Big riff coming, I need a minute
riff 本来是音乐里的"即兴段、乐句、吉他 riff"。

"初始形象选择仍然采用二选一,说明项目在角色入口层没有把身份表达做成更细分的自定义,而是选择了最低理解成本、最低制作成本、最高通用性的做法。"

这类二选一更像是快速分类,而不是角色创建,

说明项目不准备在开局就把个体差异当成核心卖点。

目标用户重视代入感,这种入口可能显得陈旧;如果目标用户更偏轻量和低龄,它又是低阻力的。

"二选一通常意味着后续动画、过场、穿模控制、服装适配、剧情镜头都更容易收敛。

"角色体型、骨架、装扮组合如果被严格控制,后面宠物互动、骑乘、镜头演出、联机同步都更省事。

采用固定二选一,反映出项目在身份表达入口上偏保守。优点是认知负担低、资源收敛、后续内容制作稳定;缺点是玩家自我投射空间小,第一步就把角色与玩家关系做成了预设接受,而不是主动建构。"

"该界面的点击反馈音色过于单一,且重复触发时几乎没有变体,导致用户在短时间内就能感知到素材循环,削弱了按钮反馈应有的清脆感和确认感。"

"UI 点击属于高频微反馈,但当前实现缺少随机化处理,重复样本暴露很快,使交互质感从'确认操作'滑向'机械播放',这会持续拉低界面的整体精致度。"

不是"它没用 MetaSound"------这个结论太实现导向了,你未必知道对方是不是用别的方式做了------而是:

"它没有处理高频重复反馈的变体问题。"

玩家不是在"进入世界并顺势做选择",而是在"进入一个抽象的展示层,然后被要求立刻做决定"。

游戏引擎本身不具备剥夺实体意志的物理强制力。

你的母题

终点身份

越做越像自己。

把"职业名"当成了"人生结构"

哪一种使用图像的人?

"信息贫穷"

每个选择都显得像一生一死。

现实反馈,不只是脑内推演。

一个极度缺乏安全感的状态里,试图用一次完美选择解决所有问题。

一个世界

进入世界的安全感

任何变大的动作都像自杀。

长出

安全感

多个包含同一个头文件的源文件可以复用这些预编译头文件。

UE C++ 工程大量依赖 PCH,例如模块的共享 PCH、CoreMinimal.hEngine.h、各种由 UBT 注入的 include 环境。很多 .cpp 实际上不是"只靠文件顶部写的 include 就能独立解析",还依赖编译系统强制加进去的头文件。

forced include,就是编译命令里通过类似 /FI xxx.h 或 Clang/GCC 的 -include xxx.h 强行注入的头文件。它不一定出现在你的 .cpp 文本里,但编译器解析时它已经存在。Rider 如果不理解这些 forced includes,就可能出现:编译没问题,但 IDE 里大量类型变红、宏找不到、补全不完整。

Release 是"我把这次授权核销掉"。

我拿资产编号 MeshPath 去银行申请使用这项资产。

银行检查资产是否存在。

银行确认资产类型正确。

银行把资产访问入口 Mesh 给我。

银行同时开出一张授权凭证 MeshLease。

~/.codex/skills = Codex skills,适合隐式调用、复杂工作流

~/.codex/prompts = 自定义 slash prompt,通常需要显式调用

.codex/config.toml = 项目级配置

~/.codex/config.toml = 用户级配置

GitHub issue 里有人提到 Codex 当前用户 skills 看起来主要从 $CODEX_HOME/skills 加载,默认是 ~/.codex/skills;如果你把 skills 放到别的目录,比如 ~/.agents/skills,可能不会被自动加载。

Global Asset Picker ,快捷键通常是 Ctrl + P

右键打开 Context Menu,然后直接搜索节点名;Blueprint Editor 里也有 Blueprint Search。

PolyGroup 不在普通 Select Mode 里 ,它属于 Modeling Mode

Modeling Mode 后看左侧工具列表:

Attributes → PolyGroups / Paint PolyGroups / Generate PolyGroups

根据角度、法线、拓扑边界、UV seam 等规则,把它们分成区域:

overflow-visible! 复制代码

PolyGroup A = 一片面
PolyGroup B = 另一片面
PolyGroup C = 另一片面

PolyGroup Edit:按组选择、移动、挤出、删除、分离、编辑面片。官方把 PolyGroup Edit 描述为一组基于 PolyGroups 编辑 mesh 的操作工具。

UI 受上下文强烈影响

没有一个等价于 OpenAI ChatGPT 官方 Skills 的插件。你能找到的基本都是 Prompt Manager / Custom Instructions Manager:它们只是帮你保存、搜索、一键粘贴提示词,不能真正接入 ChatGPT 内部的 Skills 调度系统。

选中一个真正的 Static Mesh Actor,比如 SM_MT_Nine5SM_MT_Nine6,不要选 BP_DemoDisplay26/27 这种展示蓝图。

它不在左侧 Create / XForm / Deform / Mesh / UVs / Attribs 这些按钮里。入口主要是:

Edit > Plugins

搜索:

Geometry Script

启用 Geometry Script 插件,按提示重启。官方 Geometry Scripting 指南也是这个启用路径。Epic Games Developers+1

启用后,它主要出现在:

Blueprint 节点搜索里,例如 Dynamic Mesh、Geometry Script、Mesh Boolean、Append、Transform、UV、PolyGroup 等节点。

Editor Utility Blueprint / Asset Action Utility 里,用来批量处理 Static Mesh、生成网格、修改 UV、做自动化建模流程。

它不是像 UVs 那样的左侧工具分类。

Scriptable Tools

这个更接近"自己做一个 Modeling Tool"。它也不是你截图左侧现有工具分类里的一个按钮。需要启用相关插件后,可能会在模式下拉菜单里出现类似 Scriptable Tools 的编辑器模式。官方文档说使用 Scriptable Tools editor mode 和相关节点前,需要启用对应插件。

重启编辑器。之后再看左上角模式下拉,也就是你现在显示 Modeling Mode 的地方,是否出现 Scriptable Tools 相关模式。

它大概率不是让你在这个左侧工具栏里找,而是让你去启用 Geometry Script / Scriptable Tools 插件,然后通过 Blueprint 或自定义工具来操作网格。

"Array.h 第 1095 行坏了",而要当成:

上层某个系统把非法状态传给了底层容器,底层 TArray 做边界检查时主动崩溃。

UE 报的是 Assert 。这不是普通日志警告,而是 check/断言类失败。UE 官方文档把 crash report 里的类型区分为 crash、assert、ensure 等;ensure 可以上报后继续运行,但 assert 通常代表条件违反后直接中止。

Array.h受害者,不是凶手。底层数组只是发现"你给我的 index 不可能合法",然后崩掉。真正的凶手在更上层:谁构造了这个 index?谁让数组变成了空?谁还保存着旧的选择、旧的三角形 ID、旧的 UV island、旧的 MeshDescription?

第四层:这个巨大负数很不正常。-2147483637 接近 32 位整数最小值 -2147483648,不是普通的 -1。这通常不像"手滑访问了 -1",更像是某种内部 ID、选择索引、压缩标记、无效状态、未初始化/被破坏的索引值被当成普通数组下标使用。不能只按"数组为空"理解,它更像"上游状态已经乱了"。

Sculpting 示例对应的工具在左侧 Modeling Mode 工具分类 里,不是单独的页面。它通常在左侧竖排分类的 DeformModel/Mesh 相关分类里,核心工具名一般是 Dynamic Sculpt / Sculpt

在右侧 Outliner 里选择要雕刻的真实网格,例如这个桶/盖子对应的 SM_... Static Mesh Actor。不要选 BP_DemoDisplay...,那些多半是展示说明牌的蓝图。

Modeling Mode 定义为在 UE 编辑器内直接创建、雕刻、编辑 3D 几何体的工具集

Dynamic Sculpt,用于用多种笔刷雕刻选中的 mesh,并通过 remeshing 动态增加新几何。

https://www.gstatic.com/generate_204 is a connectivity check tool used by browsers and devices to detect internet access or captive portals by triggering an HTTP 204 "No Content" response. It often appears during public Wi-Fi logins or troubleshooting network issues. Read the technical explanation at Chromium .

配置文件本身做不到"自动挑带宽最高的节点"

url-test 只能根据测试 URL 的响应延迟来选节点;

Mesh Build Settings:recompute_normals 会忽略原始网格法线并重新计算;recompute_tangents 会忽略原始切线并重新计算;compute_weighted_normals 会按面积和角度加权计算法线。

导入时 UE 是不是保留了 DCC 的平滑信息

点上方:

Reimport Mesh With Dialog

然后在导入设置里看类似:

导入设置里看类似:

Normal Import Method
Normal Generation Method
Compute Weighted Normals

UE 5.7 的 FBX Static Mesh Import Data 里确认有 normal_import_method,它决定是否从 FBX 读取 tangent/binormal/normal,还是让 UE 自动生成;也有 normal_generation_methodcompute_weighted_normals

Faceted 通常意味着每个面使用接近独立的法线,面与面之间不会视觉平滑,所以边界很硬。

Smoothed 通常意味着相邻面共享或平均顶点法线,即使几何还是低面数,看起来也会更圆滑。

从 Blender 5.0 来的模型,根源通常在 Blender 里:Flat / Smooth、Auto Smooth、Sharp Edge、Custom Split Normals、Weighted Normal Modifier 等。UE 导入时如果选择 Import NormalsImport Normals and Tangents ,会尽量保留 DCC 里的法线结果;如果打开 Recompute Normals,UE 会重新算,原来的 faceted/smoothed 结果可能被改变。

SM_Smooth_Nanite / SM_Faceted_Nanite 的 Static Mesh Editor

它主要用于查看 Static Mesh 的外观、碰撞、UV、LOD、Nanite、材质槽、Build Settings 等资产属性。Epic 的 Static Mesh Editor 文档也把它定位为用于预览 Static Mesh、碰撞、UV,并设置/操作 StaticMesh 资产属性的编辑器。

Epic 文档明确说,在 Static Mesh Editor 里可以在完整 Nanite mesh 和 Nanite fallback mesh 之间切换查看

Fallback Triangles: 1,888Fallback Vertices: 1,627 是 Nanite fallback mesh 的统计。Fallback mesh 是 Nanite 资产为非 Nanite 路径、某些平台/功能或兼容场景生成的简化网格。

GPU Memory: Always allocated / Streaming / Total 是 Nanite 资源在 GPU 侧的驻留/流送统计。大意是:一部分数据需要常驻或始终分配,一部分数据根据视图和需求流送进来。

Estimated Compressed Disk Size: 7.97 MB (7.93 MB Nanite) 是 UE 对这个 Static Mesh 资产序列化后压缩磁盘占用的估算,其中括号里是 Nanite 数据部分。

Current Screen Size: 1.20816 来自 Static Mesh Editor 当前视口。官方 Static Mesh Editor UI 文档把 Current Screen Size 描述为:网格体显示在屏幕上的垂直高度,相对于视口高度的比例。你这里大于 1,说明这个门在当前视口中垂直方向已经超过视口高度。Epic Games Developers

你左下角显示 Triangles,并且门上有很多彩色三角形,这说明你现在处在 Na

Generate Mesh Distance Fields 会为静态网格体构建距离场,供 Lumen 软件光追、Distance Field AO 等功能使用。

导入 FBX / 生成 Static Mesh

→ UE 构建 Static Mesh RenderData

→ 如果启用 Nanite,额外构建 Nanite 内部数据和 fallback mesh

→ 如果启用距离场,构建 Mesh Distance Field

→ 如果有碰撞,保存到 BodySetup

→ Static Mesh Editor 预览视口读取这些数据

→ 在左上角用 editor debug overlay 画出来

Smooth 版本是 100 万 Nanite 三角形、约 52.6 万 Nanite 顶点;

如果有碰撞,保存到 BodySetup

→ Static Mesh Editor 预览视口读取这些数据

in the editor 是编辑器状态下的资源大小

UE 编辑器里看到的资源,不等于最终游戏包里的资源。编辑器需要保留很多开发期信息,例如资产元数据、导入信息、可重新构建的数据、编辑器使用的派生数据、不同平台可能需要的缓存等。UE 官方的 Derived Data Cache 文档也说明,很多 UE 资产在使用前需要生成额外的 derived data,例如 shader、材质、纹理、mesh 等都会产生面向使用或平台处理的派生数据。

UE 的 Cook 不是普通"保存文件"。Cook 的意思是:把项目里的资产转换成目标平台可用的格式。官方 Packaging 文档明确说,geometry、materials、textures、Blueprints、audio 等资产会被转换成 platform-specific format,并且在适用时被压缩和优化。Epic Games Developers

所以:

when compressed and cooked

完整技术含义是:

当这个 mesh 被 UE 按目标平台规则处理、压缩,并变成打包/运行时使用的数据之后。

例如 Windows、Android、PS5、Switch 的 Cook 结果可能不同,因为目标平台的格式、压缩、纹理格式、shader permutation、资源裁剪策略都可能不同。

第四层:Nanite Mesh 和普通 Static Mesh 存的数据结构不一样

普通 Static Mesh 通常靠传统 LOD。也就是 LOD0、LOD1、LOD2、LOD3......每一级是一个更简化的模型。远处用低 LOD,近处用高 LOD。

Nanite 不是简单地存几套传统 LOD。官方 Nanite 文档说,启用 Nanite 的 mesh 本质上仍然是 triangle mesh,但它的数据上应用了大量 level of detail 和 compression。Epic Games Developers

Console Variables/Commands 可以通过控制台或 -ExecCmds 方式执行。

A + (B - A)·t is deceptively powerful

意思是:

A + (B - A)·t 这个公式看起来很简单,但其实非常强大。

deceptively simple

看起来简单,但背后不简单。

deceptively difficult

看起来容易,实际很难。

deceptively small

看起来小,实际容量/影响/规模不小。

关卡的 Level Blueprint / 关卡蓝图 ,它在做"关卡级脚本编排"。它不是一个给你在 Content Browser 里随便复用的普通 Blueprint Class,而是绑定到当前 Map / Level 的脚本图。你的理解基本正确:通常一个 Level 有自己的 Level Blueprint,用来处理这个关卡中具体 Actor 实例之间的事件关系。Epic 官方文档也把 Level Blueprint 定义为用于关卡范围事件、Actor 行为控制、关卡内脚本逻辑的 Blueprint,并且文档明确提到可以把关卡中某个 Actor 的事件添加到 Level Blueprint 里。Epic Games Developers+1

Door1trigger,它绑定了 OnActorBeginOverlapOnActorEndOverlap。进入 TriggerBox 时,调用关卡里某个 BP_Double_Doors 实例的 Open doors;离开 TriggerBox 时,调用同一个门实例的 Close doors

普通 Actor Blueprint 是"类",你可以拖很多实例到不同 Level;Level Blueprint 更像"这个关卡自己的脚本"。它天然知道这个关卡里的具体 Actor 实例,例如 PersistentLevel.Door1triggerPersistentLevel.BP_Double_Doors_C_1PersistentLevel.Coinspawntrigger。这也是为什么它非常适合写"只属于这个关卡"的逻辑。

如果项目用了 Level Streaming / World Partition / 子关卡,那么每个独立关卡资源也可以有自己的 Level Blueprint,但它不是"全项目唯一一个"。

为什么适合这个例子:因为这里很多引用都是关卡实例引用,不是类引用。比如它不是在说"所有 BP_Double_Doors 类的门都打开",而是在说"这个 Level 里名为 BP_Double_Doors_C_1 / C_2 的这个具体门实例打开"。这类逻辑放在 Level Blueprint 里很直观,但缺点是复用性差

一次性脚本,比如教学关卡机关、过场触发、某个房间门和某个按钮绑定,

复用

写在 Actor Blueprint、Blueprint Interface、Event Dispatcher、Component、Subsystem、GameMode/GameState 等结构里,让关卡只负责摆放和配置。

组件是 Actor 组合系统的一部分

StaticMeshComponentAudioComponentSpotLightComponentRotatingMovementComponent 这些都挂在 Actor / Blueprint Actor 里面。

Level Blueprint 没有

在运行时把 map files 加载/卸载到内存,也可以切换它们的可见性。也就是说它有两层状态:Loaded / UnloadedVisible / Hidden

玩家进入某个 Level Streaming Volume 后,UE 判断该 Streaming Level 应该被加载并显示;当玩家离开对应 Volume 后,UE 判断它可以被隐藏/卸载。官方文档也说明 Level Streaming Volumes 是通过玩家视点是否在 Volume 内来决定相关 Streaming Level 是否应该加载/卸载。

本质上不是这些 Actor 自己被逐个 Set Actor Hidden In Game,而是它们所属的 Streaming Level 被切换了状态。

子关卡里的 Actor、组件、碰撞、灯光、后处理、蓝图实例等都跟着这个 Level 的可见/加载状态一起变化。

第一种是 只隐藏 Actor / Group。Actor 仍然在当前关卡里,仍然占内存。根据设置不同,它可能不渲染,

Streaming Level Loaded but Not Visible。子关卡已经被读入内存,但暂时不显示。

常用于预加载:先把下一块区域加载好,等玩家到达某个位置再一口气设为 Visible

Streaming Level Unloaded。这才接近你说的"重新读了一遍到内存里然后用"。离开时它可以从世界里卸载,之后相关 Level 对象进入待清理状态,GC 后释放内存;再次进入时再从磁盘/包中加载回来。

不是每一次都必然马上彻底释放显存/内存,因为 UE 有异步加载、资源引用、GC、缓存和引用计数这些机制。概念上是 unload,但实际内存下降可能滞后。

Level_Streaming 是 Persistent Level,下面有 Streaming Level 1 / 2 / 4 这种分组/子区域,旁边还有 LevelStreamingVolume6/7/8。这些 Volume 不是普通碰撞触发器意义上的"开关 Actor",而是 UE Level Streaming 系统用来决定某个 Streaming Level 该不该加载/显示的空间条件。

UE 的 Outliner 本质是编辑器面板,用来显示当前 scene/world 里的 Actor 层级;官方文档也只是把它定义为显示和选择场景 Actor 的层级树,并不是运行时调试器或实时流送监视器。Epic Games Developers

而 Level Streaming 本身是在运行时加载/卸载 map files 或切换可见性;Streaming Volume 则根据玩家视点是否在 Volume 内决定相关关卡是否加载/卸载。Epic Games Developers+1

SVG_LoadingandVisibility 更像是某个 Level Streaming Volume 的对象名,也就是 Outliner 里这些:

LevelStreamingVolume6
LevelStreamingVolume7
LevelStreamingVolume8

它不一定会按墙上显示的名字直接出现在 Outliner 当前可见区域里。原因主要有几种。

第一,墙上的文字是一个 TextRenderActor 或 BP 里的 Text Render Component,不是实际控制 Streaming 的 Volume。你看到的 SVG_LoadingandVisibility 是说明牌内容,不等于 Outliner 里一定有一个同名 Actor。它可能只是文字说明里写出来的名字。

SVG_:示例作者自定义的前缀,可能表示某种 Streaming Volume 相关命名,例如 Streaming Volume Group /

Level Streaming Volume 的主要作用之一,就是把"玩家进入/离开某个空间区域时,加载、显示、隐藏、卸载某个 Streaming Level"的判断交给引擎,而不是你自己在蓝图里手动写 TriggerBox + Load Stream Level / Unload Stream Level。

Level Streaming 可以在运行时加载/卸载 map files,也可以切换它们的 visibility;而 Streaming Level 的 Blueprint streaming type 可以由 Level Streaming Volumes、Blueprint 或 C++ 控制。

普通蓝图方式是:

玩家进入 TriggerBox

→ 触发 BeginOverlap

→ 你手动调用 Load Stream Level

→ 再决定是否 Make Visible After Load

→ 玩家离开 TriggerBox

→ 触发 EndOverlap

→ 你手动调用 Unload Stream Level 或改 visibility

Level Streaming Volume 方式是:

Streaming Level 绑定一个或多个 Level Streaming Volume

→ 每帧引擎检查玩家视点是否在这些 Volume 内

→ 在 Volume 内就请求加载/显示

→ 不在 Volume 内就请求隐藏/卸载,具体取决于 Volume 的 usage 设置

它和蓝图 TriggerBox 的差别是:

TriggerBox 是你自己写事件逻辑。Level Streaming Volume 是 UE 内建的关卡流送判定器。

更"关卡系统化"。你不需要写:

OnComponentBeginOverlap
Load Stream Level
OnComponentEndOverlap
Unload Stream Level

直接在 Streaming Level 的 Details 里把某个 Volume 关联上。然后 UE 的 streaming 系统会根据玩家位置自动处理。

不过它不是万能替代。以下情况仍然适合蓝图或 C++:

你想点击按钮后才加载房间。

你想剧情进行到某一步才显示区域。

你想根据任务状态、玩家阵营、网络同步、存档状态决定加载。

你想先加载但暂时不可见,然后等多个资源都准备好再一起显示。

你想做复杂过渡,比如门打开、淡入、加载屏、异步完成回调。

这种时候 Volume 只根据空间位置判断就不够了。

Precomputed Visibility Override Volume,它不是 Level Streaming Volume。它属于 Visibility/Lightmass 相关系统,用来覆盖预计算可见性结果,主要影响遮挡/可见性预计算,不负责加载或卸载 Streaming Level。旁边 Outliner 里有很多不同 Volume:BlockingVolumeCullDistanceVolumeLightmassImportanceVolumePainCausingVolumePhysicsVolumePrecomputedVisibilityOverrideVolume。这些都叫 Volume,但作用完全不同。

Volume 必须有一个"区域"。没有区域,引擎就不知道什么时候 Actor/Pawn 算是进入这个 PhysicsVolume。BrushComponent0 就是这个区域的几何边界。进入这个边界后,PhysicsVolume 的属性才有意义。

类比:

PhysicsVolume = 规则类型
BrushComponent0 = 规则生效的空间范围
PhysicsVolume1 = 这条规则在当前关卡中的一个实际摆放版本

LevelStreamingVolume:区域内外决定某些 Streaming Level 是否加载/显示。
PhysicsVolume:区域内外决定物理环境参数。
CullDistanceVolume:区域内控制不同尺寸物体的裁剪距离。
LightmassImportanceVolume:区域内影响 Lightmass 烘焙采样重点。
PrecomputedVisibilityVolume:区域内生成预计算可见性数据。
BlockingVolume:区域本身主要用于阻挡碰撞。

相关推荐
sjsjsbbsbsn1 小时前
RAG核心学习总结:文本分块
人工智能·学习·知识图谱
li星野2 小时前
链表通关八题:从反转链表到两数相加,手撕LeetCode高频题
数据结构·学习·leetcode·链表
念恒123062 小时前
python(环境安装,输入输出,变量)
python·学习
你数过天上的星星吗2 小时前
Python学习笔记一(标识符、关键字、变量、数据类型、关系运算)
笔记·python·学习
专注&突破2 小时前
用AI学习graphify
人工智能·学习
超梦dasgg2 小时前
SpringAi学习
人工智能·学习·ai编程
小羽网安4 小时前
从零开始学习 sql 注入,常见的 sql 注入解析
数据库·sql·学习
stm32 菜鸟11 小时前
nucleo-f411re学习记录-12,Wifi模块ESP8684
学习
stm32 菜鸟13 小时前
nucleo-f411re学习记录-9,双轴XY摇杆传感器
学习