目录

bug合集

代码编译报错

1. 编译时 error C4668: 没有将“_WIN32_WINNT_WIN10_TH2”定义为预处理器宏,用“0”替换“#if/#elif”

一般为Windows中的宏和UE4冲突所致,需要用如下头文件包裹冲突的头文件:

#include "Windows/AllowWindowsPlatformTypes.h"
#include "Windows/PreWindowsApi.h"

#include "冲突的头文件" // 这里把报错涉及的头文件加上,然后整段都加入`自己.h`文件中

#include "Windows/PostWindowsApi.h"
#include "Windows/HideWindowsPlatformTypes.h"

2. 把组件初始化放进BeginPlay,则蓝图类中不显示; 因为生成蓝图类只会调用构造函数

3. Blueprint Runtime Error: "Access None trying to read property SCharacterRef"

4. 报错C2143 语法错误:缺少“;”(在“*”的前面)

找不到类,加上class声明即可class ASWeapon HoldWeapon;

5. 无法解析的外部符号 "__declspec(dllimport) public: static enum EPhysicalSurface __cdecl UPhysicalMaterial::DetermineSurfaceType(class UPhysicalMaterial const *)" (_imp?DetermineSurfaceType@UPhysicalMaterial@@SA?AW4EPhysicalSurface@@PEBV1@@Z)

  1. 版本问题 在CoopGame.Build.cs
    PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","PHYSICSCORE" });, 添加PHYSICSCORE
  2. 换另一种获取表面类型的方式
    EPhysicalSurface Surface =UGameplayStatics::GetSurfaceType(Hit);

6. SExplosiveBarrel.cpp(19): [C4458] “HealthComp”的声明隐藏了类成员

可能是命名冲突,将HealthComp改为BarrelHealthComp即可

7. 未能创建 PCH 的虚拟内存,打到内存堆限制

重启UE即可

8. ApexDefs.h(54): [C4668] 没有将“USE_RTTI”定义为预处理器宏,用“0”替换“#if/#elif”

#include <Actor.h>替换为#include <GameFramework/Actor.h>即可

蓝图编译报错

1. unreal engine doesn't match the property of type HOTRELOADED 1 Object Reference

HotReload是UE的热加载机制,运行编辑器会对C++代码修改进行热加载,有些情况下会热加载失败,所以解决方案是重新运行编辑器

逻辑错误 (展示效果有误)

1. 设置了bCanCrouch=true,还是不能蹲伏 因为蓝图类中没有还原默认值

2. 绑定没响应,最后发现是Input设置成BackSpace了, 这个是退格不是空格,晕 找半天,,,最后改成Space Bar即可

原因:用错事件了
image

3. 无法区分不同表面,已经给不同部位设置了不同的物理材质!

没有把胶囊体对枪械的碰撞关闭,导致遮挡了Mesh的碰撞
image

4. 物体和地面重合

默认设置成了BlockAllDynamic,地面不属于动态物体,所以改成BlockAll,然后用Shift+End就可以置于地面之上了

5. 子组件只有Scale没有LocationRotation / 子组件和父组件位置有偏差 / 子组件只生成在(0,0,0)

  1. 先检查是不是根组件
  2. 不是根组件,则大概率是编译问题;蓝图类先继承别的类(Actor),然后再继承回来(PickupBase),这个时候就正常了。

程序崩溃 (UE闪退)

Saved/log查看报错日志

1. 运行游戏直接闪退,因为没有绑定Owner,而在代码中又通过GetOwner():AActor来获取持有者,直接程序崩溃

2. UE运行崩溃,Fatal error: [File:D:/Build/++UE4/Sync/Engine/Source/Runtime/CoreUObject/Pri

  • 打开Epic Game找到虚幻引擎,在对应的版本下拉选择验证,会对UE4版本进行重新编译
  • 检查报错文件,Rider打开项目代码并修改
  • 构造函数中调用Super()报错

3. 程序崩溃,因为TSubclassOf需要在蓝图中初始化,代码初始化比较繁琐

4. EXCEPTION_ACCESS_VIOLATION reading address

debug整理

蓝图

  1. 打断点

选中按F9,再按取消断点

动画debug

  1. 设置全局时间,慢速更好观察
    image

服务器debug

两种方式

  1. 从rider打断点,进入服务器逻辑

Run->Attach to Process->搜索UE4Editor找到服务器名字(运行后控制台名字,如D:\UnrealEngine\...\UnrealEditor-Win64-DebugGame.exe)->Attach with LLDB

这样就打上断点了

  1. 设置运行选项下Advanced Settings->One Process勾选,就可以正常断点了

GAS

  1. ~打开控制台,输入 showdebug abilitysystem

代码

UEngine.AddOnScreenDebugMessage

if(GEngine) 
{
	GEngine->AddOnScreenDebugMessage(
		-1,
		15.f,
		FColor::Blue,
		FString::Printf(TEXT("Found subsystem %s"), *OnlineSubsystem->GetSubsystemName->ToString())
	);
}