UE4电梯案例

创建一个elevator蓝图,创建一个cubemesh ,添加碰撞体盒子boxcollision,

创建函数(gravity fun)重力函数来模拟角色上电梯时电梯有个缓冲动作——上下运动。

gravity fun:先获取elevator的高度进行判断,是否等于最高高度:

true:电梯在最高高度,当角色进入电梯,电梯向下运动80米用lerp过度这个下降和上升的过程,

lerp的alpha就是这时过度曲线

false:电梯不在最高高度,及在最初是的位置,角色跳入到电梯电梯触发机制,,该过程同样得用lerp函数来过度。

lerp函数的alph值需在外部输入所以给gravityfun赋予input上alpha变量。

在电梯蓝图上给boxcollision添加on component begin overlap(box)和om component end overlap(box)事件,

当物体与电梯发生碰撞时执行on component begin overlap,先给alpha赋予变量曲线,用timeline函数编辑合理曲线,当执行了gravity fun函数后也就是alpha曲线结束后,角色就可以按1键使电梯向上,这时用到enable input链接gate(门) 按 1 enter gate 后 ,也就是说当角色刚上到电梯时gravity结束后可以open gate,当角色离开电梯时执行on component end overlap 使gate 变到close。

但角色按1时电梯上升,电梯上升用到set relativelocation 设置z(高度的变化)而高度的变化用到line tine时间线和lerp过度实现上下。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个使用异步任务的案例代码,可以用来加载大型纹理资源: ```cpp class FAsyncTextureLoaderTask : public FNonAbandonableTask { public: FAsyncTextureLoaderTask(UTexture2D* InTexture, const FString& InFilePath) : Texture(InTexture), FilePath(InFilePath) {} FORCEINLINE TStatId GetStatId() const { RETURN_QUICK_DECLARE_CYCLE_STAT(FAsyncTextureLoaderTask, STATGROUP_ThreadPoolAsyncTasks); } void DoWork() { // 加载纹理资源 TArray<uint8> RawFileData; if (!FFileHelper::LoadFileToArray(RawFileData, *FilePath)) { UE_LOG(LogTemp, Error, TEXT("Failed to load texture file: %s"), *FilePath); return; } // 创建纹理资源 FCreateTexture2DParameters Params; Params.bUseFullPrecision = true; Params.bSRGB = true; Params.bDeferCompression = true; Params.CompressionSettings = TC_VectorDisplacementmap; Params.NumMips = 0; Params.bAsyncCreate = true; Texture->PlatformData = new FTexturePlatformData(); Texture->PlatformData->SetNumSlices(1); Texture->PlatformData->SetPixelFormat(PF_R8G8B8A8); TArray<uint8>* MipData = &RawFileData; FUpdateTextureDataRegion2D Region(0, 0, 0, 0, Texture->GetSizeX(), Texture->GetSizeY()); Texture->UpdateTextureRegions(0, 1, &Region, Texture->GetSizeX() * 4, 4, MipData->GetData(), Params); // 压缩纹理资源 Texture->CompressionSettings = TC_VectorDisplacementmap; Texture->MipGenSettings = TMGS_NoMipmaps; Texture->SRGB = true; Texture->UpdateResource(); UE_LOG(LogTemp, Log, TEXT("Texture loaded successfully: %s"), *FilePath); } private: UTexture2D* Texture; FString FilePath; }; void LoadTextureAsync(UObject* InWorldContextObject, UTexture2D* InTexture, const FString& InFilePath) { // 创建异步任务 FAsyncTask<FAsyncTextureLoaderTask>* Task = new FAsyncTask<FAsyncTextureLoaderTask>(InTexture, InFilePath); // 开始异步任务 Task->StartBackgroundTask(); } ``` 这个代码演示了如何使用异步任务加载纹理资源,并在后台线程中进行解析和创建。需要注意的是,在启动异步任务时使用了`StartBackgroundTask()`方法,这个方法会将任务提交到线程池中执行。同时,为了避免线程间的竞争和冲突,必须保证纹理资源的创建和压缩是原子操作,不会被其他线程干扰。 希望这个案例可以帮助你更好地理解UE4多线程的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值