UE核心知识点解析
平面表示
UE中平面通过方程Ax+By+Cz=W进行描述。当W=0时,平面经过原点;当W>0时,平面正空间不包含原点;当W<0时,平面正空间包含原点。
struct FPlane {
float W; // 存储平面法线与平面上某点的点积
};
投影矩阵
正交投影矩阵
class FOrthoMatrix : public FMatrix {
public:
FOrthoMatrix(float width, float height, float zScale, float zOffset);
};
透视投影矩阵
class FPerspectiveMatrix : public FMatrix {
public:
FPerspectiveMatrix(float halfFovX, float halfFovY, float multFovX, float multFovY, float minZ, float maxZ);
FPerspectiveMatrix(float halfFov, float width, float height, float minZ, float maxZ);
FPerspectiveMatrix(float halfFov, float width, float height, float minZ);
};
坐标转换
FMinimalViewInfo viewInfo; // 视图信息对象
FMatrix viewMatrix; // 视图变换矩阵
FMatrix projMatrix; // 投影矩阵
FMatrix viewProjMatrix; // 视图投影矩阵
void CalculateMatrices() {
projMatrix = FReversedZPerspectiveMatrix(
FMath::Max(0.001f, viewInfo.fov) * (PI / 360.0f),
viewInfo.aspectRatio,
1.0f,
viewInfo.nearClip
);
// 视图矩阵构造逻辑省略
viewProjMatrix = viewMatrix * projMatrix;
}
目标指示器实现
void UpdateTargetIndicator(const AActor* target, const AActor* player) {
if (!target || !player) return;
FVector playerPos = player->GetActorLocation();
FVector targetPos = target->GetActorLocation();
FRotator viewRot = player->GetViewRotation();
FVector forwardDir = viewRot.Vector();
FVector rightDir = UKismetMathLibrary::GetRightVector(viewRot);
FVector direction = (targetPos - playerPos).GetSafeNormal2D();
float dotForward = FVector::DotProduct(forwardDir.GetSafeNormal2D(), direction);
float dotRight = FVector::DotProduct(rightDir.GetSafeNormal2D(), direction);
float angle = UKismetMathLibrary::DegAcos(dotForward);
angle *= (dotRight >= 0) ? 1.0f : -1.0f;
// 更新UI角度
indicatorWidget->SetRotationAngle(angle);
}
类继承判断
class UObject {
public:
bool IsA(const UObject* other) const { /* 实现逻辑 */ }
};
class UActor : public UObject {
};
// 使用示例
AActor* myActor = ...;
if (myActor->IsA<AActor>()) {
// 类型判断通过
}
CDO类默认对象
UClass* actorClass = AActor::StaticClass();
AActor* defaultActor = actorClass->GetDefaultObject<AActor>();
系统子类生命周期
- 引擎子类 (UEngine)
- 唯一实例,从启动到关闭始终存在
- 通过GEngine全局访问
- 编辑器子类 (UEditor)
- 编辑器独有,编辑器启动时创建,关闭时销毁
- 游戏实例子类 (UGameInstance)
- 每个游戏会话一个实例
- 生命周期与游戏运行时间一致
- 世界子类 (UWorld)
- 每个世界一个实例
- 生命周期与GameMode一致
- 本地玩家子类 (ULocalPlayer)
- 支持多本地玩家
- 生命周期与GameInstance一致
UMG组件
根容器
- UserWidget: 用户界面根容器
- PanelWidget: 布局容器,不直接渲染
- CommonWidget: 基本渲染组件(如文本、按钮)
性能优化
- RetainerBox: 控制UI刷新频率,默认每秒30帧
- InvalidationBox: 用于缓存不经常变化的UI
关键属性:
- CanCache: 是否允许缓存
- CacheRelativeTransforms: 是否缓存相对变换
- IsVolatile: 是否为易变控件
场景遍历
for (TActorIterator<ACharacter> actorItr(GetWorld()); actorItr; ++actorItr) {
ACharacter* character = *actorItr;
// 处理角色
}
注意事项:
- 避免在编辑器中直接遍历蓝图实例
- 使用适当的迭代器模板根据需求遍历不同类型的 Actor