11月15日 作业2,黑洞子弹,子弹发射位置朝着准星方向 UE4斯坦福 学习笔记

2023-11-04

黑洞子弹

##这里遇到了问题,作业要求两个子弹,但是我跟着教程创建的黑洞子弹射出后不能吸引周围的物体,传送子弹不起作用,需要未来回来修改

创建一个子弹的Base,继承AActor

.h文件

protected: // Called when the game starts or when spawned virtual void BeginPlay() override; UPROPERTY(EditAnywhere) UParticleSystem* VFXcomp; UPROPERTY(VisibleAnywhere,BlueprintReadOnly) USphereComponent* SphereComp; UPROPERTY(VisibleAnywhere,BlueprintReadOnly) UParticleSystemComponent* EffectComp; UPROPERTY(VisibleAnywhere,BlueprintReadOnly) UProjectileMovementComponent* MovementComp; // Called when the game starts or when spawned UFUNCTION() virtual void OnActorHit(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); UFUNCTION(BlueprintCallable,BlueprintNativeEvent) void Explode(); virtual void PostInitializeComponents() override;

在.cpp内添加功能

ASProjectileBase::ASProjectileBase() { // 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"); //绑定 SphereComp->SetCollisionProfileName("Projectile"); //设置了碰撞为配置名称Projectile SphereComp->OnComponentBeginOverlap.AddDynamic(this, &ASProjectileBase::OnActorHit); RootComponent = SphereComp; EffectComp = CreateDefaultSubobject<UParticleSystemComponent>("EffectComp"); EffectComp-> SetupAttachment(SphereComp); MovementComp = CreateDefaultSubobject<UProjectileMovementComponent>("MovementComp"); //设置移动组件 MovementComp->InitialSpeed = 8000.0f; //初始速度 MovementComp->ProjectileGravityScale = 0.0f; MovementComp->bRotationFollowsVelocity = true; //初始位置的旋转跟随我们的Pawn视角 MovementComp->bInitialVelocityInLocalSpace = true;//初始速度被生成的时候以当前location为初始位置 } // Called when the game starts or when spawned void ASProjectileBase::BeginPlay() { Super::BeginPlay(); } void ASProjectileBase::OnActorHit(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { Explode(); } void ASProjectileBase::Explode_Implementation() { //当子弹没有被杀死时 if(ensure(!IsPendingKill())) { //生成一个特效 UGameplayStatics::SpawnEmitterAtLocation(this,VFXcomp,GetActorLocation(),GetActorRotation()); //摧毁 Destroy(); } } void ASProjectileBase::PostInitializeComponents() { Super::PostInitializeComponents(); } // Called every frame void ASProjectileBase::Tick(float DeltaTime) { Super::Tick(DeltaTime); }

创建一个黑洞子弹,继承我们刚刚创建的子弹类

.h文件

protected: // Called when the game starts or when spawned virtual void BeginPlay() override; UPROPERTY(EditAnywhere,Category="Teleport") float TeleportDelay; UPROPERTY(EditAnywhere,Category="Teleport") float DetonateDelay; UPROPERTY(VisibleAnywhere) URadialForceComponent* RadialForceComp; FTimerHandle TimerHandle; void TeleportInstigator(); virtual void Explode_Implementation() override;

在.cpp内添加功能

ASDashProjectile::ASDashProjectile() { // 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; TeleportDelay = 0.2f; DetonateDelay = 0.2f; MovementComp->InitialSpeed = 6000.0f; RadialForceComp = CreateDefaultSubobject<URadialForceComponent>("RadialFroce"); //是否自动激活 RadialForceComp->SetAutoActivate(false); RadialForceComp->Radius = 2000.0f; RadialForceComp->ImpulseStrength = -750.0f; //是否随着目标速度变化而变化 RadialForceComp->bImpulseVelChange = true; } // Called when the game starts or when spawned void ASDashProjectile::BeginPlay() { Super::BeginPlay(); GetWorldTimerManager().SetTimer(TimerHandle,this,&ASDashProjectile::Explode,DetonateDelay); } // void ASDashProjectile::Explode_Implementation() { GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Green, FString::Printf(TEXT("AttributeComp")));//输出调试信息 RadialForceComp->FireImpulse(); GetWorldTimerManager().ClearTimer(TimerHandle); UGameplayStatics::SpawnEmitterAtLocation(this,VFXcomp,GetActorLocation(),GetActorRotation()); //禁用Effect EffectComp->DeactivateSystem(); //停止运动 MovementComp->StopMovementImmediately(); //关闭碰撞 SetActorEnableCollision(false); FTimerHandle Timer; GetWorldTimerManager().SetTimer(Timer,this,&ASDashProjectile::TeleportInstigator,TeleportDelay); Super::Explode_Implementation(); } // Called every frame void ASDashProjectile::Tick(float DeltaTime) { Super::Tick(DeltaTime); } void ASDashProjectile::TeleportInstigator() { AActor* ActorToTeleport = GetInstigator(); if(ensure(ActorToTeleport)) { ActorToTeleport->TeleportTo(GetActorLocation(),ActorToTeleport->GetActorRotation(),false,false); } }

最后在蓝图内创建ASDashProjectile的蓝图并加上特效即可

子弹发射位置朝着准星方向

先回到chara的.h文件,新增一个void函数

void SpawnProjectile(TSubclassOf<AActor> ClassToSpawn);

和一个float

float AttackAnimDelay;

视频内的思路是:每一种子弹创建单独的指针,再调用同一个发射函数,这部分修改的东西过多

首先修改了攻击指针

void ASCharacter::PrimaryAttack_TimeElapsed() { SpawnProjectile(ProjectileClass); }

去除了之前的发射子弹逻辑,将发射子弹逻辑写入新的SpawnProjectile内

新的攻击逻辑是,不同的子弹调用不同的指针,再传入SpawnProjectile内,然后再生成一个球形的碰撞体,检测到我们的需要攻击的对象,距离是5000f

最后添加了一个攻击时子弹总是从手部射到屏幕中间的位置

//新的射击 void ASCharacter::SpawnProjectile(TSubclassOf<AActor> ClassToSpawn) { if(ensure(ProjectileClass)) { //触发函数的时候从手部位置生成一个魔法球的模型 FVector HandLocation = GetMesh()->GetSocketLocation("Muzzle_01"); FActorSpawnParameters SpawnParameters; SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; SpawnParameters.Instigator=this; //球形碰撞体 FCollisionShape Shape; Shape.SetSphere(20.0f); // FCollisionQueryParams Params; Params.AddIgnoredActor(this); //三种类型 FCollisionObjectQueryParams QueryParams; QueryParams.AddObjectTypesToQuery(ECC_WorldDynamic); QueryParams.AddObjectTypesToQuery(ECC_WorldStatic); QueryParams.AddObjectTypesToQuery(ECC_Pawn); // FVector TraceStart = CameraComp->GetComponentLocation(); FVector TraceEnd = CameraComp->GetComponentLocation() + (GetControlRotation().Vector() * 5000); FHitResult Hit; if(GetWorld()->SweepSingleByObjectType(Hit,TraceStart,TraceEnd,FQuat::Identity,QueryParams,Shape,Params)) { TraceEnd = Hit.ImpactPoint; } //让手部总是朝着十字准星的方向射击,准确的说是跟随射线的终点,这一段的逻辑是终点的Location位置减去手部位置在世界中的Location,用MakeFromX计算出旋转的量 FRotator ProRotator = FRotationMatrix::MakeFromX(TraceEnd - HandLocation).Rotator(); // FTransform Transform = FTransform(ProRotator, HandLocation); //发射 GetWorld()->SpawnActor<AActor>(ClassToSpawn,Transform,SpawnParameters); } }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

11月15日 作业2,黑洞子弹,子弹发射位置朝着准星方向 UE4斯坦福 学习笔记 的相关文章

随机推荐

  • C语言,\t的用法

    1 t 跳过8个空格 从第8个位置结束 从第9个位置开始 2 若前面的字节 lt 7 从第8个位置结束 从第9个位置开始 3 若前面有8个字符 则从第16个位置结束 从第17个位置开始 include
  • SpringBoot集成Elastic-job依赖注入bean失败

    SpringBoot集成Elastic job踩坑之依赖注入失败java lang ClassNotFoundException org apache curator connection StandardConnectionHandlin
  • NLP 论文领读|合成数据的妙用:低成本构建高质量的大规模平行语料

    欢迎来到 澜舟论文领读 专栏 快乐研究 当然从研读 paper 开始 澜舟科技团队注重欢乐的前沿技术探索 希望通过全新专栏和大家共同探索人工智能奥秘 交流 NLP 黑科技 踩在 巨人 肩上触碰星辰 关注 澜舟科技 公众号 加入交流群和大家一
  • 浅谈WebPack打包流程,原理

    shell 与 config 解析 每次在命令行输入 webpack 后 操作系统都会去调用 node modules bin webpack 这个 shell 脚本 这个脚本会去调用 node modules webpack bin we
  • 公务员服务器期未能考文职么,全国事业单位联考笔试!考上公务员,就不能考军队文职了?!...

    原标题 全国事业单位联考笔试 考上公务员 就不能考军队文职了 7月25日注定是一个不平凡的日子 一些省的事业单位和公务员考试都在这天举行 不少文职报考生也参与了吧 毕竟今年是特殊的一年 图兔在此预祝大家都能取得好的成绩 事业单位联考省份 辽
  • Ribbon负载均衡(四)SpringCloud Ribbon负载均衡之Nacos实现

    SpringCloud Ribbon 负载均衡实现 Nacos安装 文章目录 SpringCloud Ribbon 负载均衡实现 Nacos安装 1 下载Nacos 1 1 安装Nacos 创建Nacos数据库 1 2 导入 nacos m
  • python算法:冒泡排序

    def Bubbl r for i in range len r 保证每一个数字都要找到对应位置 遍历列表的长度 从0开始找到最小值放在第一位 exchange False for j in range i len r 1 从i开始的位置遍
  • TCP网络通信

    TCP与UDP都属于TCP IP协议 TCP Transmission Control Protocol 传输控制协议 是面向连接的协议 也就是说 在收发数据前 必须和对方建立可靠的连接 一个TCP连接必须要经过三次 对话 才能建立起来 其
  • python坐标轴间隔_使用Python玩转高等数学(5):三角函数

    从三角函数开始 我们使用matplotlib绘制函数图像 matplotlib是图形绘制库 使用matplotlib可以方便的绘制函数图形 以及直方图 条形图 散点图等统计图形 matplotlib的绘图命令和matlab的绘图命令基本相似
  • PHP通过OpenSSL生成证书、密钥并且加密解密数据

    转自 http www open open com code view 1421032678562 generate php
  • Interlaken协议简介

    英文原文 Interlaken Protocol Definition A Joint Specification of Cortina Systems and Cisco Systems 1 简介 网络应用中两种主流的芯片到芯片的高速网络
  • 三数之和——双指针法的实践

    一 方法介绍 双指针法有时也叫快慢指针 在数组里是用两个整型值代表下标 在链表里是两个指针 一般能实现O n 的时间解决问题 两个指针的位置一般在第一个元素和第二个元素或者第一个元素和最后一个元素 快指针在前 探路 当符合某种条件时慢指针向
  • llvm编译linux内核,linux手动编译llvm/clang

    centos 7 安装前置依赖 sudo yum install git python devel libffi devel graphviz devel elfutils libelf devel readline devel libed
  • vue2 视频下载本地,图片压缩包下载

    视频单独下载 通过url 转为blob格式的数据 下载视频 getVideoArrayBuffer url name var xhr new XMLHttpRequest xhr open GET url true xhr response
  • Tenginx UDP反向代理实现DNS服务器负载和高可用

    worker processes auto events worker connections 65535 pid var log nginx nginx pid stream upstream dns servers server 192
  • 英文中1-100表达

    数词 1 基数词 1 2 3 2 序数词 第一 第二 类型 1 2 3 4 5 6 7 8 9 10 基数词 one two three four five six seven eight nine ten 序数词 first second
  • 并发请求

    PHP并发请求种类 若干个客户机 Web 浏览器 可以同时请求同一个 PHP 解释的页面 而 Web 服务器将差不多同时返回所有这些页面 一个 Web 页面不会妨碍其他 Web 页面的发送 尽管可能会由于诸如服务器内存或网络带宽之类的受限资
  • VS 关于头文件和库文件的添加

    关于头文件和库文件的添加 一直没有很清晰的认识 下面是从网上搜索到的 自己总结的 也有一些不是很明白的 希望后续能够解决完善 也希望大神们能答疑解惑 一 头文件的添加比较清楚 一般就是 方法一 将所包含的头文件复制到当前目录 下 这个比较有
  • JDY-31蓝牙模块使用指南

    前言 本来是想买个hc 05 这种非常常用的模块 但是在优信电子买的时候 说有个可以替代的 没注意看 买回来折腾半天 这个模块是从机模块 蓝牙模块分为主机从机和主从一体的 主机与从机的区别就是 主机可以主动连接从机 但是从机不能主动连接主机
  • 11月15日 作业2,黑洞子弹,子弹发射位置朝着准星方向 UE4斯坦福 学习笔记

    黑洞子弹 这里遇到了问题 作业要求两个子弹 但是我跟着教程创建的黑洞子弹射出后不能吸引周围的物体 传送子弹不起作用 需要未来回来修改 创建一个子弹的Base 继承AActor h文件 protected Called when the ga