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

相关文章

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.