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

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解