当前位置: 首页 > news >正文

UE C++ 实时加载模型的总结

一.总体思路:

如果实时加载UE模型,需要先将之前的模型删除。再生成出来,放在根节点,保持相对位置,相对的俯仰角。

void AAirForce::LoadWeapon(int ID, int Type, double X, double Y, double Z)
{//m_weaponMap.Empty();//生成工厂if (m_weaponMap.Contains(ID)){AActorBase* ab =Cast<AActorBase>(*m_weaponMap.Find(ID));if (ab != nullptr && ab->IsValidLowLevel() && !ab->IsPendingKill()){ab->Destroy();}m_weaponMap.Remove(ID);}ATargetFactory* TargetFactory = GetWorld()->SpawnActor<ATargetFactory>();//FString tmpWeaponPath = UKismetSystemLibrary::GetProjectDirectory() + "Plugins/HMSCore/Saved/Config/" + "AG_300M" + ".Json";FString tmpWeaponPath = UKismetSystemLibrary::GetProjectDirectory() + "Plugins/HMSCore/Saved/Config/" + m_WeaponType[Type] + ".Json";AActorBase* TargetActor = TargetFactory->TargetSpawn(ETargetType::WEAPON_TYPE, tmpWeaponPath);TargetActor->SetID(ID);TargetActor->AttachToComponent(Cast<USceneComponent>(RootComponent), FAttachmentTransformRules::KeepRelativeTransform);TargetActor->SetActorRelativeLocation(FVector(X, Y, Z));//UE_LOG(LogTemp, Warning, TEXT("%f, %f , %f"), it.PositionX, it.PositionY, it.PositionZ);TargetActor->SetActorRelativeRotation(FRotator(0, 0, 0));TargetActor->SetScale(FVector(1, 1, 1));m_weaponMap.Add(ID, TargetActor);TargetFactory->Destroyed; 
}

二.管理Map

TMap<int, UObject*>	m_weaponMap;	//组件字典

首先看武器的Map里是否,包含之前加载的武器模型。如果包含这个ID的武器。找到并拿到它,销毁。然后在Map里移除这个指针。

	if (m_weaponMap.Contains(ID)){AActorBase* ab =Cast<AActorBase>(*m_weaponMap.Find(ID));if (ab != nullptr && ab->IsValidLowLevel() && !ab->IsPendingKill()){ab->Destroy();}m_weaponMap.Remove(ID);}

重新生成,m_WeaponType在构造时初始化,工厂然后通过,工厂生成武器。

	TMap<int32, FString> m_WeaponType;  //武器字典2321F
ATargetFactory* TargetFactory = GetWorld()->SpawnActor<ATargetFactory>();
//FString tmpWeaponPath = UKismetSystemLibrary::GetProjectDirectory() + "Plugins/HMSCore/Saved/Config/" + "AG_300M" + ".Json";
FString tmpWeaponPath = UKismetSystemLibrary::GetProjectDirectory() + "Plugins/HMSCore/Saved/Config/" + m_WeaponType[Type] + ".Json";
AActorBase* TargetActor = TargetFactory->TargetSpawn(ETargetType::WEAPON_TYPE, tmpWeaponPath);

武器生成后,就可以了,然后销毁工厂。

设置ID,让它们绑定到组件上,将根组件变为USceneComponet组件,就有位置信息。

AttachToComponent(USeneComponnet,FAttachmentTransformRules::KeepRelativeTransform).

让后设置相对于根节点的相对位置。

TargetActor->SetID(ID);TargetActor->AttachToComponent(Cast<USceneComponent>(RootComponent), FAttachmentTransformRules::KeepRelativeTransform);TargetActor->SetActorRelativeLocation(FVector(X, Y, Z));//UE_LOG(LogTemp, Warning, TEXT("%f, %f , %f"), it.PositionX, it.PositionY, it.PositionZ);TargetActor->SetActorRelativeRotation(FRotator(0, 0, 0));TargetActor->SetScale(FVector(1, 1, 1));m_weaponMap.Add(ID, TargetActor);TargetFactory->Destroyed; 

如果想要不在跟组件上,就使用如下代码。

			int WeaponID = FCString::Atoi(*it.NodeID);TargetActor->SetID(WeaponID);if (m_childComponentMap.Contains(it.ParentName))TargetActor->AttachToComponent(Cast<USceneComponent>(m_childComponentMap[it.ParentName]), FAttachmentTransformRules::KeepRelativeTransform);elseTargetActor->AttachToComponent(Cast<USceneComponent>(RootComponent), FAttachmentTransformRules::KeepRelativeTransform);TargetActor->SetActorRelativeLocation(FVector(it.PositionX, it.PositionY, it.PositionZ));UE_LOG(LogTemp, Warning, TEXT("%f, %f , %f"), it.PositionX, it.PositionY, it.PositionZ);TargetActor->SetActorRelativeRotation(FRotator(it.RotationPitch, it.RotationYaw, it.RotationRoll));TargetActor->SetScale(FVector(it.ScaleX, it.ScaleY, it.ScaleZ));m_weaponMap.Add(WeaponID, TargetActor);

删除map,可以用for(auto& it:Map).逐个Destroy。再Reset重置。

void HMSTargetManager::RemoveTarget(int targetID)
{AActorBase* ab = *m_TargetMap.Find(targetID);if (ab != nullptr){ab->Destroy();}m_TargetMap.Remove(targetID);
}void HMSTargetManager::RemoveAllTarget()
{for (auto& it:m_TargetMap){AActorBase* ab = it.Value;if (ab != nullptr){ab->Destroy();}}m_TargetMap.Reset();
}


http://www.mrgr.cn/news/45645.html

相关文章:

  • 101 公司战略的基本概念
  • 【物流配送中心选址问题】基于改进粒子群算法
  • dotnet7==windows ZIP方式安装和web demo和打包
  • SpringBoot Jar 包加密防止反编译
  • C语言-文件IO
  • 『网络游戏』Tips弹窗队列【10】
  • 头歌实践教学平台 大数据编程 实训答案(二)
  • Python 数据结构与算法全攻略:带你从新手速变高手
  • MARL多智能体强化学习
  • 【微服务】网关 - Gateway(下)(day8)
  • 【计算机网络】Tcp/IP五层协议,Udp报文组成,Udp与Tcp的区别
  • 微知-如何临时设置Linux系统时间?(date -s “2024-10-08 22:55:00“, time, hwclock, timedatectl)
  • 『网络游戏』窗口基类【06】
  • 暴力目前98%-----找数字
  • 【JavaEE】【多线程】Thread类讲解
  • MyBatis 框架学习研究笔记(一) 简化数据库操作:MyBatis-Plus 的魔法世界
  • 【题解】【模拟】—— [NOIP2013 普及组] 表达式求值
  • HTTP协议:连接世界的语言 —— Python中的实践与探索
  • 【数学二】中值定理、不等式与零点问题-中值定理-费马定理、罗尔定理、拉格朗日中值定理、柯西中值定理、泰勒公式、麦克劳林公式
  • 渐开线起始圆和基圆之间有约束关系吗?