首页 > 编程语言 >UE/C++简单功能实现笔记

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

时间:2023-06-17 10:45:27浏览次数:38  
标签:Engine Script TEXT 蓝图 笔记 C++ UE ATiaoQi

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

目录

实现功能与代码

以下代码均来自我的跳棋小游戏,所以默认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);
    //也可以在这声明一个局部变量作为DynMaterial
    DynMaterial->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);}
}

标签:Engine,Script,TEXT,蓝图,笔记,C++,UE,ATiaoQi
From: https://www.cnblogs.com/mariocanfly/p/17487133.html

相关文章

  • Vue进阶(幺贰柒):插槽详解
    (文章目录)一、概述插槽就是子组件中用slot标签定义的预留位置,可以设置name属性,也可以不设置name属性,设置name属性的叫具名插槽,不设置name属性的叫不具名插槽,在父组件中使用子组件时候,可以在使用子组件标签内通过声明插槽名或不声明插槽名的方式往子组件中的具名插槽或者不具名插......
  • 计算机底层的秘密读书笔记之一
    计算机底层的秘密读书笔记之一摘要上周天在家休息时在知乎上面看到了影响性能的几个场景.里面见到了cache的乒乓问题,以及cacheline的伪共享问题.知乎的答案里面图文并茂.作者的思路也很清晰就顺着水印找到了公众号还有作者刚出版的一本书.京东周一快递到手后,这几天晚......
  • TienChin 开篇-运行 RuoYiVue
    开篇目的:让大家随心所欲的DIY若依的脚手架不会涉及到太多基础知识踊跃提问(不懂得地方大家提问我会根据提问,后续一一解答疑惑)下载RuoYiVueGitee:https://gitee.com/y_project/RuoYi-Vue下载完毕之后,这个项目当中存在一个ruoyi-ui这个是前端,只是放在了这个项目当中方便我们进......
  • 斜率优化dp 学习笔记
    斜率优化dp引入首先,我们考虑一种更简单的dp优化——单调队列优化。比如,一个dp式形如:\[dp_{i}=\min_{k\leqj\leqi}(dp_j+f_j+g_i)\]我们发现,这个式子可以通过拆分(wgj:分离变量),变形成如下式子:\[dp_{i}=\min_{k\leqj\leqi}(dp_j+f_j)+g_i\]怎么样?我们发现,取最小......
  • 基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板
    最近得空学习了下uniapp结合vue3搭建跨端项目。之前也有使用uniapp开发过几款聊天/仿抖音/后台管理等项目,但都是基于vue2开发。随着vite.js破局出圈,越来越多的项目偏向于vue3开发,就想着uniapp搭配vite4.x构建项目效果会如何?经过一番尝试果然真香~版本信息HBuilderX:3.8.4Vite......
  • C++面试八股文:什么是左值,什么是右值?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第16面:面试官:什么是左值,什么是右值?二师兄:简单来说,左值就是可以使用&符号取地址的值,而右值一般不可以使用&符号取地址。inta=42; //a是左值,可以&aint*p=&a;int*p=&42; //42是右值,无法取地址二师兄:一般左值存在内存......
  • c++实现二叉树中序遍历
    #include<iostream>usingnamespacestd;//定义二叉树节点结构体structTreeNode{  intval;  TreeNode*left;  TreeNode*right;  TreeNode(intx):val(x),left(NULL),right(NULL){}};//中序遍历函数voidinorderTraversal(TreeNode*root){......
  • 《C++》友元
    友元--friend友元可以访问类的私有属性classPerson{ friendvoidtest();public: Person(intn) { this->n=n; }private: intn;};voidtest(){ Personp(20); cout<<p.n<<endl;}intmain(){ test(); system("pause"); return0;}友......
  • 日语语法学习笔记
    对应课程名词谓语句~だ只能接终助词或句号否定:~ではない疑问:~(か)~です对听话人礼貌否定:~ではありません疑问:~ですか~ですか、~ですか:前升后降~である正式场合对听话人礼貌:~であります~でございます敬语,郑重~は/が格助词は:强调主语が:强调宾语......
  • 【初识C++】(缺省参数和函数重载)
    @TOC一、缺省参数1.缺省参数定义缺省参数是在函数的声明中给定参数一个指定的值。如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。比如:usingnamespacestd;voidFunc(inta=0){ cout<<a<<endl;}intmain(){ Func(); //......