本篇写的是关于UE4的C++方面的小技巧:
1.在构造函数里
//构建组件 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera")); //把组件放到其它组件下 VRCamera->SetupAttachment(VROrigin); //下面这条不能用于构造函数中,否则编辑器崩溃或报错 //VRCamera->AttachToComponent(VROrigin, FAttachmentTransformRules::SnapToTargetIncludingScale);
2.加载资源
具体细节教程(非本人制作):https://ke.qq.com/course/308721
//同步加载,一般用于少量物体加载 //从内存中读取文件,但由于还没从硬盘中读取,所以内存中没有(耗时相对较短),因此读取失败 UHapticFeedbackEffect_Base* ShakeEffect = FindObject<UHapticFeedbackEffect_Base>(NULL,TEXT("HapticFeedbackEffect_Curve'/Game/VirtualRealityBP/Blueprints/MotionControllerHaptics.MotionControllerHaptics'")); //从硬盘中读取文件,放到内存中(耗时相对较长) UHapticFeedbackEffect_Base* ShakeEffect = LoadObject<UHapticFeedbackEffect_Base>(NULL,TEXT("HapticFeedbackEffect_Curve'/Game/VirtualRealityBP/Blueprints/MotionControllerHaptics.MotionControllerHaptics'")); //异步加载,一般用于大量物体加载 void AWelathActor::StreamableManagerOperate() { //创建加载管理器 WealthLoader = new FStreamableManager(); //执行异步加载,添加资源链接数组和加载完成回调函数,其中TexturePath为加载内容的地址 WealthHandle = WealthLoader->RequestAsyncLoad(TexturePath, FStreamableDelegate::CreateUObject(this, &AWelathActor::StreamableManagerLoadComplete)); } void AWelathActor::StreamableManagerLoadComplete() { //加载完成后动态修改图片 TArray<UObject* >OutObjects; WealthHandle->GetLoadedAssets(OutObjects); for (int32 i = 0; i < OutObjects.Num(); ++i) { UTexture2D* WorkTexture = Cast<UTexture2D>(OutObjects[i]); if (WorkTexture) { TextureGroup.Add(WorkTexture); } } }
3.通过UObjectLibrary获取批量内容的地址
.h: class UObjectLibrary* ObjectLibrary; .cpp: void AWelathActor::ObjectLibraryOperate() { if (!ObjectLibrary) { ObjectLibrary = UObjectLibrary::CreateLibrary(UObject::StaticClass(), false, false); //添加到根那,防止被UE4的垃圾回收机制干掉 ObjectLibrary->AddToRoot(); } //搜索所有Texture的路径 ObjectLibrary->LoadAssetDataFromPath(TEXT("/Game/Resource/UI/Texture/MenuTex")); TArray<FAssetData> TextureData; ObjectLibrary->GetAssetDataList(TextureData); for (int32 i=0; i<TextureData.Num(); ++i) { TexturePath.AddUnique(TextureData[i].ToSoftObjectPath()); } }
4.计时器
.h: FTimerHandle CountdownTimerHandle; .cpp: //事件委托 FTimerDelegate UpdateTextureDele = FTimerDelegate::CreateUObject(this, &AWelathActor::UpdateTexture); //每0.5秒执行一次事件委托 GetWorld()->GetTimerManager().SetTimer(CountdownTimerHandle, UpdateTextureDele, 0.5f, true); //停止运行定时器 GetWorldTimerManager().ClearTimer(CountdownTimerHandle);