赞
踩
同样适用于UE4
刚下载好UE5引擎第一次运行(创建C++类工程)的时候先不要修改缓存,先运行一次(创建C++类工程),后面再更改缓存,否则会出错!!!
查找(Ctrl+F) InstalledDerivedDataBackendGraph
改为:
将:%ENGINEVERSIONAGNOSTICUSERDIR%DerivedDataCache
改为:%GAMEDIR%DerivedDataCache
虚幻编辑器或者VS2019打不开解决办法
如果用UE5/UE4打开项目的时候打不开虚幻编辑器或者VS2019,只要安装下面两个程序即可解决
自己初学UE4时遇到的新建项目时无法打开编译器的解决方法
安装环境:
WIN10系统中分别安装了VS2017和UE4.18.3
问题概述:
解决方法:
1.打开VS2017的安装版本,点修改.
3.在单个组件中勾选游戏和图形下的"Unreal Engine 安装程序"
4.点击修改.等待安装完成后解决问题
VS2017 incredibuild 中的一个文件 与UE中的文件重名了。
打开 VS installer 把incredibuild卸载掉就好了。
直接下载安装ue4,ue4版本 4.26.1创建c++空项目到67%,编译失败
到这就完啦,不能直接打开。错误代码网上查询仿佛是虚拟内存不够
这是因为我的项目里面含有中文,把中文字符改了就好了
由于从不同主机迁移过来的项目,可能因为引擎位置或版本不同而造成代码无法编译,找不到文件等问题。
那么,我们可以通过修改 .vcxproj 中的版本与路径解决该问题。
找到该路径YourProject\Intermediate\ProjectFiles下的 YourProject.vcxproj文件
使用记事本打开,进行 编辑->替换 进行如下更改
原路径 C:\Program Files\Epic Games\UE_4.17
现路径 H:\UE4\Epic Games\UE_4.19
重新打开VS项目即可成功生成
原文链接:https://blog.csdn.net/qq_24835213/article/details/80081355
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
的标签中加入如下字段
即可!
6.项目拷贝到其他电脑识别不到ue4目录:
右键项目重新生成sln项目即可。
7.通过反射来以名字查找更改Ustruct成员值
void UPP_ToolBluePrintFunctoin::GetSetParameter(UObject * ObjectWithPara,const FName & Parameter_name, const float Intensity, UObject* & OutActor)
{
//OutActors.Reset();
APostProcessVolume* PP_Outer;
FName PropName = FName(“Settings”);
FName MemberName = Parameter_name;
float NewValue = Intensity;
struct FPostProcessSettings MyPPSettings;
PP_Outer = Cast(ObjectWithPara);
// Get property representing struct
UProperty * Prop = PP_Outer->GetClass()->FindPropertyByName(PropName);
// Ensure Object actually has a special member
if (Prop)
{
// Get struct address void * StructAddress = Prop->ContainerPtrToValuePtr<void>(PP_Outer); // Ensure the parameter is special parameter if (UStructProperty * StructProp = Cast<UStructProperty>(Prop)) { // We'll get struct properties through a UScriptStruct, not a UObject // ScriptStructs are just templates and don't hold any of your data UScriptStruct * ScriptStruct = StructProp->Struct; FPostProcessSettings MyPPSettings; // Get need property UProperty * ChildProp = ScriptStruct->FindPropertyByName(MemberName); // Cast to FloatProperty if (UFloatProperty * ChildFloatProp = Cast<UFloatProperty >(ChildProp)) { PP_Outer->CanEditChange(ChildFloatProp); //not work /* ChildFloatProp->SetFloatingPointPropertyValue(StructAddress, NewValue);*/ ChildFloatProp->SetPropertyValue_InContainer(StructAddress, NewValue); } OutActor = PP_Outer; } }
}
其中
UProperty * Prop = PP_Outer->GetClass()->FindPropertyByName(PropName);
通过名字查找到了Uobject包含的settings Uproperty
void * StructAddress = Prop->ContainerPtrToValuePtr(PP_Outer);
拿到settings Uproperty 地址的指针
UStructProperty * StructProp = Cast(Prop)
确保指针指向的是一个UStructProperty
UScriptStruct * ScriptStruct = StructProp->Struct;
得到UStructProperty的抽象定义
UProperty * ChildProp = ScriptStruct->FindPropertyByName(MemberName);
通过名字找到UStructProperty定义下包含的一个UProperty
UFloatProperty * ChildFloatProp = Cast(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可用以下代码实现:
FVector4 * Vector4Address = ChildProp->ContainerPtrToValuePtr<FVector4>(StructAddress);
Vector4Address->X = NewValue;
Vector4Address->Y = NewValue;
Vector4Address->Z = NewValue;
Vector4Address->W = NewValue;
通过上面的方法基本上可以实现对任意类型的UProperty进行Set/Get.但是在对与UE4自带的bool类型有点问题:
UProperty * ChildProp_b = ScriptStruct->FindPropertyByName(bOverrideName);
uint32 *ChildBoolProp = ChildProp_b->ContainerPtrToValuePtr(StructAddress);
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;
创建蓝图没问题,创建C++项目报错:error CS0042 ERROR: Unable to compile source files.
网上搜了大半天,各种方式都试了,不好使
后来打算咬牙重装4.25引擎,装之前设置了一下
C:\Program Files(x86)\Epic Games\UE_4.25\Engine\Intermediate\Build\BuildRules
文件夹的用户权限
属性–>安全,编辑 Users权限,完全控制。
莫名好用了。
记录一下,有碰到这个问题的可以试一下。
这个问题是因为本机缺少编译器,只用自己配置一下编译器的位置就好了
第一步:自己在任意的文件夹下面新建个bin文件夹,里面再创建一个amd64文件夹
第二步:打开自己的vs的安装地址的
\VC\Tools\MSVC\14.11.25503\bin\Hostx64\x64
目录下,把东西复制一份进bin文件夹,再复制一份进amd64文件
第三步:打开注册表
win+R
Regedit
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VC7
将14.0的键值修改成你的bin文件夹的父目录
第四步:重启你的UE4就OK了
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。