蓝图节点

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. IDEA从o开始的一系列操作及修改配置-快捷键汇总

    IDEA从o开始的一系列操作及修改配置-快捷键汇总 下载IDEA 启动idea 安装svn插件 功能快捷键 先设置提示快捷键(纯属个人喜好) 入门快捷键 查找 编辑 小功能 自动代码提示 自动导包 T ...

  2. BUUCTF [强网杯 2019]随便注 1

    1. 拿到题目,先输入一个1'试一下是否存在注入点 报错 error 1064 : You have an error in your SQL syntax; check the manual tha ...

  3. 临时修改session日期格式冲突问题

    输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' alter session set NLS_DATE_LANGUAGE ...

  4. java图书管理系统界面版本+mysql数据库

    描述: java+mysql数据库实现的图书管理系统,实现了图书添加,图书删除,图书修改,图书查看,图书列表查看等,用户增加,用户删除.用户修改,用户查看等 功能: 图书管理功能:图书添加,图书删除, ...

  5. 【LeetCode回溯算法#03】电话号码的字母组合(数字映射字母)

    电话号码的字母组合 力扣题目链接(opens new window) 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任 ...

  6. STM32标准库内部Flash读写

    STM32标准库FLASH读写 1. STM32内部FLASH介绍 STM32系列一般集成有内部flash,这部分内存可以直接通过指针的形式进行读取.但是由于内部flash一般存储为重要数据或程序运行 ...

  7. Choreographer原理

    Android 系统在 VSYNC 信号的指引下,有条不紊地进行者每一帧的渲染.合成操作,使我们可以享受稳定帧率的画面.引入 VSYNC 之前的 Android 版本,渲染一帧相关的 Message ...

  8. CXPACKET等待类型分析

    背景 客户反馈今天8点钟开始进入业务高峰期后,数据库的CPU利用率非常高,基本达到了100%,前端应用也非常慢.怀疑是昨晚业务系统升级导致,请我们紧急协助分析. 现象 登录到SQL专家云,进入相关时间 ...

  9. 解决windows11远程连接阿里云Centos7

    本地连接CentOs7时报错   Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 网上大部分说的是去修改 vim /etc/ss ...

  10. git 撤销本地 git提交的commit记录 (git reset --hard ID)

    git 撤销本地 git提交的commit记录 (git reset --hard ID) ID的获取方法 这个id,就是你要退回的那个id,我这里截图的时候已经回退了,正常是你提错了的下面那个git ...