type
status
date
slug
summary
tags
category
icon
password
这种写法与标准的 C++ STL 迭代器(如 std::vector::iterator)略有不同,它更像是一个封装了复杂遍历逻辑的“智能游标”。
以下列代码为例,我们逐段解析这行代码:

代码结构拆解

1. 初始化部分 (Initialization)

  • FSkeletalMeshSectionIter: 这是一个自定义的类(或结构体)。它的作用是专门用来遍历骨骼模型(Skeletal Mesh)在特定 LOD(细节层级)下的“Section”(网格分段)。
  • 构造函数参数:
    • LODIndex: 指定要遍历哪一级 LOD(比如 LOD0 是最高模,LOD1 是低模)。
    • MeshObject: 传入骨骼模型对象的引用,作为数据源。
    • LODData: 该 LOD 层级的具体渲染数据。
    • LODSection (关键点): 这里传入的通常是一个引用(Reference)
      • 这是一个非常重要的 UE 编程模式。这个迭代器不仅仅是自己在跑,它还会把当前遍历到的结果直接赋值给这个 LODSection 变量
      • 这意味着在循环体内部,你不需要写 Iter 来获取数据,而是直接使用 LODSection 这个变量即可。

2. 条件判断部分 (Condition)

  • 这利用了 C++ 的运算符重载(通常是 operator bool() 或 operator void*())。
  • 它的意思是:“只要迭代器还指向一个有效的 Section,就返回 true,循环继续;如果遍历完了,就返回 false,循环结束。”

3. 递增部分 (Increment)

  • 调用迭代器的前置自增操作符。
  • 它的内部逻辑通常是:
      1. 找到下一个有效的 Section 索引。
      1. 更新 初始化时传入的那个 LODSection 引用,让它指向新的数据。

这种写法到底是在做什么?

用通俗的伪代码翻译一下,它的逻辑等同于:

为什么要这么写?(UE 的设计哲学)

你可能会问,为什么不直接用 for (int i = 0; i < Sections.Num(); i++)
  1. 逻辑封装:Skeletal Mesh 的 Section 存储可能很复杂。有些 Section 可能被标记为不可见,有些可能被合并了,或者数据存储在稀疏数组里。FSkeletalMeshSectionIter 把“如何找到下一个有效 Section”的复杂逻辑藏起来了。
  1. 性能与简洁:通过构造函数传入引用(LODSection),避免了在循环体里每次都写 auto& Section = Data[Iter.GetIndex()]; 这样的代码。
  1. 安全性:迭代器内部可以处理越界检查或空指针检查。

总结

这行代码的意思是: “创建一个迭代器 Iter,让它去遍历指定 LOD 下的所有 Section。每找到一个有效的 Section,就把它更新到 LODSection 变量里,直到所有 Section 遍历完毕。”
在循环的大括号 { ... } 里,你可以直接把 LODSection 当作当前正在处理的数据来使用。
Unity与UE的LUT差异与转换方案(AI)关于RenderObject的误会
Loading...