蓝图节点

OnComponentBeginOverlap,OnComponentHit等等之类如何迁移到C++中

方法

这些蓝图节点实际上就是一个UE4已经定义好的事件,在蓝图中使用模块的连接来实现事件的触发后续操作。在C++中通过AddDynamic(),进行函数绑定,实现蓝图中的模块操作

动态委托

操作

可以从蓝图中看到OnCompponent*事件是需要绑定在一个Component的,所以对于事件的操作需要在构造函数中进行

SphereComp->OnComponentHit.AddDynamic(this,&ClassName::Func)

而最需要注意的是,对于不同的OnComponent事件,Func的参数是需要调整的,否则会报错,具体的方法可以从源码中获得参数

DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FiveParams( FComponentHitSignature, UPrimitiveComponent, OnComponentHit, UPrimitiveComponent*, HitComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, FVector, NormalImpulse, const FHitResult&, Hit );

接下来就是定义函数,将蓝图中后续的操作编写到函数中。

其中蓝图对销毁粒子时增加了一个粒子特效,利用SpawnEmitterAtLocation,获取接触位置,然后导入粒子特效,接着Destroy。

SpawnEmitterAtLocation是在GameplayStatics类中定义的方法,需要#include "Kismet\GameplayStatics.h"

void ATMagicProjectile::OnActorHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector Normallpulse, const FHitResult& SweepResult)
{
FVector Loc = this->GetActorLocation();
FRotator Rot = this->GetActorRotation(); if (OtherActor && OtherActor != GetInstigator()) {
UGameplayStatics::SpawnEmitterAtLocation(this->EffectComp, HitFX, Loc, Rot);
Destroy();
}
}

HitFX为粒子效果,使用FObjectFinder进行资源的加载,但我的操作提示CDO Failue,没法正常加载资源┭┮﹏┭┮。



参考

完整代码

.h文件

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TMagicProjectile.generated.h" class USphereComponent;
class UProjectileMovementComponent;
class UParticleSystem; UCLASS()
class PHONETEST1_API ATMagicProjectile : public AActor
{
GENERATED_BODY() public:
// Sets default values for this actor's properties
ATMagicProjectile(); protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override; //球体体积,粒子的模型放置
UPROPERTY(VisibleAnywhere)
USphereComponent* SphereComp; //抛体运动组件
UPROPERTY(VisibleAnywhere)
UProjectileMovementComponent* MovementComp; //粒子的状态,后续可以集合在粒子组件中
UPROPERTY(VisibleAnywhere)
UParticleSystemComponent* EffectComp; //添加粒子效果
UPROPERTY(EditDefaultsOnly)
UParticleSystem* HitFX; //粒子碰撞后销毁
UFUNCTION()
void OnActorHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector Normallpulse, const FHitResult& SweepResult); public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};

.cpp文件

// Fill out your copyright notice in the Description page of Project Settings.

#include "TMagicProjectile.h"
#include "Components\SphereComponent.h"
#include "Particles\ParticleSystemComponent.h"
#include "GameFramework\ProjectileMovementComponent.h"
#include "TCharacterComponent.h"
#include "Kismet\GameplayStatics.h" // Sets default values
ATMagicProjectile::ATMagicProjectile()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true; SphereComp = CreateDefaultSubobject<USphereComponent>("SphereComp");
RootComponent = SphereComp; SphereComp->SetCollisionProfileName("Projectile"); EffectComp = CreateDefaultSubobject<UParticleSystemComponent>("EffectComp");
EffectComp->SetupAttachment(SphereComp); MovementComp = CreateDefaultSubobject<UProjectileMovementComponent>("MovementComp");
MovementComp->InitialSpeed = 1000.0f;
MovementComp->bRotationFollowsVelocity = true;
MovementComp->bInitialVelocityInLocalSpace = true; SphereComp->OnComponentHit.AddDynamic(this, &ATMagicProjectile::OnActorHit); static ConstructorHelpers::FObjectFinder<UParticleSystem> ParticleAsset(TEXT("/Content/StarterContent/Particles/P_Fire.P_Fire_C"));
if (ParticleAsset.Succeeded())
{
HitFX = ParticleAsset.Object;
}
} // Called when the game starts or when spawned
void ATMagicProjectile::BeginPlay()
{
Super::BeginPlay();
ObjToSpawn.Broadcast(); } void ATMagicProjectile::OnActorHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector Normallpulse, const FHitResult& SweepResult)
{
FVector Loc = this->GetActorLocation();
FRotator Rot = this->GetActorRotation(); if (OtherActor && OtherActor != GetInstigator()) {
UGameplayStatics::SpawnEmitterAtLocation(this->EffectComp, HitFX, Loc, Rot);
Destroy();
}
} // Called every frame
void ATMagicProjectile::Tick(float DeltaTime)
{
Super::Tick(DeltaTime); }

C++代码实现OnComponentHit事件粒子消失蓝图--斯坦福的更多相关文章

  1. ngui中 代码调用按钮事件(后来改成了按钮绑定键盘..)

    ngui中 代码调用按钮事件 好烦人啊这个问题, 我弄完发上来 这个问题解决了一半 发现可以用 按钮绑定来解决这个问题,并且更安全方便快速 直接在按钮上添加一个 key binding 指定按键 搞定 ...

  2. C# 一段绘图代码 在form_load事件不能显示图

    今天无意将一段绘图代码 写在form_load事件了,结果不能显示绘图.(代码:Graphics g = this.CreateGraphics();Pen pen = new Pen(Color.R ...

  3. jQuery代码节选(事件)

    事件 1.ready()$(document).ready(function() { //代码});简写:$(function( { //代码});该事件是会在页面加载完后执行,相当于onloca() ...

  4. C#代码:用事件模式实现通知

    事件提供了一种标准的机制来通知监听者..NET的事件模式使用了事件语法来实现观察者模式.任意数量的客户对象都可以将自己的处理函数注册到事件上,然后处理这些事件.这些客户对象不需要再编译期就给出.时间也 ...

  5. 谷歌统计使用代码部署和事件API使用

    谷歌统计代码部署和API使用 1.注册谷歌账号 要使用GA,必需先成为GOOGLE的注册用户,如果没有请去注册.当然,你有GMAIL邮箱就可以.邮箱就是帐户名. 2.开启Google Analytic ...

  6. 如何用代码而非事件触发PBO

    通常我们通过抛出事件触发PBO,但若没有事件发生时,我们其实也可以用代码强制发出命令. 写法如下: CL_GUI_CFW=>SET_NEW_OK_CODE( NEW_CODE = <uco ...

  7. 上述代码在JavaScript事件处理中

    上述代码在JavaScript事件处理中很常见,主要设置为与旧版本的Internet Explorer(主要在IE9之前)兼容,因为旧版本的IE不支持标准的W3C事件处理规范. 此代码中的e表示事件对 ...

  8. 成功在Caterpillar代码中插入事件对象-20200917

    首先搞清楚了Caterpillar的solidity代码生成机制.Caterpillar分为Caterpillar Core和 executepanel两部分. executePanel是UI前端,用 ...

  9. 一行代码解释.net事件与委托

    button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); }; delegat ...

  10. 代码笔记-触摸事件插件hammer.js使用

    如果要使用jquery,则需要下载jquery.hammer.min.js版本 新建一个hammer对象生成的对象是dom对象,不能直接使用jqeury 的  $(this)方法,需要先将其转成jqu ...

随机推荐

  1. 用ELK分析每天4亿多条腾讯云MySQL审计日志(4)--MySQL全文索引

    前言:        该文章将会介绍以下: 1,MySQL全文索引的使用 2,全文索引停止词STOPWORD 3,使用全文索引的高效和准确 最近事情比较少,刚好可以梳理一下以前的工作,做一下总结! 在 ...

  2. ckeditor使用技巧总结

    介绍 官方开发者文档:CKEditor 4 documentation 技巧总结 1.挑选需要的插件,打包下载 参考:CKEditor 4.4.1 添加代码高亮显示插件功能--使用官方推荐Code S ...

  3. 开源大语言模型作为 LangChain 智能体

    概要 开源大型语言模型 (LLMs) 现已达到一种性能水平,使它们适合作为推动智能体工作流的推理引擎: Mixtral 甚至在我们的基准测试中 超过了 GPT-3.5,并且通过微调,其性能可以轻易的得 ...

  4. git bash 的一些使用

    一般使用git bash需要的命令 先打开git bash: git init 可以初始化一个本地的仓库 git status 查看仓库信息 mkdir test 创建一个test的文件夹 cd te ...

  5. 一个简单的Dockerfile多阶段构建go项目

    From golang:1.16-alpine3.13 AS builder WORKDIR /app COPY . . RUN go build -o main main.go From alpin ...

  6. java数组实现的超市管理系统(控制台)

    说明:使用数组存储数据,针对用户功能1:增加用户2:删除用户3:修改用户:针对商品功能:1.显示所有商品2.修改商品信息3.添加商品信息4.删除商品信息5.查询商品信息 效果展示 ========== ...

  7. 【Azure Redis 缓存 Azure Cache For Redis】Redis支持的版本及不同版本迁移风险

    问题描述 1. Azure Redis缓存支持的版本包括4.0以及6.0(预览) 这种情形下,可以使用PaaS服务提供的 Azure Redis 缓存(4.0版本).Azure Redis对6.0的支 ...

  8. 图数据库|Nebula Graph v3.1.0 性能报告

    本文首发于 Nebula Graph Community 公众号 本文系 Nebula Graph 发行版 v3.1.0 的性能测试报告. 本文目录 测试环境 测试数据 关于 LDBC-SNB 测试说 ...

  9. [Linux] 无显示器 无键盘 网线直连传输文件

    有显示器可以操作 这种情况下要简单的多,基本思想是,网线直连之后让其中一方当作网关,分配好ip地址,比如说192.168.8.1,网关也是192.168.8.1即可,如果要填写子网掩码就写255.25 ...

  10. 从零开始写 Docker(五)---基于 overlayfs 实现写操作隔离

    本文为从零开始写 Docker 系列第五篇,在 pivotRoot 基础上通过 overlayfs 实现写操作隔离,达到容器中写操作和宿主机互不影响. 完整代码见:https://github.com ...