debugeditor模式下,在LoadPackage过程中crash,vs报出Stack overflow的错误
这是由于Package层数过多,vs栈不够用导致的。而ue4用UBT导致不能直接修改项目的栈大小。之前项目后期就因为这个崩溃导致大家没法再用debug模式进行开发。直接的解决办法是修改UEBuildWindows.cs中的LinkEnvironment.DefaultStackSize,这里默认赋值为Target.WindowsPlatform.DefaultStackSize,代码跟了一下我这边环境该值是5MB,我这里直接将其乘以3,项目启动成功。https://answers.unrealengine.com/questions/750298/how-to-increase-stack-size-for-unreal-engine.htmlanswers.unrealengine.com
角色行走过程中胶囊体与别的物体发生碰撞时,Hit信息中并没有附带物理材质的信息
这是因为默认情况下胶囊体的bReturnMaterialOnMove为false,改为true就有了。
这个碰撞信息是在移动组件中先创建FCollisionResponseParams变量,然后进行碰撞查询时产生的,详情见UPrimitiveComponent::InitSweepCollisionParams,断点调试流程。
Error MSB3073 The command "chcp 65001 >NUL
降低vs版本到vs2019 Version 16.5.0https://www.reddit.com/r/unrealengine/comments/gphjjj/unable_to_compile_c_project_425/www.reddit.com由于使用incredibuild导致的编译错误
在类似这个路径下:C:\Users\username\AppData\Roaming\Unreal Engine\UnrealBuildTool找到BuildConfiguration.xml文件打开,
加上这段:
false
参考:http://yekdniwunrealengine.blogspot.com/2017/11/incredibuild.htmlyekdniwunrealengine.blogspot.com
ue4中new对象的操作是先allocateobject然后调用c++标注的placement new:
char* buf = new char[sizeof(A) * 3];//申请了3个A的内存
A* pc = new(buf)A();
引擎中关于接口与模板的一个用法:
struct TStructOpsTypeTraitsBase2{
enum
{
WithZeroConstructor = false,
WithNoInitConstructor = false,
};
};
template
struct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2
{
};
struct FVector
{
public:
};
template<>
struct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2{
enum
{
WithNoInitConstructor = true,
};
};
TMap循环中删除迭代器
for (TMap::TIterator it(Map); it; ++it)
{
if()
{
it.RemoveCurrent();
}
}
ClassWithin的理解?
/** The required type for the outer of instances of this class */
该类实例的Outer必须是什么类型
什么是Native函数
Native函数指的是在C++有函数体实现的函数,而蓝图中的函数和BlueprintImplementableEvent的函数就不是Native函数。
UObject可编辑
UCLASS(DefaultToInstanced, editinlinenew)
UPROPERTY(EditInstanceOnly, Instanced)
TArray EachEffect;
编辑器bool属性作为编辑条件显示在其他属性中而不单独占一行
UPROPERTY(EditAnywhere, Category="Behavior", meta=(InlineEditConditionToggle))
uint8 bOverride_Cursor : 1;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Behavior", AdvancedDisplay, meta=( editcondition="bOverride_Cursor" ))
TEnumAsByte<:type> Cursor;
编辑器根据某枚举变量更改其他变量是否可编辑
bool FPaladinAbilityEachEffectConfig::CanEditChange(const UProperty* InProperty) const
切换controller的时候 输入持续回掉的bug解决办法:
UPlayerInput::FlushPressedKeys
智能指针的cast 这个cast并不会因为转换失败而为空 正确使用方式如:
if (InWidget->GetType() == FName(TEXT("SButton")))
{
TSharedRef CurButton = StaticCastSharedRef(InWidget);
}
参考SharedPointerTesting.h了解更多
编译引擎的时候GetReferenceNearesttargetframeworktask
安装VS2017的时候 选中"NuGet package manager"
蓝图节点使用Latent/async action
要重写getworld 注意GetOuter()->GetWorld();有可能Outer本身未重写GetWorld 就会导致没用
模板代理的例子 用在PlayerInputComponent->BindAction
class AMyCharacter : public ACharacter
{
void Foo(int32 idx);
DECLARE_DELEGATE_OneParam(FFooDelegate, int32);
};
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInput)
{
PlayerInput->BindAction("Foo", IE_Pressed, this, &AMyCharacter::Foo, 42);
}
多个UObject实例作为key的map
按照以多个UObject实例作为key的map,当这多个UObject实例的值都相同时满足查找,例子:FGCNotifyActorKey中用到FObjectKey
模板Lerp
FMath::Lerp
UE4源码关于组合键的解决方案函数
UPlayerInput::GetChordsForKeyMapping
ue4输入响应先后顺序
PlayerController->LevelBP(包括子关卡)->Pawn
SWidget的cast
可以使用GetType()先得到类型,再调用static_cast<>静态转换
ue4 userwidget中对子widget查找:
每个userwidget中有UWidgetTree,这个类构建树形结构,同时负责相关查找
ue4 userwidget导航蓝图编辑:
UWidget成员变量:class UWidgetNavigation* Navigation;
注意这个类的UPROPERTY以及这个类本身的定义部分,由各个方向的FWidgetNavigationData构成
由于操作错误 PaperSprite导入时在文件名加索引产生新的文件的问题
详细见源码FPaperJsonSpriteSheetImporter::PerformImport
if (bIsReimporting)
{
TargetSprite = FindExistingSprite(Frame.FrameName.ToString());
}
if (TargetSprite == nullptr)
{
AssetToolsModule.Get().CreateUniqueAssetName(TentativePackagePath, DefaultSuffix, /*out*/ PackageName, /*out*/ AssetName);
OuterForFrame = CreatePackage(nullptr, *PackageName);
}
可知,当TargetSprite为空时,就会产生一个新的Package。而这个新的Package就是Unique的。
设计模式之访问者模式在UE4中的使用
UE4序列化
判断在游戏中
FApp::IsGame()
游戏暂停后 摄像机移动时的模糊
ACameraManager::ApplyCameraModifiers时默认的PostProcessSettings带有MotionBlurAmount不为0
可以自定义一个CameraManager写一个成员变量PausePostProcessSetting 将其配置为0 然后在这个重载函数中:
if (UGameplayStatics::IsGamePaused(this))
{
InOutPOV.PostProcessSettings = PausePostProcessSetting;
}
如何让基类使用派生类指定的类型创建成员变量
APaladinCharacterBase::APaladinCharacterBase(const FObjectInitializer& Initializer)
:Super(Initializer.SetDefaultSubobjectClass(ACharacter::CharacterMovementComponentName))
编辑器中调用类型选择接口
可以参考User Defined Structure Editor,GenerateHeaderRowContent函数中调用SNew(SPinTypeSelector..)
遍历UScriptStruct中的property
参考FItemPropertyNode::InitChildNodes 属性编辑器中结构体成员变量的默认变量
for( TFieldIterator It(StructProperty->Struct); It; ++It )
PaperSprite不显示图片
如图这样一个资源 分辨率为1076*10 导入引擎后作为papersprite就不显示,原因参考源码:
理解这段源码,意思是如果图片宽高比超过100,就会判定为是一条“线”,就不会继续后续操作继而不显示。
FText可多行编辑
c++代码中: