首页 > 编程语言 >Unreal Engine 大象无形学习笔记 (第一部分:虚幻C++编程)

Unreal Engine 大象无形学习笔记 (第一部分:虚幻C++编程)

时间:2023-05-14 18:00:14浏览次数:60  
标签:Engine UObject ImageWrapper C++ GetWorld 继承 大象无形 Unreal Texture

Q1. 什么时候继承自UObject类,什么时候声明纯C++类?

UObject自带功能:

1. 垃圾收集:继承自UObject并被标记为UProperty的变量,会被引擎自动进行生命周期管理。

2. Reference updating 引用自动更新

3. 反射

4. 序列化:纯C++类也可以手动实现

5. Automatic updating of default property changes 自动检测默认变量的更改

6. Automatic property initialization 自动变量初始化

7. Automatic editor integration 编辑器自动交互:在Editor里可直接编辑

8. Type information available at runtime 运行时类型识别 :Cast<>

9. 网络复制:在引擎加载阶段创建Default Object,构造函数被调用时,UWorld不一定存在,GetWorld()返回值可能为空!

Q2. 什么时候继承自Actor类?

需要挂载组件时。

Q3. 什么时候继承Pawn类,什么时候继承Character类?

需要移动组件继承Character类,不需要移动逻辑,比如飞船,继承Pawn类。

Q4. 怎么创建纯C++类并被UE识别?

1. 创建你的.h和.cpp文件,如果你是第一种文件结构,.h文件放在public文件夹内,.cpp文件放置在private文件夹内。 2. 在.h中声明你的类:如果你的类继承自UObject,你的类名上方需要加入UCLASS()宏。同时,你需要在类体的第一行添加GENERATED_UCLASS_BODY()宏,或者GENERATED_BODY()宏。前者需要手动实现一个带有const FObject Initializer&参数的构造函数。后者需要手动实现一个无参数构造函数。注意笔者说的是“实现”而非声明。 3. 在你的.cpp文件中,包含当前模块的PCH文件。一般是模块名+private PCH.h。如果是游戏模块,有可能包含的是游戏工程名.h。 4. 编译。 Q5. UE命名规则有哪些,怎么创建、获取、销毁各种类型的对象? F 纯C++类
前缀 类型 创建对象 获取对象 内存管理
F 纯C++类 new  

delete

普通指针转换智能指针:

TSharedPtr<YourClass> YourClassPtr = MakeShareable(new YourClass());

U 继承自UObject,但不继承自Actor NewObject<T>()   自动垃圾回收,通过AddToRoot不被回收
A 继承自Actor GetWorld()->SpawnActor<ActorClass>()

for (TActorIterator<AStaticMeshActor> ActorIter(GetWorld()); ActorIter; ++ActorIter)
{
UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("%s"), *ActorIter->GetName()));
}

 

TArray<AActor*> OutActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AStaticMeshActor::StaticClass(), OutActors);
for (AActor* actor : OutActors)
{
UKismetSystemLibrary::PrintString(GetWorld(), actor->GetName());
}

 

static void GetAllActorsWithTag(const UObject* WorldContextObject, FName Tag, TArray<AActor*>& OutActors);

 

static void GetAllActorsWithInterface(const UObject* WorldContextObject, TSubclassOf<UInterface> Interface, TArray<AActor*>& OutActors);

 

APlayerController* playerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);

 

APlayerController* playerController = GetWorld()->GetFirstPlayerController();

 

APawn* myPawn = Cast<ADrone>(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));

 

APawn* myPawn = GetWorld()->GetFirstPlayerController()->GetPawn();

 

ACharacter* myPawn = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);

 

ACharacter* myPawn = GetWorld()->GetFirstPlayerController()->GetCharacter();

Destory()  只是从世界中销毁,内存还是系统自动回收

S Slate控件相关类 SNew    
H HitResult相关类      
Q6. 蓝图怎么调用C++? 注册变量到蓝图中:UPROPERTY(BlueprintReadWrite,VisibleAnyWhere,Category="Object") 注册函数到蓝图中:UFUNCTION(BlueprintCallable,Category="Test")   //BlueprintImplementEvent 表示由蓝图的子类实现   BlueprintNativeEvent C++默认实现可被蓝图重载,需要提供一个“函数名_Implement”函数实现于CPP中

Q7. 怎么获取游戏路径?

FPath::GameDir() //游戏根目录
FPath::FileExists() //判断文件是否存在
FPath::ConvertRelativePathToFull() //相对路径转换为绝对路径

Q8. XML与JASON怎么序列化与反序列化?

XML Parse工具:FastXML、FXmlFile

Q9.文件操作

获取路径:FPaths

读写:FPlatformFileManager

配置文件:写:GConfig->SetString();  读:GConfig->GetString();  刷新缓冲区,马上生效:GConfig->Flush();

Q10. 怎么输出UE日志?

怎么查看LOG?打包后需要在启动参数加-log,编辑器运行需要打开Window->DeveloperTools->OutputLog

语法:UE_LOG(LogMy,Warning,TEXT("show a string:%s"),*FString("test"));

日志类型 输出颜色
Log 灰色
Warning 黄色
Error

红色

Q11. 怎么自定义Category?

将以下定义放在被多数源文件引用的文件里

DEFINE_LOG_CATEGORY_STATIC(LogMyCategory,Warning,All);

Q12. 虚幻引擎有哪些字符串类?

类型 特点
FName 数据结构是哈希表,所以是唯一的,大小写不敏感,不可修改
FText 数据结构是查找表,内置本地化支持,用作被显示的字符串,不可修改
FString 可修改

Q13. 虚幻引擎怎么跨平台?

平台相关工具函数类:FPlatformMisc 

eg. typedef FLinuxPlatformMisc FPlatformMisc; 

Q14. 怎么转换图片类型?

图片压缩后的数据:CompressedData

图片RGBA数据无压缩:RawData

ImageWrapper = CompressedData + RawData

怎么读取硬盘里的贴图?

 1 UTexture2D * FSystemToolsPublic::LoadTexture2DFromBytesAndExtension(const FString& ImagePath , uint8* InCompressedData ,int32 InCompressedSize ,int32 & OutWidth,int32 & OutHeight)
 2 {
 3     UTexture2D * Texture = nullptr;
 4     IImageWrapperPtr ImageWrapper = GetImageWrapperByExtention(ImagePath);
 5     if (ImageWrapper.IsValid() && ImageWrapper ->SetCompressed(InCompressedData , InCompressedSize))//读取压缩后的图片数据
 6     {
 7         const TArray <uint8>* UncompressedRGBA = nullptr;
 8         if (ImageWrapper ->GetRaw(ERGBFormat::RGBA, 8,UncompressedRGBA))//获取原始图片数据
 9         {
10             Texture = UTexture2D::CreateTransient(ImageWrapper ->GetWidth(), ImageWrapper ->GetHeight(), PF_R8G8B8A8);
11             if (Texture != nullptr)
12             {
13                 //通过内存复制,填充原始RGB数据到贴图的数据中
14                 OutWidth = ImageWrapper ->GetWidth();
15                 OutHeight = ImageWrapper ->GetHeight();
16                 void * TextureData = Texture->
17                 PlatformData ->Mips[0].BulkData.
18                 Lock(LOCK_READ_WRITE);
19                 FMemory::Memcpy(TextureData,
20                 UncompressedRGBA ->GetData(),
21                 UncompressedRGBA ->Num());
22                 Texture->PlatformData ->Mips[0].
23                 BulkData.Unlock();
24                 Texture->UpdateResource();
25             }
26         }
27     }
28     return Texture;
29 }
30 UTexture2D * FSystemToolsPublic::LoadTexture2DFromFilePath(FString & ImagePath,int32 & OutWidth,int32 & OutHeight)
31 {
32     //文件是否存在     
33     if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*ImagePath))
34     {
35         return nullptr;
36     }
37     //读取文件资源
38     TArray <uint8 > CompressedData;
39     if (!FFileHelper::LoadFileToArray(CompressedData , *ImagePath))
40     {
41         return nullptr;
42     }
43     return LoadTexture2DFromBytesAndExtension(ImagePath,CompressedData.GetData(), CompressedData.Num(), OutWidth,OutHeight);
44 }               

 

标签:Engine,UObject,ImageWrapper,C++,GetWorld,继承,大象无形,Unreal,Texture
From: https://www.cnblogs.com/tomatokely/p/17187501.html

相关文章

  • 2023 开源之夏来啦!报名 MegEngine 项目,赢取万元奖金!
    “开源软件供应链点亮计划-暑期2023”是一项面向高校学生的暑期活动,为高校学生提供了绝佳的、友好开放的交流平台。使学生可以真正投身于开源软件的开发维护,得到资深开源软件开发者指导的机会,获得丰硕的活动奖金,并帮助学生获取优秀企业的关注。活动流程同学们在6月4日之前在......
  • ArcEngine出图|相关代码
    ①数据源修复IMapDocumentmapDoc=newMapDocumentClass();mapDoc.Open(mxdPath);IDataSourceHelperMapDocumenthelpler=newDataSourceHelperClass();helpler.FindAndReplaceWorkspaceNamePath(mapDoc,oldpath,mdbPath,true);//oldpath为打开的mxd模板中加载的层的......
  • TSBS 是什么?为什么时序数据库 TDengine 会选择它作为性能对比测试平台?
    去年8月我们在TDengine开发者大会上正式发布了TDengine3.0,TDengine也由此升级成为了一款云原生时序数据库(TimeSeriesDatabase,TSDB)。为了客观、准确、有效地评估TDengine3.0的性能指标,我们决定使用TSBS(TimeSeriesBenchmarkSuite)作为基准性能测试平台,针对DevOps......
  • MSBuild是 Microsoft Build Engine
    MSBuild是MicrosoftBuildEngine的缩写,代表Microsoft和VisualStudio的新的生成平台。MSBuild在如何处理和生成软件方面是完全透明的,使开发人员能够在未安装VisualStudio的生成实验室环境中组织和生成产品。MSBuild引入了一种新的基于XML的项目文件格式,这种格式容......
  • 用最低成本实现高性能写入、查询、存储,揭秘 TDengine 技术实现逻辑
    从《写入性能:TDengine最高达到InfluxDB的10.3倍,TimeScaleDB的6.74倍》、《查询性能:TDengine最高达到了InfluxDB的37倍、TimescaleDB的28.6倍》两篇文章中,我们发现,TDengine(TimeSeriesDatabase)不仅在写入和查询性能上超越了InfluxDB和TimescaleDB,在数据处理过......
  • 从建模思路看 MySQL 和 TDengine 哪个更适合处理量化交易场景下的海量时序数据
    在“量化投资分析”场景中,系统需要从数据接口、网络上等各个地方获取证券的信息,其中往往以“实时的价格变动信息”为主要数据,然后再对这些数据进行实时的分析与存储,供盘中和盘后使用。某企业遇到的问题如下:“我们要对500个证券品种进行监控,在开盘时,每5秒会更新一次价格数据。这......
  • Ubuntu 安装 Docker Engine 并配置用户权限
    1.删除旧版本Docker,没有可以跳过sudoapt-getremovedockerdocker-enginedocker.iocontainerdrunc2.更新apt包索引并安装包,以允许apt通过HTTPS使用存储库sudoapt-getupdatesudoapt-getinstallca-certificatescurlgnupg3.使用以下命令设置存储库echo\"d......
  • 230501 TI - Engineer It - How to test power supplies - Overview
    Hi,I'mBobHanrahan,ApplicationEngineeringatTexasInstruments.Thisisthefirstonaseriesontestingpowersupplies.We'llbetalkingaboutsomeofthebasictests,notall,butthebasictestsneededtoensureareliablepowersupply.......
  • Unreal-GAS-2-AttributeSet
    这篇随笔用于忘记AttributeSet是什么后快速想起来和上手AttributeSet属性集是表示Actor各种属性值的集合,保存在ASC中,是GE的主要作用目标比如继承一个AttributeSet后新建公有成员变量:UPROPERTY(BlueprintReadOnly,Category="Health",ReplicatedUsing=OnRep_Health)FGam......
  • 4、题目:Creativity in Electrical Engineering Degree Programs: Where Is the Conten
    期刊信息(1)作者:Adams,Scott(2)期刊:IEEETransactionsonEducation,2019/11,62-4:288-296(3)DOI:10.1109/TE.2019.2912834(4)ISSN:0018-9359(5)IF:2.74(Q2)研究背景先前的研究表明,工程教学大纲中包含创造力培养,课堂活动通常受到限制。学生可能认为教育工作者不重视......