斯坦福UE4 + C++课程学习记录 5:实现发射粒子

目录

1. 创建魔法粒子

2. 控制粒子生成

3. 更改粒子发射位置

4. 实现物理碰撞

5. 完整代码


1. 创建魔法粒子

        在UE中从Actor派生出一个公共class,命名为SurMagicProjectile,表示这个类用于实现魔法投掷物攻击。创建完毕后在.h文件中添加三个用于计算碰撞和显示特效的组件,并在.cpp中创建实例:

// SurMagicProjectile.h
class USphereComponent;
class UProjectileMovementComponent;
class UParticleSystemComponent;

UCLASS()
class SURKEAUE_API ASurMagicProjectile : public AActor
{
protected:

	// 球体,用于计算碰撞
	UPROPERTY(VisibleAnywhere)
	USphereComponent* SphereComp;
	// 投射体,控制球体的运动
	UPROPERTY(VisibleAnywhere)
	UProjectileMovementComponent* MovementComp;
	// 粒子系统,控制特效
	UPROPERTY(VisibleAnywhere)
	UParticleSystemComponent* EffectComp;
};
// SurMagicProjectile.cpp
#include "Components/SphereComponent.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "Particles/ParticleSystemComponent.h"

ASurMagicProjectile::ASurMagicProjectile()
{
    SphereComp = CreateDefaultSubobject<USphereComponent>("SphereComp");
	RootComponent = SphereComp;

	MovementComp = CreateDefaultSubobject<UProjectileMovementComponent>("MovementComp");
	MovementComp->InitialSpeed = 1000.0f;
	MovementComp->bRotationFollowsVelocity = true;
	MovementComp->bInitialVelocityInLocalSpace = true;

	EffectComp = CreateDefaultSubobject<UParticleSystemComponent>("EffectComp");
	EffectComp->SetupAttachment(SphereComp);
}

        代码编写完毕后,需要在UE中创建蓝图类,步骤同之前创建的Player。

3eb7aafec00d45ebb3eb1252bce5e64a.png
图5-1 创建MagicProjectile蓝图类

        然后打开MagicProjectile,在粒子系统控件EffectComp的“粒子”属性中随意选择一种模板,我这里选择的是P_Gideon_Primary_Projectile。在选择模板后我们可以直接在界面中间的视口中看到粒子特效的样子。


2. 控制粒子生成

        我们需要通过鼠标点击或键盘按下,来控制生成上述魔法粒子。要实现这个功能,可以参考前文有关控制人物移动的操作,需要在SurCharacter.cpp的SetupPlayerInputComponent()函数中绑定一个新动作。不同于控制移动的轴绑定,对于按下按钮这种动作需要使用操作绑定,即BindAction()函数:

// 绑定按键动作("UE中调用的名称";触发的时机如按下或释放;对象;具体方法实现)
PlayerInputComponent->BindAction("PrimaryAttack", IE_Pressed, this, &ASurCharacter::PrimaryAttack);

        为此,需要增加一个控制释放攻击的函数PrimaryAttack()。这个函数的核心是GetWorld()在当前世界下SpawnActor()来生成上面创建的魔法粒子。其中传入三个对象参数分别为:要生成的对象的class、所有Actor基本的Transform变换属性(控制Actor的位置和缩放)、生成的相关参数设置,更详细的使用可以参考

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要绘制斯坦福兔子模型,首先需要加载模型文件。可以使用Assimp库来加载模型文件。接下来,需要使用OpenGL来渲染模型。 下面是一个简单的OpenGL C代码片段,可以绘制斯坦福兔子模型: ```c #include <GL/gl.h> #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <assimp/cimport.h> #include <assimp/scene.h> #include <assimp/postprocess.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制斯坦福兔子模型 glPushMatrix(); glColor3f(1.0, 1.0, 1.0); glScalef(0.02, 0.02, 0.02); glTranslatef(-20.0, -10.0, 0.0); glRotatef(-90.0, 1.0, 0.0, 0.0); aiVector3D zero(0.0f, 0.0f, 0.0f); const aiScene* scene = aiImportFile("bunny.obj", aiProcessPreset_TargetRealtime_MaxQuality); aiMesh* mesh = scene->mMeshes[0]; glBegin(GL_TRIANGLES); for (GLuint i = 0; i < mesh->mNumFaces; i++) { const aiFace& face = mesh->mFaces[i]; for (GLuint j = 0; j < 3; j++) { aiVector3D pos = mesh->mVertices[face.mIndices[j]]; glVertex3f(pos.x, pos.y, pos.z); } } glEnd(); aiReleaseImport(scene); glPopMatrix(); glutSwapBuffers(); } void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640, 480); glutCreateWindow("Stanford Bunny"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 其中,bunny.obj是斯坦福兔子模型的模型文件,需要放在代码所在目录或指定路径下。在display函数中,通过Assimp库加载模型文件,并使用OpenGL绘制模型。需要注意的是,需要设置适当的缩放、平移和旋转来调整模型的位置和大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Surkea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值