设为首页 加入收藏

TOP

UE4 C++ Tips
2018-11-19 22:13:09 】 浏览:274
Tags:UE4 Tips

本篇写的是关于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);

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇书上关于*(p++)表达式的几种变形.. 下一篇奥赛-欧几里得算法-最大公约数

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目