当前位置:   article > 正文

ue4_C++踩过的坑_to be first header included

to be first header included

1.蓝图工程创建C++脚本生成C++文件出错:

OutputLog:

ERROR:e:\project_ue4\*********\Intermediate\Source\VR_Zombie_GearVR.Target.cs(6,14) : error CS0101: ?????ռ䡰<ȫ???????ռ?>???Ѿ??????ˡ?VR_Zombie_GearVRTarget???Ķ???

ERROR: UnrealBuildTool Exception: Unable to compile source files.

解决方案:删除Intermediate文件夹再创建一遍即可

 

 

2.c++编译报错:"Expected xxxxxxxx.h to be first header included”

将xxxx.h头文件放在第一个引用

 

3.c++退出游戏API

FGenericPlatformMisc::RequestExit(false);

4.VS rebuild工程(或者是打包时选了FullRebuild)报错

 

原因:VS的rebuild和ue4的有冲突,会导致误删插件中的文件

解决方法:将缺少的文件从SDK插件中拷贝一份放在对应位置即可打包成功

5.开发小米VR一体机遇到一个坑爹的问题

在上传时报这样的错误

也就是Opengl ES版本需要3.0以上

但是项目中确实用的是ES3.1,androidManifest里面却显示的是2.0

小米插件中提供了修改androidManifest的方法,在MiVRHMD_APL.xml

的<androidManifestUpdates>标签中加入如下字段

即可!

 

 

 

6.项目拷贝到其他电脑识别不到ue4目录:

右键项目重新生成sln项目即可。

 

 

7.通过反射来以名字查找更改Ustruct成员值

  1. void UPP_ToolBluePrintFunctoin::GetSetParameter(UObject * ObjectWithPara,const FName & Parameter_name, const float Intensity, UObject* & OutActor)
  2. {
  3. //OutActors.Reset();
  4. APostProcessVolume* PP_Outer;
  5. FName PropName = FName("Settings");
  6. FName MemberName = Parameter_name;
  7. float NewValue = Intensity;
  8. struct FPostProcessSettings MyPPSettings;
  9. PP_Outer = Cast<APostProcessVolume>(ObjectWithPara);
  10. // Get property representing struct
  11. UProperty * Prop = PP_Outer->GetClass()->FindPropertyByName(PropName);
  12. // Ensure Object actually has a special member
  13. if (Prop)
  14. {
  15. // Get struct address
  16. void * StructAddress = Prop->ContainerPtrToValuePtr<void>(PP_Outer);
  17. // Ensure the parameter is special parameter
  18. if (UStructProperty * StructProp = Cast<UStructProperty>(Prop))
  19. {
  20. // We'll get struct properties through a UScriptStruct, not a UObject
  21. // ScriptStructs are just templates and don't hold any of your data
  22. UScriptStruct * ScriptStruct = StructProp->Struct;
  23. FPostProcessSettings MyPPSettings;
  24. // Get need property
  25. UProperty * ChildProp = ScriptStruct->FindPropertyByName(MemberName);
  26. // Cast to FloatProperty
  27. if (UFloatProperty * ChildFloatProp = Cast<UFloatProperty >(ChildProp))
  28. {
  29. PP_Outer->CanEditChange(ChildFloatProp);
  30. //not work
  31. /*
  32. ChildFloatProp->SetFloatingPointPropertyValue(StructAddress, NewValue);*/
  33. ChildFloatProp->SetPropertyValue_InContainer(StructAddress, NewValue);
  34. }
  35. OutActor = PP_Outer;
  36. }
  37. }
  38. }

其中

 UProperty * Prop = PP_Outer->GetClass()->FindPropertyByName(PropName);

通过名字查找到了Uobject包含的settings Uproperty

void * StructAddress = Prop->ContainerPtrToValuePtr<void>(PP_Outer);

拿到settings Uproperty 地址的指针

UStructProperty * StructProp = Cast<UStructProperty>(Prop)

确保指针指向的是一个UStructProperty

 UScriptStruct * ScriptStruct = StructProp->Struct;

得到UStructProperty的抽象定义

UProperty * ChildProp = ScriptStruct->FindPropertyByName(MemberName);

通过名字找到UStructProperty定义下包含的一个UProperty

UFloatProperty *  ChildFloatProp = Cast<UFloatProperty >(ChildProp)

确保ChildProp 是一个浮点类型的UProperty

 PP_Outer->CanEditChange(ChildFloatProp);

该方法确保了APostProcessVolume里面的settings成员下的名为MemberName的UProperty 值改变起作用

 ChildFloatProp->SetFloatingPointPropertyValue(StructAddress, NewValue);

该方法经测试只能更改UProperty 初始化时的值,在runtime不起作用

 ChildFloatProp->SetPropertyValue_InContainer(StructAddress, NewValue);

该方法经测试可以在runtime实时改变UProperty 的值(StructAddress一定要指向要更改的Ustruct地址)

总结:

反射作为ue4魔改C++的一项功能,在编程过程中给我们提供了很大的便利,但是如果不能透彻理解它的真正含义,很容易在使用过程中给自己造成不必要的麻烦。另外现在获取更改UProperty 的值还限制在UBoolProperty、UEnumProperty、UNumericProperty、UObjectProperty、UArrayProperty、UStructProperty这几种。其中数字属性类, 其子类有 int32, int64, uint32, uint64, float, double等其它具体类型数字的属性类。我想要get/set Vector4类型的UProperty 还依然解决不了。可能对ue4反射还是不够了解。

补充:

get/set Vector4类型的UProperty可用以下代码实现:

  1. FVector4 * Vector4Address = ChildProp->ContainerPtrToValuePtr<FVector4>(StructAddress);
  2. Vector4Address->X = NewValue;
  3. Vector4Address->Y = NewValue;
  4. Vector4Address->Z = NewValue;
  5. Vector4Address->W = NewValue;

 通过上面的方法基本上可以实现对任意类型的UProperty进行Set/Get.但是在对与UE4自带的bool类型有点问题:

  1. UProperty * ChildProp_b = ScriptStruct->FindPropertyByName(bOverrideName);
  2. uint32 *ChildBoolProp = ChildProp_b->ContainerPtrToValuePtr<uint32 >(StructAddress);
  3. bool(ChildBoolProp) = true;

  bool(ChildBoolProp) = true;

这段代码是有问题的,编译不会通过!

我发现UE4为了节省内存,将float类型以Uint32位域格式进行存储,使我在set的过程中出现了问题,如果以指针来Set

*ChildBoolProp = true;

会造成内存错乱,影响到其他相邻属性的值,这一块我还有一些疑惑,有待解决。。。。

引起错乱的原因:位域不支持指针和引用,最好是强转成bool类型再set值。

参考:https://answers.unrealengine.com/questions/711071/setting-value-of-uproperty.html

https://answers.unrealengine.com/questions/212756/setget-uproperty-inside-of-ustruct-directly.html?sort=oldest

https://answers.unrealengine.com/questions/296180/cant-set-uproperty-reflection-in-c-why.html?sort=oldest

https://www.jianshu.com/p/2c33860da041

 

8.更改ue4版本编译报错All source files in module XXXXXX must include the same precompiled header first

解决方法:将这行代码加入到build.cs中
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/275534
推荐阅读
相关标签
  

闽ICP备14008679号