黑洞子弹

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

创建一个子弹的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); } }

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

  1. 11月15日BCH协议升级提案又双叒啜来了,请查收!

    ​​BCH告别了5月的纷扰,迎来了新的篇章.对于BCH来说,一年中有两件大事,一是5月15日的升级,二是11月15日的升级.上半年的网络升级已经顺利完成并告一段落,下半年的升级工作正在被BCH开发者写 ...

  2. Tether销毁5亿USDT;BCH将于11月15日硬分叉,SV-Pool已向普通矿工开放

    注1:CBT20是指24小时内市值排名前20的数字货币. 注2:图2是数字货币市场总市值在24小时内的走势变化,该走势反应了当前大盘的总体表现情况. 注3:图中数据来源于coinmarketcap. ...

  3. 2015年10月15日作业

    2015年10月15日作业 中级学员---徐化栋 一.项目质量管理作业 1. 项目质量规划的方法/技术和工具,并简要描述: 1) 效益/成本分析 2) 基准比较 3) 流程图 4) 实验设计 5) 质 ...

  4. 北交所开市工作准备就绪 定于2021年11月15日开市

    11月12日消息,北交所发布公告称,目前,北交所开市各项工作已准备就绪,定于2021年11月15日开市. 2021年11月12日,北交所发布<北京证券交易所合格境外机构投资者和人民币合格境外机构 ...

  5. 【历史上的今天】11 月 15 日:全球首款商用微处理器;微软进军游戏界;ICQ 诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 11 月 15 日,在 1982 年的今天,我国第一家婚姻介绍所成立:在 80 年代初," ...

  6. 2014年11月15日SIE赛意公司面试

    2014年11月15日SIE赛意公司面试 昨晚收到SIE(赛意)公司的面试通知,群面+单面共2个小时,今天中午就屁颠屁颠得跑到体育中心了.话休烦絮,直接进入正题. 1点半的面试,到公司门口已经1点15 ...

  7. 互联网晚报 | 11月14日 星期日 | 好未来宣布关闭K9学科类业务;京东工业品推出“智能移动仓”;北交所11月15日正式开市...

    ‍ 今日看点 ✦ 好未来:义务教育阶段的学科类校外培训服务将于12月31日截止 ✦ 天猫双11菜鸟物流绿色减碳1.8万吨,120万人参与快递箱回收 ✦ 京东工业品推出"智能移动仓" ...

  8. 时空召唤今天服务器维护吗,时空召唤11月15日维护更新预告 全新地图全面开放...

    时空召唤为让玩家们更好的游戏体验将于11月15日更新全新版本,届时将上线全新地图.龙灵传说皮肤等,下面就跟小编一起来了解更多更新内容吧! 阅读推荐:时空召唤新英雄魔术师乔克即将来袭 新皮肤降临 预告内 ...

  9. 长城证券:信达证券、天弘基金等2家机构于11月15日调研我司

    2021年11月29日长城证券(002939)发布公告称:信达证券王舫朝 王锐.天弘基金孙高睿于2021年11月15日调研我司. 本次调研主要内容: 问:财富管理业务的组织架构是怎样的? 答:财富管理 ...

最新文章

  1. PAT_B_1013_Java(20分)
  2. 漫画:什么是单例设计模式
  3. 【交换机】MAC-VLAN的功能作用是什么,如何设置
  4. LeetCode 500. Keyboard Row
  5. Excel文件处理实战-Python编程进阶
  6. 模块电源(三):PCB Layout
  7. 前端简单h5播放器的制作
  8. Html5 Canvas动画基础碰撞检测的实现
  9. 计算机的显卡控制面板在哪里,nvidia控制面板在哪,详细教您如何进入英伟达控制面板...
  10. 儿童学python下哪个软件好_少儿学编程适合哪个软件
  11. java如何编写屏幕保护程序_将Java App变为Windows屏幕保护程序
  12. Win10 dell驱动触摸板安装
  13. Antv F2双柱状图和折线图的混合写法
  14. Untitled555555555
  15. 网络空间地图测绘的战略意义(下)
  16. 2022年山东省安全员A证特种作业证考试题库模拟考试平台操作
  17. 夏天水果店怎么打理,如何打理好一个水果店
  18. php trie,数据结构-PHP 字典树(Trie)的实现
  19. 三菱plc232数据线驱动下载_西门子PLC与三菱PLC专业横评,选型不再纠结
  20. 斯坦福大学吴恩达教授最新来信:AI, GPU和芯片的未来

热门文章

  1. 手机电脑维修管理系统
  2. BaseQuickAdapter之BRVAH官方使用指南(持续更新)
  3. Nt*和Zw*开头的函数
  4. 机器视觉丨转角同轴光源工作原理及打光案例和产品尺寸图
  5. ESD二极管封装详解
  6. 关于云码课堂 正在为学习迷茫的程序员进
  7. 靖江数控车床服务器维修,几个小妙招,解决数控机床急停故障!
  8. 易速还原3.0核心版发布
  9. 中国超高清视频产业发展白皮书(2018)
  10. CC2540 使用BTool