榴弹类
2023年8月22日 2024年1月11日
说明
- 榴弹发射器
Grenade Launcher
发射榴弹 - 榴弹没有对应网格体,也不属于某个粒子系统
Particle System
概览
- 为榴弹发射器网格体添加MuzzleSocket
- 创建榴弹类, 为其添加球体组件
- 初始化STULauncherWeapon; 发射时, 动态生成榴弹对象
- 创建基于榴弹类的蓝图类
- 创建用于榴弹类的材质类和材质实例类
球体组件
USphereComponent
Spherical Collision
UCapsuleComponent
Capsule Collision
- 外形是球, 提供碰撞功能
- 球体组件的碰撞相较Capsule组件的碰撞更为简单
为网格体Launcher添加MuzzleSocket
虚幻编辑器
-
打开Contents/ExternalContent/Weapon/Weapons/Launcher
-
选中LauncherRoot, 右键, 选择Add Socket
-
选中Socket, 去到Details页面, 进行设置
- SocketName MuzzleSocket Location (0, -15, 65) Rotation (-90, 90, 0) 图示Relative Rotation > Y错误: 应为90, 失误填成9
创建榴弹类
创建C++类STUProjectile
虚幻编辑器
Tools > New C++ Class..
- | |
---|---|
基类 | Actor |
上级目录 | Weapon |
访问属性 | Public |
类名 | STUProjectile |
调整框架
C++
- 每帧调用false
- 无Tick
ShootThemUp: Weapon/STUProjectile.h
ShootThemUp: Weapon/STUProjectile.cpp
添加球体组件, 提供碰撞功能
C++
- 添加组件
protected
ShootThemUp: Weapon/STUProjectile.h
1class USphereComponent; 2 3UPROPERTY(VisibleDefaultsOnly) 4USphereComponent *CollisionComponent;
- 初始化组件: 碰撞半径为5, 设为根组件
ShootThemUp: Weapon/STUProjectile.cpp
1#include "Components/SphereComponent.h" 2 3// Constructor 4 5CollisionComponent = CreateDefaultSubobject<USphereComponent>("SphereComponent"); 6 7// set collision radius 8CollisionComponent->InitSphereRadius(5.0f); 9 10SetRootComponent(CollisionComponent);
初始化STULauncherWeapon
覆写虚函数FireStart和MakeShot
ShootThemUp: Weapon/STULauncherWeapon.h
1// public 2virtual void FireStart() override; 3 4// protected 5virtual void MakeShot() override;
- 在FireStart中调用MakeShot
ShootThemUp: Weapon/STULauncherWeapon.cpp
1void ASTULauncherWeapon::FireStart() 2{ 3 MakeShot(); 4} 5 6void ASTULauncherWeapon::MakeShot() 7{ }
榴弹发射器发射榴弹时, 动态生成榴弹对象
添加榴弹类属性
protected
ShootThemUp: Weapon/STULauncherWeapon.h
1class ASTUProjectile; 2 3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) 4TSubclassOf<ASTUProjectile> ProjectileClass;
在MakeShot动态创建榴弹对象
- 榴弹初始位置在枪口
- 之后需要对榴弹进行参数配置, 延后调用BeginPlay
ShootThemUp: Weapon/STULauncherWeapon.cpp
1#include "Weapon/STUProjectile.h" 2#include "Kismet/GameplayStatics.h" 3#include "Engine/World.h" 4 5void ASTULauncherWeapon::MakeShot() 6{ 7 const FTransform SpawnTransform(FRotator::ZeroRotator, GetMuzzleWorldLocation()); 8 auto Projectile = UGameplayStatics::BeginDeferredActorSpawnFromClass(GetWorld(), ProjectileClass, SpawnTransform); 9 // 设置榴弹参数 10 UGameplayStatics::FinishSpawningActor(Projectile, SpawnTransform); 11}
创建基于STUProjectile的蓝图类
虚幻编辑器
- 选中C++ Classed > ShootThemUp > Public > Weapon > STUProjectile, 右键, 选择Create Blueprint class based on STUProjectile
- 命名为BP_STUProjectile, 保存到Content/Weapon
查看BP_STUProjectile
有CollisionComponent
添加静态网格体组件
-
点击Add, 搜索Sphere, 选择Basic Shapes > Sphere
-
选中Sphere, 去到细节面板, 设置缩放属性, 与碰撞大小匹配
- Transfrom > Scale (0.095, 0.095, 0.095)
设置BP_STULauncherWeapon的榴弹类属性为BP_STUProjectile
为榴弹类应用材质
创建材质类
-
创建文件夹Content/Materials
-
在材质目录创建材质类
-
命名为M_BaseColor
设置材质类
-
双击打开M_BaseColor
-
在Material Graph空白处点击鼠标左键, 同时按下数字4, 创建四维常量, 作为Base Color的输入
-
右键四维常量, 将其转换为参数, 命名为Color
创建材质实例类
-
选中M_BaseColor, 右键
-
命名为MI_RedColor
配置材质实例类
-
双击打开MI_RedColor
-
在细节面板勾选Color参数
-
设置Color参数
为BP_STUProjectile设置材质
-
选择Sphere
-
去到Details > Materials, 设置Element 0
查看
点击鼠标左键射击, 榴弹发射器发射红色小球