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

这篇具有很好参考价值的文章主要介绍了UE/C++简单功能实现笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇笔记主要用于记录如何利用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);
    //也可以在这声明一个局部变量作为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文章来源地址https://www.toymoban.com/news/detail-487321.html

#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);}
}

到了这里,关于UE/C++简单功能实现笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【UGUI】实现UGUI背包系统的六个主要交互功能

    在这篇教程中,我们将详细介绍如何在Unity中实现一个背包系统的六个主要功能:添加物品、删除物品、查看物品信息、排序物品、搜索物品和使用物品。让我们开始吧! 首先,我们需要创建一个方法来添加新的物品到背包中。这个方法应该接受一个物品对象作为参数,并将

    2024年02月05日
    浏览(11)
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步,是软件安装。 默认是安装好的,由于安装没有太多技术含量,所以就没有专门做记录。 这里有个注意点,虚幻引擎是整合在Epic games launcher中的,也就是说开发引擎内嵌在游戏平台上,打个比方,就是如果你要下unity你必须先下一个steam的感觉。 当然,在完

    2024年02月04日
    浏览(44)
  • Ansible yum模块 主要用于软件安装

    Ansible yum模块 主要用于软件安装

    name= #所安装的包的名称 state= # present —安装, latest —安装最新的, absent — 卸载软件。 update_cache #强制更新yum的缓存 conf_file #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。 disable_gpg_check #是否禁止GPG checking,只用于 present or latest 。 disablerepo #临时禁止使用yum库

    2024年02月22日
    浏览(9)
  • 【UE】简单实现屏幕UI定位

    【UE】简单实现屏幕UI定位

    实现效果 屏幕空间定位 场景空间定位 一般实现兴趣点(POI)有两种实现方法,场景空间UI定位和屏幕空间UI定位。 场景空间定位 :UI类似实例模型,位置和尺寸是相对于场景不变。大多适用于第一人称第三人称小场景。 屏幕空间定位 :UI大小固定,不会随场景的变化而改变

    2024年02月14日
    浏览(44)
  • 【UE Niagara】实现简单的下雪、下雨天气效果

    【UE Niagara】实现简单的下雪、下雨天气效果

    下雪: 下雨: 新建一个Niagra系统并打开 删除“Add Velocity in Cone” 添加一个“Add Velocity”模块 设置如下参数, Velocity的Z值越小,粒子下落的速度越快,Scale Added Velocity的Z值设置的越大,粒子下落的速度越快 此时的效果就像下雪一样。 我们可以将控制的Pawn挂载一个Niagra组件,

    2024年02月12日
    浏览(14)
  • unity 简单实现tilemap的保存和读取(以便用于关卡编辑器)

            最近在学习使用Tiledmap,用于制作地图确实很方便快捷,但总不能一个关卡就做一个prefab?还是必须将其保存为文本文件才行啊,于是有了以下的尝试:         先定义一个Tiledmap类,用于存储单个Tiledmap信息 tiles是保存的所有tile块。key为坐标值,value为使用的tile

    2024年02月13日
    浏览(12)
  • UE4 widget播放视频,实现滑动条、快进、暂停功能

    UE4 widget播放视频,实现滑动条、快进、暂停功能

    1.将要播放的视频放入ue4中,创建一个med1(media player)并勾选创建med1_Vido(texture)。  2.右键创建的med1_Vido(texture)创建材质UI_med。 3. 在材质中设置UI_med和texture sample。    4.创建一个UI_playmed(widget),要播放视频的image要设置。  4.在UI_playmed(widget),创建变量med(类型 media player)。编译后

    2024年02月15日
    浏览(10)
  • 简单观察UE里Foliage吸附模型与地形的实现方式

    简单观察UE里Foliage吸附模型与地形的实现方式

    UE里,Foliage可以吸附所在的模型与地形: 本篇的目标是观察这个功能大概的实现方式。 首先,编辑器下的Foliage由每个关卡中的一个 AInstancedFoliageActor 来管理。 AInstancedFoliageActor 有一个成员 FoliageInfos : FoliageInfos 管理了每个FoliageType所对应的信息,以 FFoliageInfo 表示,而 FFo

    2024年02月08日
    浏览(10)
  • Hadoop是一个开源的分布式处理系统,主要用于处理和存储大量数据

    Hadoop是一个开源的分布式处理系统,主要用于处理和存储大量数据

    Hadoop是一个开源的分布式处理系统,主要用于处理和存储大量数据。它是由Apache软件基金会开发的,现在已经成为大数据领域中广泛使用的技术之一。 Hadoop架构 Hadoop的架构包括以下几个主要组件: Hadoop Distributed File System (HDFS) : HDFS是Hadoop的核心组件之一,它是一个分布式文

    2024年02月04日
    浏览(15)
  • UE5、CesiumForUnreal实现多边形压平地形、3DTiles功能

    UE5、CesiumForUnreal实现多边形压平地形、3DTiles功能

    之前的文章在材质中基于顶点位置偏移实现了 StaticMesh 模型的 压平 效果,并解决了 闪面 的问题。 本文这里基于 CesiumForUnreal 插件加载在线的地形 CesiumWorldTerrain ,并实现了 任意多边形 对地形的 压平 效果,支持UE的 Editor 和 Runtime 环境,GIF动图如下: 与之前的文章“ UE5实现

    2024年02月03日
    浏览(112)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包