UE中对象创建方法示例和类的理解

对象创建方法示例集

        创建Actor示例

//创建一个护甲道具
AProp* armor = GetWorld()->SpawnActor<AProp>(pos, rotator); 

        创建Component示例

UCapsuleComponent* CapsuleComponent = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComponent"));

        创建加载资源对象示例

UStaticMesh* chairMesh = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(),  NULL,  TEXT("/Game/Assets/Props/StaticMeshe/ChairMesh")));  UStaticMeshComponent* StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));  
StaticMesh ->SetStaticMesh(chairMesh);

        创建UObject示例

UItemBase* ItemCopy = NewObject<UItemBase>(StaticClass());

        在上面的创建加载资源对象和UObject示例中都出现了StaticCalss()方法,下面就说说相关的内容。

关于StaticClass、GetClass和ClassDefaultObject

UClass和反射

        什么是反射?

反射的作用是在不知道这个类的情况下获取到它的信息 。

        UC++底层实现了一套反射机制。

        先看C#怎么用反射:

string s = "Hello,guys!”;
Type t = s.GetType();

        Type里面就包含了string这个类的各种信息。

UClass就是C#里的Type。

        UClass和C#里的Type的作用不完全相同,可以这么理解。

GetClass()

        GetClass() 类似C#的GetType。        

类静态方法获取StatiClass

UClass* PropUClass = APropArmor::StaticClass();

 如何知道一个UClass和另一个UClass是不是继承关系? 

        UClass存储了它要描述的类的父类的StaticClass。 举例说明:假如有个MyActor类的UClass,想知道MyActor是不是UObject的子类,可以这么做:

  • 调用UObject::StaticClass()
  • 拿到MyActor的UClass存储的MyActor的父类的StaticClass也就是Actor的StaticClass
  • 比较Actor的StaticClass和UObject的StaticClass是不是相等
  • 发现不相等,这次我拿Actor的StaticClass(因为它也是一个UClass)里存的Actor父类的StaticClass也就是UObject的StaticClass,然后比较,发现相等,返回true
  • 如果我发现不相等,我就一直比,比到最后没有父类,返回false

上面这段逻辑就是UClass的IsChildOf的实现原理。调用IsChildOf的时候传入泛型:

这是具体实现。UStruct是UClass父类。

GetSuperStruct()就是返回它存储的父类的StaticClass。

顺带再讲一下IsA这个函数,功能和IsChildOf一样,不同的是IsChildOf给UClass用的,IsA是给UObject对象实例用的,比如想知道一个MyActor实例是不是UObject的子类:

//myActor是MyAcor*类型
bool result = myActor->IsA<UObject>();

ClassDefaultObject

        ClassDefaultObject(简称CDO),类默认对象。

通过CDO我可以拿到一个UObject初始化时的值。

        虽然CDO有个Default默认,但是用默认去描述它的功能不是很准确。回到我们创建的类MyActor,给它添加一个外部可以修改变量testIntValue,默认值1:

        对于两个蓝图分别修改,一个20,另一个10:

        然后在BeginPlay写下测试代码:

//先修改值再获取ClassDefaultObject
testIntValue = -1;
auto defaultInt = GetClass()->GetDefaultObject<AMyActor>()->testIntValue;
UE_LOG(LogTemp, Warning, TEXT("DefaultObject int: %d"), defaultInt);

        最后打印的结果是一个20,一个10。
        如果想拿到代码里给它设的默认值1要用StaticClass

auto staticDefaultInt = AMyActor::StaticClass()->GetDefaultObject<AMyActor>()->testIntValue;
//打印1
UE_LOG(LogTemp, Warning, TEXT("StaticDefaultObject int: %d"), staticDefaultInt);

总结

  • UClass。存储类信息,用于反射。把它当成C#的Type来理解。
  • GetClass()。获得一个UObject实例的UClass,是UObject成员函数。
  • GetStaticClass()。不需要有实例就能获得UClass。是静态的,每次调用返回相同结果。
  • ClassDefaultObject。类默认对象,可以获得UObject初始化时的值。注意GetClass()->GetDefaultObject()和T::StaticClass()->GetDefaultObject()不一样。

参考链接:Unreal Engine 4 C++ 创建对象的几种方法_uec++创建对象-CSDN博客

参考链接:【UE·底层篇】一文搞懂StaticClass、GetClass和ClassDefaultObject - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化报告pptx-python|高效通过PPT模版制造报告(三)

这是自动化报告学习的第三篇了,其他系列: 自动化报告的前奏|使用python-pptx操作PPT(一)自动化报告pptx-python|如何将pandas的表格写入PPTX(二)自动化报告pptx-python|高效通过PPT模版制造报告(三)自动化报告pptx-python|pptx 分析报告的工具包:reportgen(四)本…

C++泛型编程:模板偏特化

模板偏特化为模板提供特殊的实现&#xff0c;针对特定的模板参数或参数组合。 在模板全特化&#xff0c;所有的模板参数都被指定了具体的类型。 我们可以在泛化设计中提供一个特化版本&#xff0c;针对其中某个或者数个模板参数进行特化&#xff0c;我们可以指定一部分模板参…

Langchain ZERO_SHOT_REACT_DESCRIPTION的使用

ZERO_SHOT_REACT_DESCRIPTION 不能记住历史对话&#xff1a; import ChatGLM from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_community.tools.tavily_search import TavilySearchResults…

【C#】创建Json文件并根据dll路径获取

创建Json文件 更改属性 【代码】根据dll路径获取 Assembly assembly Assembly.GetExecutingAssembly(); string assemblyPath assembly.Location; string relativeDllPath System.IO.Path.Combine(System.IO.Path.GetDirectoryName(assemblyPath), "Json\\test.json&q…

liunx服务器下vim无法:wq解决方案

当你vim某一个文件是&#xff0c;由于其他人在操作&#xff0c;或者上次操作中断&#xff0c;造成的 解决方案&#xff0c;不要&#xff0c;vim -r /etc/****&#xff0c;不然你会得到 正确方案 然后在&#xff0c;直接sudo vim /ect/xxx&#xff0c;还出现第一幅图就直接选…

三、特征提取、特征预处理

三、特征提取、特征预处理 1_特征提取1.1 统计学特征1.2 时域1.3 频域1.4 其他EEG特殊特征 2_特征提取预处理&#xff08;理论及Python实现&#xff09;2.1 归一化2.2 标准化2.3 特征二值化2.4 特征编码2.5 缺失值处理2.6 样本不平衡问题 1_特征提取 1.1 统计学特征 1.2 时域…

LabVIEW高精度微小电容测量

LabVIEW高精度微小电容测量 在电子工程和科研领域&#xff0c;精确测量微小电容值是一项有一定要求的任务&#xff0c;尤其在涉及到高精度和低成本时。设计了一种基于LabVIEW高精度微小电容测量系统&#xff0c;旨在提供一个既经济又高效的解决方案。 该系统的核心在于使用FD…

【Python】ECC加密

ECC加密 .全称&#xff1a;椭圆曲线加密&#xff08;Elliptic Curve Cryptography&#xff09;&#xff0c;ECC加密算法是一种公钥加密技术&#xff0c;以椭圆曲线理论为基础。利用有限域上椭圆曲线的点构成的Abel群离散对数难解性&#xff0c;实现加密、解密和数字签名。将椭圆…

陪诊系统|陪诊小程序|陪诊服务让就医更容易

陪诊系统已经出现了好几年。尤其是这两年&#xff0c;它得到了人们的广泛认可。陪诊行业的快速发展主要是因为人们对这个行业的需求非常大。目前&#xff0c;我国面临着严重的老龄化问题&#xff0c;生活节奏也越来越快&#xff0c;有时候无法亲自陪伴在老人的身边。陪诊工作人…

openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志

文章目录 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志215.1 性能日志概述215.2 性能日志收集的配置参数 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志 215.1 性能日志概述 性能日志主要关注外部资源的访问性能问题。 性能日…

re:从0开始的CSS学习之路 4. 长度单位

1. 长度单位 像素px&#xff1a;一个像素就是屏幕中一个不可分割的点。我们应用的屏幕实际上是由一个个的像素点构成的。 不同显示器的像素点大小也不同&#xff0c;在屏幕尺寸相同的情况下&#xff0c;像素越小&#xff0c;显示效果越清晰。 大部分浏览器默认字体大小是16px …

记录一次centos 使用selenium运行环境

这里写自定义目录标题 宝塔面板 安装 selenium安装google-chrome 宝塔面板 安装 selenium 安装google-chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本 google-chrome --version 下载对应chrome版本的chro…

VScode上无法运行TSC命令,Typescript

如何解决问题 第一步&#xff1a;使用 winx 快捷键&#xff0c;会出现如下弹窗&#xff0c;鼠标左键单击Windows PowerShell 即可打开shell 第二步&#xff1a;运行 set-ExecutionPolicy RemoteSigned 命令&#xff0c;在询问更改执行策略的时候选择敲Y或者A 第三步&#xff…

技术分享 | MySQL 的几种数据迁移方案

1需求背景 应用侧的同学需要对数据进行导出和导入&#xff0c;于是跑来找 DBA 咨询问题&#xff1a;MySQL 如何导入大批量的数据&#xff1f; 应用侧目前的方式&#xff1a; mysqldump 工具 select outfile 语句 图形化管理工具&#xff08;MySQL Workbench、Navicat 、DBe…

【C语言初阶-结构体】关于结构体的声明定义、结构体传参详解

目录 1. 结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2. 结构体成员的访问 2.1(.)操作符 2.2&#xff08;->&#xff09;操作符 3.结构体传参 1. 结构体的声明 1.1 结构的基础知识 结构体是一些值的集合&…

uniapp vue3怎么调用uni-popup组件的this.$refs.message.open() ?

vue2代码 <!-- 提示信息弹窗 --><uni-popup ref"message" type"message"><uni-popup-message :type"msgType" :message"messageText" :duration"2000"></uni-popup-message></uni-popup>typ…

算法笔记刷题日记——3.简单入门模拟 3.2 查找元素

刷题日记 3.2 查找元素 B1041 B1004 B1028 B1032 A1011 A1006 A1036 错题记录 B1028 人口普查 某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的…

你为什么不喜欢关电脑?我只是想第二天能够快速进入工作状态

程序员不喜欢关电脑的主要原因就是&#xff1a;想第二天能够快速进入工作状态。大部分不喜欢关电脑的程序员都是很敬业的程序员。 程序员的电脑上安装了很多软件&#xff0c;包括IDE、数据库客户端、Redis客户端、思维导图、画图工具、数据库设计工具等。通常在工作的时候也会…

开关电源学习之Boost电路

如果我们需要给一个输入电压为5V的芯片供电&#xff0c;而我们只有一个3.3V的电源&#xff0c;那怎么办&#xff1f; 我们能不能把3.3V的电压升到5V&#xff1f; 一、电感的简介 而在升压的电路设计方案中&#xff0c;使用到一个重要的元器件&#xff1a;电感。 电感的特性…

【PyQt】05-多线程

文章目录 前言一、什么是单线程、多线程二、代码现象示例多线程代码运行结果 总结 前言 文章开始还是解释一下&#xff0c;这是跟着王铭东老师学习的。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、什么是单线程、多线程 单线程 在Python中&am…