蓝图节点

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. Swoole从入门到入土(23)——多进程[进程池Process\Pool]

    Swoole提供的进程池为Process\Pool,基于 Swoole\Server 的 Manager 管理进程模块实现.可管理多个工作进程.该模块的核心功能为进程管理,相比 Process 实现多 ...

  2. OpenCV开发笔记(六十):红胖子8分钟带你深入了解Harris角点检测(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  3. Navicat安装包和激活工具

    链接:https://pan.baidu.com/s/11YuOKdgGakt3E8CL80aA2g 提取码:h4f3

  4. Dockerfile和docker-compose详解

    Dockerfile镜像制作 docker/podman中, 镜像是容器的基础,每次执行docker run的时候都会指定哪个基本镜像作为容器运行的基础.我们之前的docker的操作都是使用来自doc ...

  5. 【复盘#01】myh笔试

    存疑 1.http响应体中版本和缓存是哪个字段(Etga) http和https的区别 2.mysql同一个表中有多个相同字段但搜索的时候只搜得出某一个,要怎么修改(inner ..) mysql如何 ...

  6. 面向开发者的 ChatGPT 提示工程课程|吴恩达携手OpenAI 教你如何编写 prompt

    提示工程(Prompt Engineering)是一门相对较新的学科,旨在开发和优化提示,从而高效地将语言模型(LM)用于各种应用和研究主题,并帮助开发人员更好地理解大型语言模型(LLM)的能力和局限 ...

  7. 【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk

    问题描述 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk.在Azure门户中可以通过查看Backup Item查 ...

  8. Java super关键字使用 +案列

    1 package com.bytezero.supertest; 2 /* 3 * 4 * super关键字使用 5 * 1.super:理解为 父类的 6 * 2.super可以使用调用:属性,方 ...

  9. 安卓插耳机也外放扬声器播放音频的java代码

    最近遇到一个如何在耳机插入的情况下任然用扬声器播放音频的问题. 用搜索引擎找了一些网上的demo(案例) .发现按照他们的方法成功实现. 插入耳机的时候也可以选择使用扬声器播放音乐,来电铃声就是这么用 ...

  10. ASP.NET Core 移除已注册的过滤器

    背景 ABP vNext 默认对异常响应进行了处理,现在某个项目需要自定义异常响应结果. 问题 在 ABP vNext 的 MVC 模块当中,可以看到是通过 AddService(typeof(Abp ...