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

UE4和C++ 开发-编程基础记录(UE4+代码基础知识)

1、UE4基础元素

①Actor

      我们又见面了Actor,Actor是在一个关卡中持续存在的,通常他包含几个Actor组件。支持网络复制和多人游戏。
     Actor不包含位置,方向。这些东西在Root Component中存储。对于UE3 中的Pawn也由PlayerCharacter继承了,因为他有MovementComponent包含跳跃,速度等属性
 
       
由SpawnActor() 生成
       必须由Destroy来销毁
       在游戏中不能被垃圾回收
 
   ②什么是ActorComponent?

    能被复用的功能可以添加进入Actor
    包含一些最有趣的函数和事件
    能被Blueprint访问~

   ③组件例子

   Scene Component 添加形状和连接
   Primitive Component 添加碰撞和渲染
   UAudioComponent,UArrowComponent,UInputComponent,ULightComponent,UMeshComponent,UParticleSystemComponent等等…

   写过UnrealScript会对组件深有体会

   ④PrimitiveComponent组件事件举例

   Hit- 再碰到强的时候调用
   Begin/EndOverlap -进出一个Trigger
   Begin/EndCursorOver 没用过
   Clicked/Released 不解释
   InputTouchBegin/End
   Begin/EndTouchOver

2:代码基础知识
 类命名前缀

虚幻引擎为您提供在构建过程中生成代码的工具。这些工具拥有一些类命名规则。如命名与规则不符,将触发警告或错误。下方的类前缀列表说明了命名的规则。

派生自 Actor 的类前缀为 A,如 AController。
派生自 对象 的类前缀为 U,如 UComponent。
枚举 的前缀为 E,如 EFortificationType。
接口 类的前缀通常为 I,如 IAbilitySystemInterface。
模板 类的前缀为 T,如 TArray。
派生自 SWidget(Slate UI)的类前缀为 S,如 SButton。
其余类的前缀均为 字母 F ,如 FVector。


3、虚幻C++部分代码解释

#include "GameFramework/Actor.h"
#include "MyActor.generated.h"UCLASS()
class AMyActor : public AActor
{GENERATED_BODY()public: // 设置该 actor 属性的默认值AMyActor();// 游戏开始时或生成时调用virtual void BeginPlay() override;// 每帧调用virtual void Tick( float DeltaSeconds ) override;
};

AMyActor::AMyActor()

{

    // 将此 actor 设为每帧调用 Tick()。不需要时可将bCanEverTick设置为false以关闭此功能,来提高性能。

    PrimaryActorTick.bCanEverTick = true;

}

3.1、使属性出现在编辑器中
类创建好之后。现在可以创建一些属(设计师可是虚幻编辑器中设置这些属性)。可以使用 特殊宏 UPROPERTY() 来轻松的将属性公开至编辑器中可视。比如:UPROPERTY(EditAnywhere) 宏即可。

UCLASS()
class AMyActor : public AActor
{GENERATED_BODY()UPROPERTY(EditAnywhere)int32 TotalDamage;...
};

之后。你就可以在编辑器中看到变量TotalDamage对应的数值。并且可以对数值进行调节。
除此之外还可以加入其他的属性。

除此之外,还可以通过宏定义来是一些属性在其关联属性被更改的时候也做出相应的改变:

void AMyActor::PostInitProperties()
{Super::PostInitProperties();CalculateValues();
}void AMyActor::CalculateValues()
{DamagePerSecond = TotalDamage / DamageTimeInSeconds;
}
//通过WITH_EDITOR定义使这个函数的目标对象在编辑器中被更改时引擎将通知和运行这个函数。
#if WITH_EDITOR
void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{CalculateValues();Super::PostEditChangeProperty(PropertyChangedEvent);
}
#endif

3.2、蓝图调用C++中的函数
上面说了如果对蓝图公开属性。那函数呢?对呀函数我们又得需要另一个宏来定义。

UFUNCTION(BlueprintCallable, Category="Damage")
void CalculateValues();

如上。 可以通过 UFUNCTION 宏来把C++函数对反射系统公开。 而 BlueprintCallable将其对蓝图虚拟机公开。这样在在蓝图中,右键点击快捷键菜单就可以使用这个函数。

3.3、AActor简单介绍
AActor 这个 类,被作为游戏场景中一个基本的对象。所以可以放在关卡场景中的对象都可延展自这个类,比如:AStaticMeshActor、ACameraActor 和 APointLight 等等 actor。
这个类派生在 UObject。
AActor 的生命周期为:

3.4、虚幻反射系统
再用UE4 C++ 编程的时候。同会看到好多非C++ 语句的字段。例如,他会在一个类上加上UCLASS() 等等。这些都是UE4使用其自身的反射实现,来启动动态功能,比如,垃圾回收,序列化,网络复制和蓝图/C++通信。这些功能你可以根据需求选择的加入,只要为相应的类型添加正确的标记就可生成反射数据。 一下是一些基础标记

#include "MyObject.generated.h" //这个头文件包含虚幻引擎所有反射数据。必须在声明类型的头文件中将此文件作为最后的 include 包含。UCLASS(Blueprintable)
class UMyObject : public UObject
{GENERATED_BODY()public:MyUObject();UPROPERTY(BlueprintReadOnly, EditAnywhere)float ExampleProperty;UFUNCTION(BlueprintCallable)void ExampleFunction();
};

您还会注意到,可以在标记上添加额外的说明符。此处已添加部分常用说明符用于展示。通过说明符可对类型拥有的特定行为进行说明。

Blueprintable - 此类可由蓝图延展。
BlueprintReadOnly - 此属性只可从蓝图读取,不可写入。
Category - 定义此属性出现在编辑器 Details 视图下的部分。用于组织。
BlueprintCallable - 可从蓝图调用此函数。
说明符太多,无法一一列举于此,以下链接可用作参考:

UCLASS 说明符列表

UPROPERTY 说明符列表

UFUNCTION 说明符列表

USTRUCT 说明符列表

3.5、对象/Actor 迭代器
就是 对应 U3D 的 for 循环。先查找关卡中所以的派生自UObject的 类的实例。然后遍历他们。

// 将找到当前所有的 UObjects(此处可以写入你自定义的类的类名) 实例
for (TObjectIterator<UObject> It; It; ++It)
{UObject* CurrentObject = *It;UE_LOG(LogTemp, Log, TEXT("Found UObject named:%s"), *CurrentObject.GetName());
}

相关文章:

UE4和C++ 开发-编程基础记录(UE4+代码基础知识)

1、UE4基础元素 ①Actor 我们又见面了Actor&#xff0c;Actor是在一个关卡中持续存在的&#xff0c;通常他包含几个Actor组件。支持网络复制和多人游戏。   Actor不包含位置&#xff0c;方向。这些东西在Root Component中存储。对于UE3 中的Pawn也由PlayerCharacter继承了…...

【Unity】【VR】如何让Distance Grab抓取物品时限制物品的Rotation

【背景】 遇到这样的场景,希望抓取Canvas时,Canvas不会沿Z轴旋转。 【问题】 发现Freeze Canvas的Rigid Body没有用。 【分析】 应该是RigidBody的限制仅在物理互动下生效,抓取可能不属于物理互动(比如碰撞),所以不生效。 【思路】 还是得写脚本挂载在Interacta…...

为什么3ds max渲染效果图有噪点?点进来,CG Magic告诉您!

大家在使用3ds max渲染效果图时&#xff0c;可能渲染结果往往会出现的都是不真实&#xff0c;有小伙伴会问如何使3dmax渲染效果图真实呢&#xff1f; 不真实就算了&#xff0c;渲染过程中&#xff0c;会出现3Dmax渲染噪点多这类问题。 什么原因3ds max渲染效果图有噪点呢&a…...

Element UI怎么安装呢?

安装 :::warning 注意 后续演示将会在 Vue CLI 搭建的 Vue 项目上进行操作。如需要请查看 Vue CLI 安装 ::: 通过 YARN 命令安装 $ yarn add element-ui完整引入 代表一次性引入所有组件&#xff0c;比较省心省事&#xff0c;但是项目的打包体积也会跟着变大。 // main.js…...

redis批量删除命令

./redis-cli -h 127.0.0.1 -p 6379 -n 2 KEYS "170*:redisKeyStr" | xargs ./redis-cli -h 127.0.0.1 -p 6379 -n 2 DEL...

kubernetes环境 搭建

1、准备2台机器 2、安装docker环境&#xff08;参考官网&#xff09; 1、 sudo apt-get update sudo apt-get install ca-certificates curl gnupg2、 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dea…...

TCP习题总结

1、在采用TCP连接的数据传输阶段&#xff0c;如果发送端的发送窗口值由1000变为2000&#xff0c;那么发送端在收到一个确认之前可以发送&#xff08;&#xff09;。 A. 2000个TCP报文段 B. 2000B C. 1000B D. 1000 个 TCP 报文 这道题考察的是TCP的基本…...

华为发布LampSite X室内数字化创新解决方案,释放数字世界无限潜能

【阿联酋&#xff0c;迪拜&#xff0c;2023年10月11日】2023全球移动宽带论坛&#xff08;Global MBB Forum 2022&#xff09;期间&#xff0c;华为董事、ICT产品与解决方案总裁杨超斌重磅发布了全新一代5G室内数字化产品解决方案LampSite X系列&#xff0c;助力运营商打开商业…...

麒麟操作系统设置QT程序开机自启动有效方法

在麒麟操作系统上设置QT程序开机自启动的两种简单有效的方法。支持请点赞&#xff01; 一、QT程序打包 1.设置环境变量 设置QT和linuxdeployqt的环境变量&#xff0c;已设置可忽略该步骤。 在/etc/profile文件末尾添加一下内容&#xff1a; export PATH/usr/local/Qt-5.15.…...

Python数组删除元素pop与remove对比

pop()和remove()函数都可以用来删除列表中的函数&#xff0c;pop()是按索引来删除的&#xff0c;remove()是按元素来删除的。 1、pop()默认删除列表中最后一个元素&#xff0c;而且会返回删除的元素。此时的时间复杂度为O&#xff08;1&#xff09; 下面的例子中&#xff0c;…...

【Java 进阶篇】Java Web 编写注册页面案例

当涉及到创建一个Java Web注册页面时&#xff0c;你将需要涵盖很多不同的主题&#xff0c;包括HTML、CSS、Java Servlet和数据库连接。在这篇文章中&#xff0c;我们将详细介绍每个步骤&#xff0c;以帮助你创建一个完整的注册页面。 1. 介绍 注册页面是许多Web应用程序的关键…...

7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

前言 在【7.1】管理员图书录入和修改API,当时预告过:并没有写【校验是否是管理员】的逻辑,因为是通用逻辑,会单写一篇来细讲,那么今天就来安排! 角色权限校验,是保证接口安全必备的能力:有权限才可以操作!所以,一般对于这种通用逻辑,推荐不与主业务逻辑耦合,那么…...

【原创】ubuntu18修改IP地址

打开网络配置文件 sudo vi /etc/network/interfaces结果发现如下内容&#xff1a; # ifupdown has been replaced by netplan(5) on this system. See # /etc/netplan for current configuration. # To re-enable ifupdown on this system, you can run: # sudo apt inst…...

Vue-2.4sync修饰符

作用&#xff1a;可以实现子组件与父组件数据的双向绑定&#xff0c;简化代码 特点&#xff1a;prop属性名&#xff0c;可以自定义&#xff0c;非固定为value 场景&#xff1a;封装弹框类的基础组件&#xff0c;visible属性 true显示 false隐藏 本质&#xff1a;就是:属性名…...

【RealTek sdk-3.4.14b】RTL8197FH-VG+RTL8367+RTL8812F WiFi to LAN 和WiFi to WAN吞吐量

LAN <----------> 2.4G WiFi Throughput 天线频宽模式协议连接速率TX(Mbps)RX(Mbps)TX&RX(Mbps)2X240MHz802.11nTCP300Mbps2051922112X240MHz802.11nUDP300Mbps224234231 LAN <----------> 5G WiFi Throughput 天线频宽模式协议连接速率TX(Mbps)RX(Mbps)TX&…...

vue 本地上传Excel文件并读取内容

陌路遇见&#xff0c;陌路告别&#xff0c;陌路问好&#xff0c;九月再见&#xff0c;十月重现! 首先我来讲解一下我的思路&#xff1a; 首先&#xff0c;在模板部分&#xff0c;我们有以下元素&#xff1a; <input type“file” change“handleFileUpload” accept“.xlsx…...

京东商品品牌数据采集接口,京东商品详情数据接口,京东API接口

采集京东商品品牌数据的方法如下&#xff1a; 打开网页。在首页【输入框】中输入目标网址批量输入多个关键词并搜索。创建【循环列表】&#xff0c;采集所有商品列表中的数据。编辑字段。创建【循环翻页】&#xff0c;采集多页数据。设置滚动和修改【循环翻页】XPath。启动采集…...

电脑提示Explorer.exe系统错误该怎么办?

平时我们在使用电脑时&#xff0c;系统有时会提示Explorer.exe系统错误&#xff0c;很多用户在遇到这类问题时不知道该怎么办。遇到Explorer.exe系统错误&#xff0c;该怎么办呢&#xff1f;下面我们一起来了解一下。 怎么修复Explorer.exe系统错误&#xff1f; Explorer.exe是…...

Java架构师部署架构设计

目录 1 导学2 部署架构设计和部署架构图2.1 服务器数量和配置2.2 服务器软件配置2.3 网络环境设计2.4 部署架构图2.5 部署说明文档2.6 部署清单2.7 画部署架构图3 实战整体部署架构设计4 节点部署说明列表5 总结1 导学 本章的主要内容是整体架构设计的核心之一,部署架构设计相…...

ubuntu 22.04.3 live server图文安装流程

备注&#xff1a;以下操作全用键盘&#xff0c;tab切换&#xff0c;enter确认&#xff0c;方向键移动&#xff1b; 1、 选择安装&#xff0c;第一个&#xff1b; 2、选择语言&#xff0c;这里只能选择英语&#xff0c;无中文&#xff1b; 3、继续而不更新 4、键盘&#xff0c;…...

基于SVM+TensorFlow+Django的酒店评论打分智能推荐系统——机器学习算法应用(含python工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境方法一方法二 安装其他模块安装MySQL 数据库 模块实现1. 数据预处理1&#xff09;数据整合2&#xff09;文本清洗3&#xff09;文本分词 相关其它博客工程源代码下载其它资料下载 前言 本项目以支…...

Elasticsearch 分片内部原理—近实时搜索、持久化变更

目录 一、近实时搜索 refresh API 二、持久化变更 flush API 一、近实时搜索 随着按段&#xff08;per-segment&#xff09;搜索的发展&#xff0c;一个新的文档从索引到可被搜索的延迟显著降低了。新文档在几分钟之内即可被检索&#xff0c;但这样还是不够快。 磁盘在这…...

华为OD机试 - 用连续自然数之和来表达整数 - 滑动窗口(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…...

玩转ChatGPT:图像识别(vol. 1)

一、写在前面 来了来了&#xff0c;终于给我的账号开放图像识别功能了&#xff0c;话不多说&#xff0c;直接开测&#xff01;&#xff01;&#xff01; 二、开始尝鲜 &#xff08;1&#xff09;咒语&#xff1a; GPT回复&#xff1a; 这幅图显示了从2005年1月到2012年12月的…...

oracle 数据库实验三

&#xff08;1&#xff09;向 ORCL数据库添加一个重做日志文件组&#xff08;组号为5&#xff09;&#xff0c;包含一个成员文件d:\redo05a.log,大小为4MB &#xff1b; 要向Oracle数据库添加一个重做日志文件组&#xff0c;您可以执行以下步骤&#xff1a; 连接到数据库&…...

多线程并发篇---第五篇

系列文章目录 文章目录 系列文章目录一、什么是线程安全二、Thread类中的yield方法有什么作用?三、Java线程池中submit() 和 execute()方法有什么区别?一、什么是线程安全 线程安全就是说多线程访问同一段代码,不会产生不确定的结果。 又是一个理论的问题,各式各样的答案有…...

java实现权重随机获取值或对象

文章目录 场景TreeMap.tailMap方法简单分析使用随机值使用treemap实现权重取值将Int改为Double稍微准确一点,因为double随机的值更加多测试main方法 当权重的参数比较多,那么建议使用hutool封装的 场景 按照权重2,8给用户分组为A,B, TreeMap.tailMap方法 treeMap是一种基于红…...

期权账户怎么开通的?佣金最低多少?

场内期权的合约由交易所统一标准化定制&#xff0c;大家面对的同一个合约对应的价格都是一致的&#xff0c;比较公开透明。期权开户当天不能交易的&#xff0c;期权开户需要满足20日日均50万及半年交易经验即可操作。 个人投资者想要交易期权首先就得先开户&#xff0c;根据规…...

MySQL(存储过程,store procedure)——存储过程的前世今生 MySQL存储过程体验 MybatisPlus中使用存储过程

前言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化语言&#xff0c;它用于定义、操作和管理数据库中的数据。SQL是一种通用的语言&#xff0c;可以用于多种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;如MySQ…...

如何建立线上线下相结合的数字化新零售体系?

身处今数字化时代&#xff0c;建立线上线下相结合的数字化新零售体系是企业成功的关键。蚓链数字化营销系统致力于帮助企业实现数字化转型&#xff0c;打通线上线下销售渠道&#xff0c;提升品牌影响力和用户黏性&#xff0c;那么具体是如何建立的&#xff1f; 1. 搭建数字化中…...