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 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++多线程学习[六]: 多线程之间的同步

一、同步问题 实际开发场景中有很多需要同步的情况&#xff0c;例如&#xff0c;音频和视频的同步输出、或者通讯能够第一时间同步接受处理… 二、多线程同步demo 可以看到cond可以阻塞等待&#xff08;wait&#xff09;可以通知一个线程(notify_one)也可以通知所有的线程&am…

Mysql的BufferPool

Mysql的BufferPool Mysql是一个存储数据到磁盘的进程&#xff0c;但是磁盘的速度难以与CPU相比&#xff0c;所以InnoDB存储引擎在处理客户端的请求时&#xff0c;当需要访问某个页的数据时&#xff0c;就会把完整的页的数据全部加载到内存中。将整个页加载到内存中后就可以进行…

2 月 5 日算法练习- 字符串

人物相关性分析 思路&#xff1a;枚举前缀和。枚举字符串中的 Bob 位置利用前缀和来记录&#xff0c;然后枚举 Alice 的位置&#xff0c;通过判断 Bob 在 Alice 前面还是后面来进行不同的前缀和差值计算距离 k 距离中 Bob 的个数求和就是答案&#xff0c;复杂度是 On。注意 Bob…

力扣刷题之旅:进阶篇(一)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 题目1&#xff1a;三数之和 题目描述&#xff1a; 给定一个包含n个…

算法学习——LeetCode力扣哈希表篇1

算法学习——LeetCode力扣哈希表篇1 242. 有效的字母异位词 242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同…

轻松修复msvcr100.dll丢失的解决方法,修复时需要注意事项

msvcr100.dll文件缺失是一种普遍遇到的电脑问题&#xff0c;此类问题会妨碍一些程序的正常启动或引发其他错误。幸运的是&#xff0c;我们可以采取多种方法修复msvcr100.dll文件。下面将介绍三种常用的解决方法&#xff0c;包括更新电脑系统、使用dll修复工具修复以及手动下载m…

docker安全与https协议

一、docker存在的安全问题 1、docker 自身漏洞 docker 应用本身实现上会有代码缺陷&#xff0c;docker 历史版本共有超过 20 项漏洞 2、docker公有仓库安全问题 docker 提供了 docker hub&#xff0c;可以让用户上传创建的镜像&#xff0c;以便其他用户下载&#xff0c;快速…

Linux内核编译-ARM

步骤一、下载源码及交叉编译器后解压 linux kernel官网 ARM GCC交叉编译器 步骤二、安装软件 sudo apt-get install ncurses-dev sudo apt-get install flex sudo apt-get install bison sudo apt install libgtk2.0-dev libglib2.0-dev libglade2-dev sudo apt install libs…

【Java篇】——浅拷贝or深拷贝

目录 &#x1f6a9;克隆步骤 &#x1f6a9;拷贝 &#x1f388;浅拷贝 &#x1f388;深拷贝 &#x1f6a9;源代码 &#x1f6a9;克隆步骤 Java 中内置了一些很有用的接口 , Clonable 就是其中之一 .【一般接口都是able来设定的&#xff0c;able是可以..的表示一种能力】 …

tab切换

任务描述&#xff1a;鼠标点击不同商品类别标题时切换不同页面 html代码&#xff1a; <div class"tab"><div class"tab-head"><h3>家电</h3><ul><li><a class"active" href"javascript:;"&g…

arcpy高德爬取路况信息数据json转shp

最近工作上遇到爬取的高德路况信息数据需要在地图上展示出来&#xff0c;由于json数据不具备直接可视化的能力&#xff0c;又联想到前两个月学习了一点点arcpy的知识&#xff0c;就花了一些时间去写了个代码&#xff0c;毕竟手动处理要了老命了。 1、json文件解读 json文件显…

编程实例分享,物流车辆调度管理系统软件教程

编程实例分享&#xff0c;物流车辆调度管理系统软件教程 一、前言 以下教程以 佳易王物流车辆调度管理系统软件V16.0为例说明 如上图&#xff0c;左侧为 导航栏&#xff0c;在系统设置里可以设置打印参数 如上图&#xff0c;填写托运方&#xff0c;货物&#xff0c;司机等信…

走进施耐德电气:数字化转型要奉行长期主义

数字化不是新“银弹”&#xff0c;其前身是电子化、信息化&#xff0c;至今已走过几十年的历程。回头来看&#xff0c;在这个人人都谈数字化、家家都在数字化转型的时代&#xff0c;影响数字化真正走深向实的核心因素有哪些&#xff1f; 2024年1月16日&#xff0c;在主题为“如…

c语言--assert断言(详解)

目录 一、断言的概念二、assert断言2.1 代码12.1.1运行结果2.1.2分析 2.2代码22.2.1运行结果2.2.2分析2.3代码32.3.1运行结果及其分析 三、优点四、缺点五、注意 一、断言的概念 assert.h 头⽂件定义了宏 assert() &#xff0c;用于在运行时确保程序符合指定条件&#xff0c;如…

vue基本语法总结大全

vue基本语法 文章目录 vue基本语法基本用法内容渲染指令属性绑定指令使用js表达式事件绑定指令条件渲染指令v-else和v-else-if指令列表渲染指令v-for中的key 组件化开发安装详细讲解 第三方组件1. 组件间的传值2. element-ui介绍3. 组件的使用4. 图标的使用 Axios网络请求1. Ax…

Redis渗透SSRF的利用

Redis是什么&#xff1f; Redis是NoSQL数据库之一&#xff0c;它使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。默认端口是&#xff1a;6379 工具安装 下载地址&#xff1a; http://download.redis.io/redis-stable.tar.gz然…

【Redis】字符串原理--简单动态字符串SDS

一.SDS定义 free 属性值为0&#xff0c;标识SDS没有分配任何未使用空间。len 属性值为5&#xff0c;标识SDS保存了一个5字节长度的字符串。buf 属性是一个char类型数组&#xff0c;数组的前5个字节保存了&#xff0c;R e d i s 五个字符&#xff0c;最后一个保存空字符串 \0…

网络原理TCP/IP(5)

文章目录 IP协议IP协议报头地址管理网段划分特殊的IP地址路由选择以太网认识MAC地址对比理解MAC地址和IP地址DNS&#xff08;域名服务器&#xff09; IP协议 IP协议主要完成的工作是两方面&#xff1a; 地址管理&#xff0c;使用一套地址体系&#xff0c;来描述互联网上每个设…

Springboot集成Camunda并完成一条流程实例

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;设计流程定…

测试开发体系

软件测试 通过手工或者工具对 “被测对象”进行测试验证实际结果与预期结果之间是否存在差异 软件测试作用 通过测试工作可以发现并修复软件当中存在的缺陷&#xff0c;从而提高用户对产品的使用信心测试可以降低同类型产品开发遇到问题的风险 软件缺陷 软件缺陷被测试工程…