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

UEC++第10天|UEC++获取对象、RTTI是C++

最近在写UEC项目,这里写几个案例里的问题,还在学习阶段

1. 如何获取小鸟对象?

void AFlappyBirdGameModeBase::BeginGame() { // 让管道动起来PipeActor->SetMoveSpeed();// 让小鸟开始飞行// 如何获取到小鸟对象APawn* Pawn = UGameplayStatics::GetPlayerPawn(this, 0); // 第一个参数是世界内容,用来查找世界中的对象,用来搜索世界ABirdPawn* Bird = Cast<ABirdPawn>(Pawn);if(Bird) { Bird -> ChangeBirdState(EBirdState::EBS_Fly);}
}

前置知识

  1. C++ 类与函数:理解类的定义、成员函数,这里AFlappyBirdGameModeBase是一个类,BeginGame是其成员函数。
  2. 指针PipeActorPawnBird等都是指针,用于指向对象。
  3. 虚幻引擎相关知识UGameplayStatics是虚幻引擎提供的实用工具类,Cast是虚幻引擎中的类型转换函数,EBirdState是自定义枚举类型。

代码解释

这段代码在游戏模式AFlappyBirdGameModeBase开始游戏时执行。用途是初始化游戏中管道和小鸟的初始状态。首先通过PipeActor->SetMoveSpeed();让管道具备移动速度,然后通过UGameplayStatics::GetPlayerPawn获取玩家控制的角色(小鸟),转换为ABirdPawn类型指针Bird,若转换成功则调用ChangeBirdState函数让小鸟进入飞行状态。

简单代码示例

// 假设 ABirdPawn 类定义
class ABirdPawn : public APawn {
public:UENUM(BlueprintType)enum class EBirdState : uint8 {EBS_None,EBS_Fly,EBS_Die};void ChangeBirdState(EBirdState NewState);
};// 假设 PipeActor 类定义
class APipeActor : public AActor {
public:void SetMoveSpeed();
};class AFlappyBirdGameModeBase : public AGameModeBase {
public:APipeActor* PipeActor;virtual void BeginGame() override;
};void AFlappyBirdGameModeBase::BeginGame() {PipeActor->SetMoveSpeed();APawn* Pawn = UGameplayStatics::GetPlayerPawn(this, 0);ABirdPawn* Bird = Cast<ABirdPawn>(Pawn);if (Bird) {Bird->ChangeBirdState(ABirdPawn::EBS_Fly);}
}

常见错误或误解及避免方法

  1. PipeActor未初始化:误解认为声明指针就可直接调用函数。避免方法是在使用PipeActor前确保其指向有效的APipeActor对象。
  2. 类型转换失败Cast可能失败,初学者可能忽略检查Bird是否为空指针。避免方法是在使用Bird前总是检查是否转换成功。
  3. UGameplayStatics::GetPlayerPawn参数错误:对第一个参数this理解错误,若不是从AGameModeBase派生类调用会出错。确保在合适的上下文调用此函数。

实际应用场景

  1. 游戏初始化: 在任何有动态移动障碍物和可操控角色的游戏开始时,都可设置初始状态。
  2. 关卡切换:当切换到包含飞行生物和移动障碍物的关卡时,用于初始化这些元素状态。

基本原理

BeginGame函数在游戏模式开始时自动调用。通过指针操作对象,PipeActor指针调用SetMoveSpeed设置管道移动速度。利用UGameplayStatics::GetPlayerPawn在游戏世界中查找玩家控制的PawnCast将其转换为特定类型ABirdPawn,若成功则可调用ABirdPawn特有的ChangeBirdState函数改变小鸟状态。

2. 上面代码的语法可以怎么简化,简化成什么样子

如下面代码所示:

if(ABirdPawn* Bird = Cast<ABirdPawn>(UGameplayStatics::GetPlayPawn(this, 0))) { 
}

3.RTTI是C++中面向对象的类型转换

前置知识

了解C++中类的定义以及成员变量和成员函数,类与类之间的继承关系,派生类如何冲基类中继承属性和行为。

掌握指针是一个变量,在RTTI中常通过指针或引用操作对象。还需要掌握 虚函数在派生类中被重写,通过基类指针引用虚函数的时候,会根据对象的实际类型来决定调用哪个版本的函数,实现多态。

在运行获取对象的实际的类型,在使用基类指针或实际引用操作对象的时候了解到对象的实际派生类型。

4.用什么关键字检查?动态类型转换。

在 C++ 中,动态类型转换使用dynamic_cast关键字。用途是在运行时进行安全的类型转换,主要用于将基类指针或引用转换为派生类指针或引用。

在C++中,动态类型转换使用dynamic_cast关键字,在运行进行安全的类型转换。主要用途是将基类指针或引用转换为派生类指针或引用。

#include <iostream>class Base {
public:virtual void print() {std::cout << "This is Base class" << std::endl;}
};class Derived : public Base {
public:void print() override {std::cout << "This is Derived class" << std::endl;}
};int main() {Base* basePtr = new Derived();Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if (derivedPtr) {derivedPtr->print();}delete basePtr;return 0;
}

这里是每天回答三个问题

如果觉得对你有帮助的话

麻烦点一个赞

相关文章:

UEC++第10天|UEC++获取对象、RTTI是C++

最近在写UEC项目&#xff0c;这里写几个案例里的问题&#xff0c;还在学习阶段 1. 如何获取小鸟对象&#xff1f; void AFlappyBirdGameModeBase::BeginGame() { // 让管道动起来PipeActor->SetMoveSpeed();// 让小鸟开始飞行// 如何获取到小鸟对象APawn* Pawn UGameplayS…...

【python】一文掌握 markitdown 库的操作(用于将文件和办公文档转换为Markdown的Python工具)

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 一、markitdown概述1.1 markitdown介绍1.2 MarkItDown支持的文件1.3 为什么是Markdown?二、markitdown安装2.1 pip方式安装2.2 源码安装2.3 docker方式安装三、基本使用3.1 命令行方式3.2 可选依赖项配置3.3 插件方…...

爬虫-oiwiki

我们将BASE_URL 设置为 "https://oi-wiki.org/" 后脚本就会自动开始抓取该url及其子页面的所有内容&#xff0c;并将统一子页面的放在一个文件夹中 import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import os import pd…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(10): つもり 计划/打算

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;10&#xff09;&#xff1a; つもり 计划/打算 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;つもり 计划/打算&#xff08;&#xff12;&a…...

强化学习核心原理及数学框架

1. 定义与核心思想 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;的持续交互来学习最优决策策略的机器学习范式。其核心特征为&#xff1a; ​​试错学习​​&#x…...

【技术派后端篇】技术派中 Session/Cookie 与 JWT 身份验证技术的应用及实现解析

在现代Web应用开发中&#xff0c;身份验证是保障系统安全的重要环节。技术派在身份验证领域采用了多种技术方案&#xff0c;其中Session/Cookie和JWT&#xff08;JSON Web Token&#xff09;是两种常用的实现方式。本文将详细介绍这两种身份验证技术在技术派中的应用及具体实现…...

【基础】Node.js 介绍、安装及npm 和 npx功能了解

前言 后面安装n8n要用到&#xff0c;做一点技术储备。主要是它的两个工具&#xff1a;npm 和 npx。 Node.js介绍 Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境&#xff0c;允许开发人员在浏览器之外编写命令行工具和服务器端脚本&#xff0c;是一个基于 C…...

第53讲 农学科研中的AI伦理与可解释性——探索SHAP值、LIME等可解释工具与科研可信性建设之道

目录 一、为什么农学科研中需要“可解释AI”? ✅ 场景示例: 二、常见可解释AI工具介绍 1. SHAP(SHapley Additive exPlanations) 2. LIME(Local Interpretable Model-agnostic Explanations) 三、AI伦理问题在农学中的体现 🧭 公平性与偏见 🔐 数据隐私 🤖…...

助力网站优化利用AI批量生成文章工具提升质量

哎&#xff0c;有时候觉得写东西这事儿吧&#xff0c;真挺玄乎的。你看着那些大网站的优质内容&#xff0c;会不会突然冒出个念头——这些家伙到底怎么做到日更十篇还不秃头的&#xff1f;前阵子我蹲在咖啡馆里盯着屏幕发呆&#xff0c;突然刷到个帖子说现在用AI写文章能自动纠…...

Java语言的进化:JDK的未来版本

作为一名Java开发者&#xff0c;我们正处在一个令人兴奋的时代&#xff01;Java语言正在以前所未有的速度进化&#xff0c;每个新版本都带来令人惊喜的特性。让我们一起探索JDK未来版本的发展方向&#xff0c;看看Java将如何继续领跑编程语言界&#xff01;&#x1f4aa; &…...

SpringBootTest报错

Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or … 解决方案&#xff1a;在SpringTest注解中添加属性&#xff08;classes &#xff09;填写启动类 如我的启动类是MainApplication.class javax.websocket.server.ServerContainer no…...

Flask + ajax上传文件(二)--多文件上传

Flask多文件上传完整教程 本教程将详细介绍如何使用Flask实现多文件上传功能,并使用时间戳为上传文件自动命名,避免文件名冲突。 一、环境准备 确保已安装Python和Flask pip install flask项目结构 flask_upload/ ├── app.py ├── upload/ # 上传文…...

w~视觉~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12327888 #几个论文 Fast Charging of Energy-dense Lithium-ion Batteries Real-time Short Video Recommendation on Mobile Devices Semantic interpretation for convolutional neural networks: What makes a ca…...

Redis安装及入门应用

应用资料&#xff1a;https://download.csdn.net/download/ly1h1/90685065 1.获取文件&#xff0c;并在该文件下执行cmd 2.输入redis-server-lucifer.exe redis.windows.conf&#xff0c;即可运行redis 3.安装redis客户端软件 4.安装后运行客户端软件&#xff0c;输入链接地址…...

NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve

//"dev": " NODE_OPTIONS--openssl-legacy-provider vue-cli-service serve" // 修改后&#xff08;Windows 适用&#xff09; "dev": "vue-cli-service serve --openssl-legacy-provider" 升级 Node.js 到 v14&#xff0c;确保依赖…...

如何在 Postman 中,自动获取 Token 并将其赋值到环境变量

在 Postman 中&#xff0c;你可以通过 预请求脚本&#xff08;Pre-request Script&#xff09; 和 测试脚本&#xff08;Tests&#xff09; 实现自动获取 Token 并将其赋值到环境变量&#xff0c;下面是完整的操作步骤&#xff1a; ✅ 一、创建获取 Token 的请求 通常这个请求…...

上篇:深入剖析 BLE 底层物理层与链路层(约5000字)

引言 在无线通信领域,Bluetooth Low Energy(BLE)以其超低功耗、灵活的连接模式和良好的生态支持,成为 IoT 与可穿戴设备的首选技术。要想在实际项目中优化性能、控制功耗、保证可靠通信,必须对 BLE 协议栈的底层细节有深入了解。本篇将重点围绕物理层(PHY)与链路层(Li…...

PostgreSQL 的 MVCC 机制了解

PostgreSQL 的 MVCC 机制了解 PostgreSQL 使用多版本并发控制(MVCC)作为其核心并发控制机制&#xff0c;这是它与许多其他数据库系统的关键区别之一。MVCC 允许读操作不阻塞写操作&#xff0c;写操作也不阻塞读操作&#xff0c;从而提供高度并发性。 一 MVCC 基本原理 1.1 M…...

【Pandas】pandas DataFrame dot

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

2025 年“泰迪杯”数据挖掘挑战赛B题——基于穿戴装备的身体活动监测问题分析

摘要 本文聚焦于基于穿戴设备采集的加速度计数据,深入研究志愿者在日常活动中的行为特征,构建了多个数学建模框架,实现从身体活动监测、能耗预测、睡眠阶段识别到久坐预警等多个目标。我们依托于多源数据融合与机器学习模型,对人体活动状态进行识别与分析,为健康管理、行…...

Vivado版本升级后AXI4-Stream Data FIFO端口变化

Vivado 2017.4版本中异步AXI4-Stream Data FIFO升级到Vivado 2018.3后&#xff0c;IP管脚会发生变化&#xff0c;2018.3版中没有m_axis_aresetn和axis_data_count。 async_axis_fifo_8_1024 async_axis_fifo_8_1024 ( .s_axis_aresetn (I_do0_rstn ), // input wire…...

Linux424 chage密码信息 gpasswd 附属组

https://chat.deepseek.com/a/chat/s/e55a5e85-de97-450d-a19e-2c48f6669234...

Git 恢复误删除的文件

由于一些操作&#xff0c;把项目中的大量文件删除了&#xff0c;还以为之前敲得代码都付之东流了&#xff0c;突然想起&#xff0c;我的项目使用git进行的版本管理&#xff0c;且一些更改都暂存在本地的仓库的&#xff0c;因此可以使用git来恢复存入仓库的文件 首先&#xff0…...

自定义指令简介及用法(vue3)

一介绍 防抖与节流&#xff0c;应用场景有很多&#xff0c;例如&#xff1a;禁止重复提交数据的场景、搜索框输入搜索条件&#xff0c;待输入停止后再开始搜索。 防抖 点击button按钮&#xff0c;设置定时器&#xff0c;在规定的时间内再次点击会重置定时器重新计时&#xf…...

关于Qt对Html/CSS的支持

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、原生控件二、QtWebEngine总结 前言 最近遇到了一些问题需要使用Qt加载Html发现一些特性不能使用&#xff0c;估计很多人也和我一样遇到这种情况。需要说明…...

海量数据笔试题--Top K 高频词汇统计

问题描述&#xff1a; 假设你有一个非常大的文本文件&#xff08;例如&#xff0c;100GB&#xff09;&#xff0c;文件内容是按行存储的单词&#xff08;或其他字符串&#xff0c;如 URL、搜索查询词等&#xff09;&#xff0c;单词之间可能由空格或换行符分隔。由于文件巨大&…...

Python函数与模块

简介 在Python编程中&#xff0c;函数和模块是实现代码复用、提高开发效率的核心机制。本文将结合理论与实例&#xff0c;解析Python函数与模块的核心知识点&#xff0c;帮助开发者打下基础。 一、函数 函数是一段可重复调用的代码块&#xff0c;通过参数传递实现灵活的逻辑…...

位运算题目:解码异或后的排列

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;解码异或后的排列 出处&#xff1a;1734. 解码异或后的排列 难度 6 级 题目描述 要求 有一个整数数组 perm \texttt{perm} perm&#xff0c;是前…...

【Spring Boot】深入解析:#{} 和 ${}

1.#{} 和 ${}的使用 1.1数据准备 1.1.1.MySQL数据准备 &#xff08;1&#xff09;创建数据库&#xff1a; CREATE DATABASE mybatis_study DEFAULT CHARACTER SET utf8mb4;&#xff08;2&#xff09;使用数据库 -- 使⽤数据数据 USE mybatis_study;&#xff08;3&#xff…...

linux:启动后,ubuntu屏幕变成红色了

屏幕启动后变成 红色背景 通常说明 显卡驱动出了问题&#xff0c;或者是 图形界面加载失败 使用了 fallback 模式。这种现象在 NVIDIA 驱动安装失败或显卡与驱动不兼容时常见。 &#x1f3af; 先给你几个快速修复选项 ✅ 1. 进入 TTY 命令行界面 按下&#xff1a;Ctrl Alt …...