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

相关文章

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

豆包 MarsCode 不允许你还没有女朋友

在这个喧嚣的世界里,爱意需要被温柔地唤醒。为心爱的她制作每日一句小工具,就像是一场永不落幕的浪漫仪式,每天都在她的心田播撒爱的种子,让她的每一天都充满甜蜜与期待。 背景 在这个瞬息万变的时代,我们都在寻找那些能让我们慢下来,感受生活美好的瞬间。为了让这份浪漫持久而深刻,我们决定为女朋友定制一个每日一句小工具。这个工具会在她意想不到的时刻,为她呈现一句充满爱意的话语,让她的每一天都充满惊喜和感动

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d