UE4委托构造函数未按预期工作 所有武器子类均加载到相同网格
问题原因及修复方案
核心触发原因
问题的根因是基类AWeapon_core构造函数中,资源查找对象被声明为了static类型:
// 错误写法,static修饰导致只初始化一次 static ConstructorHelpers::FObjectFinder<USkeletalMesh> WEAPON_MESH(*(mk_weapon_mesh_path + _path));
C++中被static修饰的局部变量,只会在函数第一次被调用时执行初始化逻辑,后续所有调用都会直接复用第一次生成的变量值。你第一个实例化的武器子类(比如AK47)加载的网格会被永久存储在这个静态变量中,后续创建其他武器子类时,不会再按照传入的新路径执行资源查找,直接复用了第一次加载的网格,所以所有武器都显示为同一个模型。
修复方法
直接去掉static修饰符即可,修改后的构造函数代码如下:
AWeapon_core::AWeapon_core(FString _path) { m_skeletal_mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Weapon_mesh")); // 去掉static,每次实例化都会按照传入路径执行新的资源查找 ConstructorHelpers::FObjectFinder<USkeletalMesh> WEAPON_MESH(*(mk_weapon_mesh_path + _path)); if (WEAPON_MESH.Succeeded()) m_skeletal_mesh->SetSkeletalMesh(WEAPON_MESH.Object); }
其他可排查点
如果修改后仍然存在问题,可以检查以下边缘问题:
- 确认所有武器子类构造函数传入的资源路径确实不同,没有拼写错误指向同一资源
- 你提供的代码中基类头文件定义的路径常量名为
mk_default_path,但cpp中使用的是mk_weapon_mesh_path,如果该变量不是全局常量而是成员变量,这里存在笔误,会导致路径拼接错误 - 确认没有蓝图层或者其他运行时代码覆盖了骨骼网格体组件的赋值
内容的提问来源于stack exchange,提问作者Game_dev
相关产品推荐
相关产品推荐

