【UE4C++-ActionRougelike-02】相机旋转和玩家输入


title: 【UE4C++ ActionRougelike-02】相机旋转和玩家输入
date: 2022-11-08 22:30:57
tags: [UE4,C++,ActionRougelike Game]
categories: [ActionRougelike Game]
typora-root-url: …

【UE4C++ ActionRougelike-02】相机旋转和玩家输入

一、UE4坐标系

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

  • bUseControllerRotationYawbUseControllerRotationYaw
    表示角色的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蓝图类:创建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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值