经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
UE4 C++ Tips
来源:cnblogs  作者:MichaelCen  时间:2018/11/20 10:37:56  对本文有异议

本篇写的是关于UE4的C++方面的小技巧:

1.在构造函数里

  1. //构建组件
  2. RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
  3. Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
  4. //把组件放到其它组件下
  5. VRCamera->SetupAttachment(VROrigin);
  6. //下面这条不能用于构造函数中,否则编辑器崩溃或报错
  7. //VRCamera->AttachToComponent(VROrigin, FAttachmentTransformRules::SnapToTargetIncludingScale);

2.加载资源

具体细节教程(非本人制作):https://ke.qq.com/course/308721

  1. //同步加载,一般用于少量物体加载
  2. //从内存中读取文件,但由于还没从硬盘中读取,所以内存中没有(耗时相对较短),因此读取失败
  3. UHapticFeedbackEffect_Base* ShakeEffect = FindObject<UHapticFeedbackEffect_Base>(NULL,TEXT("HapticFeedbackEffect_Curve'/Game/VirtualRealityBP/Blueprints/MotionControllerHaptics.MotionControllerHaptics'"));
  4. //从硬盘中读取文件,放到内存中(耗时相对较长)
  5. UHapticFeedbackEffect_Base* ShakeEffect = LoadObject<UHapticFeedbackEffect_Base>(NULL,TEXT("HapticFeedbackEffect_Curve'/Game/VirtualRealityBP/Blueprints/MotionControllerHaptics.MotionControllerHaptics'"));

  6. .h:
    FStreamableManager* WealthLoader;
    TSharedPtr<FStreamableHandle> WealthHandle;

    .cpp:
    //异步加载,一般用于大量物体加载
  7. void AWelathActor::StreamableManagerOperate()
  8. {
  9. //创建加载管理器
  10. WealthLoader = new FStreamableManager();
  11. //执行异步加载,添加资源链接数组和加载完成回调函数,其中TexturePath为加载内容的地址
  12. WealthHandle = WealthLoader->RequestAsyncLoad(TexturePath, FStreamableDelegate::CreateUObject(this,
  13. &AWelathActor::StreamableManagerLoadComplete));
  14. }
  15. void AWelathActor::StreamableManagerLoadComplete()
  16. {
  17. //加载完成后动态修改图片
  18. TArray<UObject* >OutObjects;
  19. WealthHandle->GetLoadedAssets(OutObjects);
  20. for (int32 i = 0; i < OutObjects.Num(); ++i)
  21. {
  22. UTexture2D* WorkTexture = Cast<UTexture2D>(OutObjects[i]);
  23. if (WorkTexture)
  24. {
  25. TextureGroup.Add(WorkTexture);
  26. }
  27. }
  28. }

3.通过UObjectLibrary获取批量内容的地址

  1. .h:
  2. class UObjectLibrary* ObjectLibrary;
  3. .cpp:
  4. void AWelathActor::ObjectLibraryOperate()
  5. {
  6. if (!ObjectLibrary)
  7. {
  8. ObjectLibrary = UObjectLibrary::CreateLibrary(UObject::StaticClass(), false, false);
  9. //添加到根那,防止被UE4的垃圾回收机制干掉
  10. ObjectLibrary->AddToRoot();
  11. }
  12. //搜索所有Texture的路径
  13. ObjectLibrary->LoadAssetDataFromPath(TEXT("/Game/Resource/UI/Texture/MenuTex"));
  14. TArray<FAssetData> TextureData;
  15. ObjectLibrary->GetAssetDataList(TextureData);
  16. for (int32 i=0; i<TextureData.Num(); ++i)
  17. {
  18. TexturePath.AddUnique(TextureData[i].ToSoftObjectPath());
  19. }
  20. }

4.计时器

  1. .h:
  2. FTimerHandle CountdownTimerHandle;
  3. .cpp:
  4. //事件委托
  5. FTimerDelegate UpdateTextureDele = FTimerDelegate::CreateUObject(this, &AWelathActor::UpdateTexture);
  6. //每0.5秒执行一次事件委托
  7. GetWorld()->GetTimerManager().SetTimer(CountdownTimerHandle, UpdateTextureDele, 0.5f, true);
  8. //停止运行定时器
  9. GetWorldTimerManager().ClearTimer(CountdownTimerHandle);

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号