本篇写的是关于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'"));
.h:
FStreamableManager* WealthLoader;
TSharedPtr<FStreamableHandle> WealthHandle;
.cpp:
//异步加载,一般用于大量物体加载- 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);