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

UE/C++简单功能实现笔记

100编程书屋_孔夫子旧书网

本篇笔记主要用于记录如何利用C++在虚幻引擎5中实现一些基本的功能需求。

目录

  • 实现功能与代码
    • 构造函数中添加物体
    • 运行时添加C++ Actor
    • 运行时设置动态材质及参数
    • 蓝图调用C++函数
    • 蓝图访问C++成员
    • C++调用用户控件蓝图函数
    • 播放wav格式音效

实现功能与代码

以下代码均来自我的跳棋小游戏,所以默认Pawn的类名为ATiaoQi

构造函数中添加物体

.h

UCLASS()
class UNREALTIAOQI_API ATiaoQi : public APawn
{GENERATED_BODY()
public:UStaticMeshComponent* selectCircle;ATiaoQi();
}

.cpp

ATiaoQi::ATiaoQi() {RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));selectCircle = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("selectCircle"));static ConstructorHelpers::FObjectFinder<UStaticMesh> PlaneAsset(TEXT("/Script/Engine.StaticMesh'/Engine/BasicShapes/Plane.Plane'"));static ConstructorHelpers::FObjectFinder<UMaterial> PlaneMaterial(TEXT("/Script/Engine.Material'/Game/Material/selectBall.selectBall'"));  //右键材质,复制引用即可获得该字符串selectCircle->SetStaticMesh(PlaneAsset.Object);selectCircle->SetMaterial(0, PlaneMaterial.Object);const double selectCircleSize = 0.5;selectCircle->SetWorldScale3D(FVector(selectCircleSize, selectCircleSize, selectCircleSize));selectCircle->SetVisibility(false); //隐藏物体
}

运行时添加C++ Actor

.h

class ACBall;
UCLASS()
class UNREALTIAOQI_API ATiaoQi : public APawn
{GENERATED_BODY()
public:ACBall* middleBall;
}

.cpp

#include "CBall.h"
const FTransform SpawnLocAndRotation(...) //省略具体值;
middleBall = mainWorld->SpawnActorDeferred<ACBall>(ACBall::StaticClass(), SpawnLocAndRotation); //添加了ACBall类C++ Actor

运行时设置动态材质及参数

.h

class UNREALTIAOQI_API ATiaoQi : public APawn
{GENERATED_BODY()
public:UStaticMeshComponent* playerTriangle;UMaterialInterface* triangleStaticMaterial;UMaterialInstanceDynamic* DynMaterial;
}

.cpp

ATiaoQi::ATiaoQi() {static ConstructorHelpers::FObjectFinder<UMaterial> TrianMaterial(TEXT("/Script/Engine.Material'/Game/Material/nowPlayerMaterial.nowPlayerMaterial'"));triangleStaticMaterial = TrianMaterial.Object;
}
void ATiaoQi::initColor(const FLinearColor& TargetColor) {DynMaterial = UMaterialInstanceDynamic::Create(triangleStaticMaterial, this);//也可以在这声明一个局部变量作为DynMaterialDynMaterial->SetVectorParameterValue(FName(TEXT("Color")), TargetColor); //修改动态材质参数playerTriangle->SetMaterial(0, DynMaterial);
}

蓝图调用C++函数

在头文件中给需要调用的函数声明前添加UFUNCTION(BlueprintCallable)即可。

编译后,在蓝图中,获得需要的对象,然后Cast to对应类,再调用函数即可。

蓝图访问C++成员

在头文件中给需要访问的变量声明前添加UPROPERTY(BlueprintReadWrite)即可。

编译后,在蓝图中,获得需要的对象,然后Cast to对应类,即可读取和修改其成员。

C++调用用户控件蓝图函数

思路是这样的,用户控件蓝图继承某个C++控件类,并用蓝图重写其部分C++函数。在控件蓝图中调用指定C++类的函数,使其获得蓝图对象的指针。随后在该C++类中即可直接使用该指针调用C++控件类的函数,即调用了用户控件蓝图的函数。

为什么不直接把用户控件定为C++类而要蓝图呢?因为C++类不提供UI界面的设计器,要直接敲代码,简直没法用。

TiaoQiWidget.h:C++ UserWidget类,控件蓝图继承该类。

UCLASS()
class UNREALTIAOQI_API UTiaoQiWidget : public UUserWidget
{GENERATED_BODY()
public:UFUNCTION(BlueprintNativeEvent)void humanFinish();  //这是需要调用的函数,在蓝图中重写它。virtual void humanFinish_Implementation() {}; //必须按照这种形式声明,即在原来的函数后面添加_Implementation,不可声明其=0,但可以为空。
};

TiaoQi.h:

class UTiaoQiWidget;
UCLASS()
class UNREALTIAOQI_API ATiaoQi : public APawn
{GENERATED_BODY()
public:UTiaoQiWidget* widget;UFUNCTION(BlueprintCallable)void setWidget(UTiaoQiWidget* w=nullptr);
}

TiaoQi.cpp:

#include "TiaoQiWidget.h"
void ATiaoQi::setWidget(UTiaoQiWidget* w) { //在控件蓝图中调用,参数为self即可。widget = w; //之后即可调用widget->humanFinish();
}

播放wav格式音效

.h

UCLASS()
class UNREALTIAOQI_API ATiaoQi : public APawn
{GENERATED_BODY()
public:USoundWave* jumpSoundWave[6];ATiaoQi();void playSound();
}

.cpp

#include "Sound/SoundWave.h"
const FString jumpSound[5] = { 
TEXT("/Script/Engine.SoundWave'/Game/soundFX/Jump/s1.s1'"), 
TEXT("/Script/Engine.SoundWave'/Game/soundFX/Jump/s2.s2'"), 
TEXT("/Script/Engine.SoundWave'/Game/soundFX/Jump/s3.s3'"),						 
TEXT("/Script/Engine.SoundWave'/Game/soundFX/Jump/s4.s4'"),
TEXT("/Script/Engine.SoundWave'/Game/soundFX/Jump/s5.s5'") };const FString nextStepSound[5] = {
TEXT("/Script/Engine.SoundWave'/Game/soundFX/humanNextStep/button01_mp3.button01_mp3'"),
TEXT("/Script/Engine.SoundWave'/Game/soundFX/humanNextStep/button03_mp3.button03_mp3'"),
TEXT("/Script/Engine.SoundWave'/Game/soundFX/humanNextStep/button04_mp3.button04_mp3'"),
TEXT("/Script/Engine.SoundWave'/Game/soundFX/humanNextStep/button05_mp3.button05_mp3'"),
TEXT("/Script/Engine.SoundWave'/Game/soundFX/humanNextStep/button06_mp3.button06_mp3'") };ATiaoQi::ATiaoQi() {for (int i = 0; i < 5; ++i) {ConstructorHelpers::FObjectFinder<USoundWave> jumpSoundObject(*jumpSound[i]);jumpSoundWave[i] = jumpSoundObject.Object;}
}
void ATiaoQi::playSound(){const FVector3d T = ...; // 发声地点,省略具体值。UGameplayStatics::PlaySoundAtLocation(this, jumpSoundWave[FMath::RandRange(0, 4)], T);//下面这种动态载入方式也可以USoundWave* HitSound = LoadObject<USoundWave>(this, *nextStepSound[FMath::RandRange(0,4)]); //下面这种是直接发声,无关具体位置。if (HitSound) {UGameplayStatics::PlaySound2D(GetWorld(), HitSound);}
}

相关文章:

  • 2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Python)-C卷D卷-100分
  • AJAX 综合案例-day2
  • 分布式ID生成方案之雪花算法
  • 【b站-湖科大教书匠】1 计算机网络概述-计算机网络微课堂
  • Swarm 集群管理
  • 20212416 2023-2024-2 《移动平台开发与实践》综合实践
  • 秋招突击——6/19——复习{(单调队列优化)——最大子序列和,背包问题——宠物小精灵收服问题}——新作{两两交换链表中的节点}
  • xshell使用vi命令:bash:vim:command not found
  • 全能AI客户端:ChatGPT Web Midjourney Proxy,AI绘画+GPT4o对话
  • http和https的区别在哪
  • Java基础 - 练习(四)打印九九乘法表
  • 【TensorFlow深度学习】量化压缩技术在降低模型体积中的应用
  • PHP XML: 解析、生成与操作指南
  • 面试专区|【70道Hive高频题整理(附答案背诵版)】
  • 【Golang - 90天从新手到大师】Day06 - 数组
  • [NodeJS] 关于Buffer
  • ES6简单总结(搭配简单的讲解和小案例)
  • ES6之路之模块详解
  • java多线程
  • JAVA多线程机制解析-volatilesynchronized
  • mongodb--安装和初步使用教程
  • Yeoman_Bower_Grunt
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 闭包,sync使用细节
  • 微信小程序开发问题汇总
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序button引导用户授权
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​2021半年盘点,不想你错过的重磅新书
  • ###STL(标准模板库)
  • #pragma pack(1)
  • #每天一道面试题# 什么是MySQL的回表查询
  • (4)logging(日志模块)
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (zhuan) 一些RL的文献(及笔记)
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (自用)gtest单元测试
  • (总结)(2)编译ORB_SLAM2遇到的错误
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET开发人员必知的八个网站
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [000-01-022].第06节:RabbitMQ中的交换机介绍
  • [ABC294Ex] K-Coloring
  • [C++][ProtoBuf][初识ProtoBuf]详细讲解
  • [C++]二叉搜索树
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [jobdu]不用加减乘除做加法