【UE4C++ ActionRougelike-02】相机旋转和玩家输入
一、UE4坐标系
UE4是左手坐标系:
- Roll:绕着X轴(红色)旋转
- Pitch:绕着Y轴(绿色)旋转
- Yaw:绕着Z轴(蓝色)旋转
1、 Rotation
- ControllerRotation表示PlayerController的方位,PlayerController和PlayerCameraMenager会在游戏开始的时候生成。
- ActorRotation表示RootComponent的方位
2、常见的相机旋转模式
FPS/TPS:角色的正面和摄像机朝向一致,设置bUseControllerRotationYaw = true即可,即玩家的正朝向一直会与控制器PlayController的朝向保持一致。
MMORPG:类似上帝视角,摄像机悬挂在半空中,玩家可以前后左右跑动,面朝移动方向。设置bUseControllerRotationYaw = false,并将GetCharacterMovement()->bOrientRotationToMovement = true
- bUseControllerRotationYaw 和表示角色的ActorRotation跟随ControllerRotation旋转
- bUsePawnControlRotation使用Pawn(ControllerRotation)控制弹簧臂旋转
- bOrientRotationToMovement表示角色的ActorRotation跟随加速度方向(即运动方向)旋转
二、玩家相机旋转
在MyCharacter.cpp中设置角色的相机旋转模式
//MyCharacter.cpp
AMyCharacter::AMyCharacter()
{
//使用Pawn(ControllerRotation)控制弹簧臂旋转
SpringArmComp->bUsePawnControlRotation = true;
//旋转Actor朝向加速方向(false为不旋转)
GetCharacterMovement()->bOrientRotationToMovement = true;
//bUseControllerRotationYaw表示人物的ActorRotation跟随ControllerRotation旋转,因此要与bOrientRotationToMovement布尔值相反
bUseControllerRotationYaw = false;
}
三、角色攻击
1、创建魔法攻击类
创建抛体类MyMagicProjectile,表示基础魔法攻击类,在MyMagicProjectile.h中声明所需组件:
//MyMagicProjectile.h
UCLASS()
class ACTIONROGUELIKE_API AMyMagicProjectile : public AActor
{
protected:
//球体组件用于判断碰撞
UPROPERTY(VisibleAnywhere)
USphereComponent* SphereComp;
//添加抛体组件用于运动
UPROPERTY(VisibleAnywhere)
UProjectileMovementComponent* MovementComp;
//添加粒子系统组件
UPROPERTY(VisibleAnywhere)
UParticleSystemComponent* EffectComp;
}
在MyMagicProjectile.cpp的构造函数中初始化组件
//MyMagicProjectile.cpp
AMyMagicProjectile::AMyMagicProjectile()
{
//创建球体组件
SphereComp = CreateDefaultSubobject<USphereComponent>("SphereComp");
//设置碰撞体的collision profile
SphereComp->SetCollisionProfileName("Projectile");
RootComponent = SphereComp;
//创建抛体组件
MovementComp = CreateDefaultSubobject<UProjectileMovementComponent>("MovementComp");
MovementComp->InitialSpeed = 1000.0f; //抛体组件初速度
MovementComp->bRotationFollowsVelocity = true; //随速度方向更新旋转
MovementComp->bInitialVelocityInLocalSpace = true;
//创建粒子系统组件
EffectComp = CreateDefaultSubobject<UParticleSystemComponent>("EffectComp");
EffectComp->SetupAttachment(SphereComp);
}
基于MyMagicProjectile创建MagicProjectile_BP蓝图类:并设置粒子效果。
2、绑定攻击按键
在项目设置->Input->Action Mapping中添加攻击的按键绑定
3、控制魔法攻击类生成
在MyCharacter.h声明攻击产生的抛体类和攻击方法
//MyCharacter.h
class ACTIONROGUELIKE_API AMyCharacter : public ACharacter
{
protected:
//定义Projectileclass,在蓝图中可选择MagicProjectile类
UPROPERTY(EditAnywhere)
TSubclassOf<AActor> Projectileclass;
public:
//攻击方法
void PrimaryAttack();
};
在MyCharacter.cpp绑定攻击事件和处理函数,定义攻击函数
//MyCharacter.cpp
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
//绑定攻击按键事件和处理函数
PlayerInputComponent->BindAction(TEXT("PrimaryAttack"), IE_Pressed, this, &AMyCharacter::PrimaryAttack);
}
//攻击处理函数
void AMyCharacter::PrimaryAttack()
{
//获取骨骼体手部的插槽作为魔法攻击类的生成点
FVector HandLocation = GetMesh()->GetSocketLocation("Muzzle_01");
//生成朝向:控制器当前的旋转量 生成位置:手部插槽
FTransform SpawnTM = FTransform(GetControlRotation(),HandLocation);
//参数设置
FActorSpawnParameters SpawnParams;
//设置为:总是生成;粒子在角色手部插槽生成,可能会与角色发生碰撞
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
//从World中的SpawnTM按SpawnParams设置生成Projectileclass类
GetWorld()->SpawnActor<AActor>(Projectileclass ,SpawnTM, SpawnParams);
}
4、实现物理碰撞
在项目设置->collision->Preset添加抛体类MagicProjectile的碰撞配置
设置碰撞体的collision profile
//设置碰撞体的collision profile
SphereComp->SetCollisionProfileName("Projectile");
四、角色跳跃
1、绑定跳跃按键
项目设置->Input->Action Mapping中添加跳跃的按键绑定
2、绑定跳跃事件
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
//绑定跳跃事件和处理函数(Character已有对应jump函数)
PlayerInputComponent->BindAction(TEXT("Jump"), IE_Pressed, this, &ACharacter::Jump);
}