《FPS开发日记》一:子弹碰撞特效

文章目录[x]
  1. 1:本章为《FPS开发日记》的第一章。
  2. 2:也将为大家初识UE4引擎里的c++开发。
  3. 2.1:本章目的:一,初识UE4引擎c++游戏开发。
  4. 2.2:二,做出子弹碰撞的特效。
  5. 2.3:话不多说,开始吧。
  6. 2.4:第一步,创建c++fps模板。
  7. 2.5:会看到UE4和VS2017弹出。
  8. 2.6:第二步我们回到VS2017,安照这步骤,找到对应的cpp。这个cpp基本上是被弹射抛掷的物体。
  9. 2.7:(简单的说就是关于子弹物理的函数)点击它。
  10. 2.8:拉到最下行,看到这一类函数。
  11. 2.9:
  12. 2.10:我们来逐行解析一下。
  13. 2.11:首先if ((OtherActor != NULL)
  14. 2.12:&&
  15. 2.13:(OtherActor != this)
  16. 2.14:&&
  17. 2.15:(OtherComp != NULL)
  18. 2.16:&&
  19. 2.17:OtherComp>IsSimulatingPhysics())
  20. 2.18:是检测是否碰撞的一个bool函数。如果是的话。
  21. 2.19:他会执行推力函数:
  22. 2.20:OtherComp
  23. 2.21:->AddImpulseAtLocation
  24. 2.22:(GetVelocity() * 100.0f, GetActorLocation());
  25. 2.23:这样你就可以看到,子弹击中方块会有1个推力的效果。
  26. 2.24:Destroy();顾名思义就是碰撞完后销毁子弹。
  27. 2.25:如果觉得深奥的话,就这样想。
  28. 2.26:编译器:
  29. 2.27:我看子弹是否打到了墙或物体,如果子弹打到了,那么我就会推打到的墙一下
  30. 2.28:OtherComp
  31. 2.29:->AddImpulseAtLocation
  32. 2.30:(GetVelocity() * 100.0f, GetActorLocation());
  33. 2.31:并且我要把子弹给销毁掉Destroy(),因为他已经没有用处了。
  34. 2.32:如果没打到墙或物体,那我什么也不用干,多爽呀!!
  35. 2.33:(垃圾解释,勿喷)
  36. 2.34:所以我们就在if函数结束后添加个粒子类。
  37. 2.35:首先在它碰撞的原地生成粒子发射器。
  38. 2.36:我们打
  39. 2.37:UGameplayStatics::
  40. 2.38:SpawnEmitterAtLocation
  41. 2.39:(GetWorld(), ExplosionEffect, GetActorLocation());
  42. 2.40:(GetWorld(), ExplosionEffect, GetActorLocation());
  43. 2.41:GetWorld():获取世界场景
  44. 2.42:ExplosionEffect:这是个变量名,目前还不存在,等会会定义它,变量名随意(但最好顾名思义)
  45. 2.43:GetAcotorLocation():这个是获取子弹碰撞发生时的坐标(及位置)。
  46. 2.44:UPartcleSystem 是虚幻4定义的“粒子系统”类型,所以
  47. 3:弹出这个界面,可以在左边看到我们刚刚命名的名字“boom”。
  48. 4:嗯,不错。当然你也可以选择别的粒子效果。列如:
  49. 5:本篇文章到这就结束了,如果你觉得对你有帮助的话,不妨打赏支持一下(逃

《FPS开发日记》一:子弹碰撞特效

本章为《FPS开发日记》的第一章。

也将为大家初识UE4引擎里的c++开发。

本章目的:一,初识UE4引擎c++游戏开发。

二,做出子弹碰撞的特效。

话不多说,开始吧。

第一步,创建c++fps模板。

会看到UE4和VS2017弹出。

我们先回到UE4运行一下。可以看到,子弹碰到建筑物的时候会反弹。

一会就会销毁。

那我们就是要在它碰到建筑物的时候给他加些特效。

类似fps游戏中子弹碰到墙壁时,会有火花四溅的特效。

所以我们就在子弹碰撞时给他加个爆炸特效。

如图

 

第二步我们回到VS2017,安照这步骤,找到对应的cpp。这个cpp基本上是被弹射抛掷的物体。

(简单的说就是关于子弹物理的函数)点击它。

拉到最下行,看到这一类函数。

我们来逐行解析一下。

首先if ((OtherActor != NULL)

&&

(OtherActor != this)

&&

(OtherComp != NULL)

&&

OtherComp>IsSimulatingPhysics())

是检测是否碰撞的一个bool函数。如果是的话。

他会执行推力函数:

OtherComp

->AddImpulseAtLocation

(GetVelocity() * 100.0f, GetActorLocation());

这样你就可以看到,子弹击中方块会有1个推力的效果。

Destroy();顾名思义就是碰撞完后销毁子弹。

如果觉得深奥的话,就这样想。

编译器:

我看子弹是否打到了墙或物体,如果子弹打到了,那么我就会推打到的墙一下

OtherComp

->AddImpulseAtLocation

(GetVelocity() * 100.0f, GetActorLocation());

并且我要把子弹给销毁掉Destroy(),因为他已经没有用处了。

如果没打到墙或物体,那我什么也不用干,多爽呀!!

(垃圾解释,勿喷)

所以我们就在if函数结束后添加个粒子类。

首先在它碰撞的原地生成粒子发射器。

我们打

UGameplayStatics::

SpawnEmitterAtLocation

(GetWorld(), ExplosionEffect, GetActorLocation());

解释;

在UGameplayStaics后输入两次冒号可以获得所有静态函数,我们选用

这个里的SpawnEmitterAtLocation()函数。函数名的意思是“在原处生成发射器”。

但UGameplayStaics包含在
“Kismat/GameplayStatics.h”

的头文件内。

先在最上面打头文件那块,输入#include”Kismat/GameplayStatics.h”

让编译器找到这个头文件,

括号的参数为;
SpawnEmitterAtLocation(“需要传递的世界场景”,发射器变量名,发射器的位置)

所以这样填

(GetWorld(), ExplosionEffect, GetActorLocation());

GetWorld():获取世界场景

ExplosionEffect:这是个变量名,目前还不存在,等会会定义它,变量名随意(但最好顾名思义)

GetAcotorLocation():这个是获取子弹碰撞发生时的坐标(及位置)。

(红线为Visual Assist的BUG,不影响)

之后回到头文件“shootprojectile.h”

在这打UParticleSystem* ExplosionEffect;

UPartcleSystem 是虚幻4定义的“粒子系统”类型,所以

UParticleSystem* ExplosionEffect;是一个”粒子系统”类型的指针。

但目前为止ExplosionEffect依然是一个空指针,编译的话没任何效果。

所以我们可以将他公开给蓝图,在蓝图里进行赋值。

我们在他的上一行输入UPROPERTY(EditDefaultsOnly,Category=”boom”)
UPROPERTY()是公开给蓝图的函数,公开的内容为下面一行的内容。
EditDefaultsOnly的意思是(仅编辑默认,以后讲)
Category是蓝图的名字,一个string类型变量;名字可任意(我打的是“boom”)

但目前,编译器还不知道UPartcleSystem是什么。

所以我们需要打一个全局类class UPartcleSystem ;

让编译器知道这是个类就行了。

这个步骤叫向前声明,以后会详细讲。

好了之后就可以F5调试啦。

弹出虚幻4界面。找到这个点击它。

弹出这个界面,可以在左边看到我们刚刚命名的名字“boom”。

选择我们想要的粒子。

 

这步就相当于给
UParticleSystem* ExplosionEffect;

这个指针赋值啦。

嗯,弄好啦,看看效果。

嗯,不错。当然你也可以选择别的粒子效果。列如:

帅!!

本篇文章到这就结束了,如果你觉得对你有帮助的话,不妨打赏支持一下(逃

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像