UE4随笔 Landscape动态Attach之后没有碰撞怎么解决?

2024-06-16 02:48

本文主要是介绍UE4随笔 Landscape动态Attach之后没有碰撞怎么解决?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本帖纯属个人原创,如有转载请注明出处

很多时候需求是这样的,想达到场景中所有的Actor统一旋转的功能。纯代码无观赏性,大家有实际需求的自然能看懂。

接到这样的需求,大家就会想将所有的actor全部都attach到一个父节点上,编辑器中Landscape无法进行Attach, 并且InstancedFoliageActor场景中也没有。那么就需要我们在代码中动态的进行Attach。

下面的支点Actor就是父节点, RootActor。

//将LandscapeActor Attach到支点Actor
void LandscapeAttachToPivotActor();//将InstancedFoliage Attach到支点Actor
void InstancedFoliageAttachToPivotActor();//将LandscapeActor Attach到支点Actor
void USPDynamicDataComponent::LandscapeAttachToPivotActor()
{//Landscape类型的Actor比较特殊, 需要将这种类型的Actor代码挂接到支点Actor上//(为什么说比较特殊, 和其他的相比, 这种Actor不能看到子控件, 不能调整移动性, 故不能像其他Actor在编辑器中调整)//地形TArray<AActor*> LandScapesActors;UGameplayStatics::GetAllActorsOfClass(this, ALandscape::StaticClass(), LandScapesActors);for (auto LandScapeActor : LandScapesActors){//不处理level streaming的资源bool bLevelStreamingAssest = false;for (FName tag : LandScapeActor->Tags){bLevelStreamingAssest = tag.ToString().Contains("LevelStreamingAssest");BREAK_IF_TRUE(bLevelStreamingAssest);}if (bLevelStreamingAssest)continue;if (LandScapeActor->GetAttachParentActor() != SPPivotMeshActor){//线设置成Movable才可以attachint32 LandScapeComponentsNum = LandScapeActor->GetComponents().Array().Num();for (int j = 0; j < LandScapeComponentsNum; j++){UActorComponent* pAC = LandScapeActor->GetComponents().Array()[j];USceneComponent* pSC = Cast<USceneComponent>(pAC);if (!pSC) continue;pSC->SetMobility(EComponentMobility::Movable);}LandScapeActor->AttachToActor(SPPivotMeshActor, FAttachmentTransformRules::KeepWorldTransform);}}
}//将InstancedFoliage Attach到支点Actor
void USPDynamicDataComponent::InstancedFoliageAttachToPivotActor()
{//地表TArray<AActor*> InstancedFoliageActors;UGameplayStatics::GetAllActorsOfClass(this, AInstancedFoliageActor::StaticClass(), InstancedFoliageActors);AActor* pActor = nullptr;TArray<AActor*> LandScapesActors;UGameplayStatics::GetAllActorsOfClass(this, ALandscape::StaticClass(), LandScapesActors);if (LandScapesActors.Num() > 0){pActor = LandScapesActors[0];}else{pActor = SPPivotMeshActor;}for (auto InstancedFoliageActor : InstancedFoliageActors){if (InstancedFoliageActor->GetAttachParentActor() != pActor){int32 LandScapeComponentsNum = InstancedFoliageActor->GetComponents().Array().Num();for (int j = 0; j < LandScapeComponentsNum; j++){UActorComponent* pAC = InstancedFoliageActor->GetComponents().Array()[j];USceneComponent* pSC = Cast<USceneComponent>(pAC);if (!pSC) continue;pSC->SetMobility(EComponentMobility::Movable);}InstancedFoliageActor->AttachToActor(pActor, FAttachmentTransformRules::KeepWorldTransform);}}
}

通过上面的方法我们就能将地表和刷的植被附加到RootActor/ParentActor上了。

此时行走在LandScape上会发现地表并没有碰撞,通过如下方式解决即可。

//将LandscapeActor Detach从Actor, 为什么要Detach?这个地形不能从属其他actor, 否则没有碰撞
void LandscapeDetachToPivotActor();//将LandscapeActor Detach从Actor, 为什么要Detach?这个地形不能从属其他actor, 否则没有碰撞
void USPDynamicDataComponent::LandscapeDetachToPivotActor()
{TArray<AActor*> LandScapesActors;UGameplayStatics::GetAllActorsOfClass(this, ALandscape::StaticClass(), LandScapesActors);for (auto LandScapeActor : LandScapesActors){if (LandScapeActor->GetAttachParentActor() == SPPivotMeshActor){//相反attach不同的是, 需要先detach再设置静态FDetachmentTransformRules detachmentRules(EDetachmentRule::KeepWorld, false);LandScapeActor->DetachFromActor(detachmentRules);LandScapeActor->SetActorEnableCollision(true);int32 LandScapeComponentsNum = LandScapeActor->GetComponents().Array().Num();for (int j = 0; j < LandScapeComponentsNum; j++){UActorComponent* pAC = LandScapeActor->GetComponents().Array()[j];USceneComponent* pSC = Cast<USceneComponent>(pAC);if (!pSC) continue;pSC->SetMobility(EComponentMobility::Static);}}}
}

通过调用上面的方法,即可解决没有碰撞的问题,当我们需要实现旋转逻辑时, 调用Attach。当我们需要行走在地表上时,再调用Detatch逻辑。

下一篇写,如何巧妙的解决旋转整体模型带来的帧率下降。

希望能帮助到大家。谢谢。

这篇关于UE4随笔 Landscape动态Attach之后没有碰撞怎么解决?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065287

相关文章

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1