首页 > 编程语言 >简单c++构建第一人称

简单c++构建第一人称

时间:2023-10-29 17:12:36浏览次数:39  
标签:AFPSCharacter FVector 第一人称 void 网格 c++ 发射物 构建 PlayerInputComponent

本文内容为UE4.27的文档教程

GameMode确定

新建的项目会自动生成GameMode,如果有更改,而不是使用默认的GameMode类,就需要在引擎的设置中更改
image

角色的实现

前后左右移动

//前后 MoveForward
void AFPSCharacter::MoveForward(float value)
{
	//利用控制器方向寻找前进的方向就是角色朝向
	FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
	AddMovementInput(Direction, value);
}
//左右MoveRight
void AFPSCharacter::MoveRight(float value)
{
	//
	FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
	AddMovementInput(Direction, value);
}

利用AddMovementInput函数传入方向

在模板自带的PlayerInputComponent方法下,绑定行为函数

void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
	PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
}

绑定轴的移动:BindAxis

鼠标控制视角的转动

PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);

AddControllerYawInput,AddControllerPitchInput为基类自带可以直接使用来控制视角的转动

跳跃

跳跃与bPressedJump绑定这是模板基类设置好的。所以在Character的源文件和头文件中定义两个函数来控制这个变量值

void AFPSCharacter::StartJump()
{
	bPressedJump = true;
}

void AFPSCharacter::StopJump()
{
	bPressedJump = false;
}

在模板自带的PlayerInputComponent方法下,绑定行为函数

PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump);

绑定按键操作:BindAction,IE_Pressed表示设置的按键按下,IE_Released表示设置的按键松开

实现第一人称视角

FPS游戏常见的方法就是使用两个分开的角色网格体,一个是全身网格,一个是“武器和手部”的局部网格,全身网格可以用于第三人称视角,局部网格用于第一人称视角。
主要操作,摄像机组件Attach在全身网格下,局部网格Attach在摄像机下。禁用某些阴影更加真实(防止第一个网格体的影响)

FPSMesh->bCastDynamicShadow = false;
FPSMesh->CastShadow = false;

发射物的实现

设置一个球状发射物利用USphereComponent,利用UProjectileMovementComponent确定发射物的移动,定义一个函数用于管理发射物的发射

//传入发射方向,在角色类中获取,乘以发射速度
void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
{
    ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
}

在角色类中利用BindAction绑定按键,并且编写Fire函数,在角色类中需要新增一个变量用来确定角色需要发射哪一类发射物虽然现在只有1类。
BindAction需要一个角色类中的操作(函数),所以需要在角色类中再写一个Fire函数,其中调用发射物类中的发射函数

//在头文件中
UPROPERTY(EditDefaultsOnly, Category = Projectile)
TSubclassOf<class AFPSProjectile> ProjectileClass;

实现射击

在角色类的头文件中include发射物头文件,编写Fire函数,利用SpawnActor方法来生成发射物,调用发射物类中的发射函数实现发射。

void AFPSCharacter::Fire()
{
// 试图发射发射物。
if (ProjectileClass)
{
// 获取摄像机变换。
FVector CameraLocation;
FRotator CameraRotation;
GetActorEyesViewPoint(CameraLocation, CameraRotation);

// 设置MuzzleOffset,在略靠近摄像机前生成发射物。
MuzzleOffset.Set(100.0f, 0.0f, 0.0f);

// 将MuzzleOffset从摄像机空间变换到世界空间。
FVector MuzzleLocation = CameraLocation + FTransform(CameraRotation).TransformVector(MuzzleOffset);

// 使目标方向略向上倾斜。
FRotator MuzzleRotation = CameraRotation;
MuzzleRotation.Pitch += 10.0f;

UWorld* World = GetWorld();
if (World)
{
    FActorSpawnParameters SpawnParams;
    SpawnParams.Owner = this;
    SpawnParams.Instigator = GetInstigator();

    // 在枪口位置生成发射物。
    AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
    if (Projectile)
    {
        // 设置发射物的初始轨迹。
        FVector LaunchDirection = MuzzleRotation.Vector();
        Projectile->FireInDirection(LaunchDirection);
    }
}
}
}

设置发射物的生命和碰撞

在发射物类的源文件中的构造函数中利用InitialLifeSpan设置生命周期
在引擎设置Collision中自定义Collision文件,在源文件构造函数中对SphereComp绑定该文件

SphereComp->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));

当发射物碰撞物体消失

利用OnComponentHit事件,在发射物类中

SphereComponet->OnComponentHit.AddDynamic(this, &AFPSProjectile::OnHit);

void AFPSProjectile::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit)
{
    if (OtherActor != this && OtherComponent->IsSimulatingPhysics())
    {
        OtherComponent->AddImpulseAtLocation(ProjectileMovementComponent->Velocity * 100.0f, Hit.ImpactPoint);
    }

    Destroy();
}

标签:AFPSCharacter,FVector,第一人称,void,网格,c++,发射物,构建,PlayerInputComponent
From: https://www.cnblogs.com/XTG111/p/17795970.html

相关文章

  • C++多线程编程——线程的基本概念和使用方法
    什么是线程?在计算机科学中,线程是进程中的一个执行控制单元,也被称为执行路径。每个进程可以包含多个线程,每条线程并行执行不同的任务。线程是操作系统可识别的最小执行和调度单位。进程和线程的区别进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的......
  • 【C++】继承 ⑬ ( 虚继承原理 | 虚继承解决继承二义性问题 | 二义性产生的原因分析 )
    文章目录一、虚继承原理1、虚继承解决继承二义性问题2、二义性产生的原因分析3、虚继承原理二、代码示例-虚继承原理1、完整代码示例2、执行结果一、虚继承原理1、虚继承解决继承二义性问题继承的二义性:如果一个子类(派生类)继承多个父类(基类),这些父类都继......
  • 【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )
    文章目录一、继承机制中派生类中的static关键字1、子类继承父类静态成员2、父类静态成员访问控制权限的改变3、子类如何访问父类静态成员4、静态成员使用要点二、完整代码示例一、继承机制中派生类中的static关键字1、子类继承父类静态成员子类继承父类静态成员:父类(......
  • 【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 )
    文章目录一、继承的二义性1、场景说明-继承的二义性2、继承中的二义性报错3、完整代码示例二、virtual虚继承1、虚继承引入2、虚继承语法3、代码示例-虚继承一、继承的二义性1、场景说明-继承的二义性A类是父类,B类和C类继承A类,是子类,D类多继承B类......
  • c++中重载、重写、隐藏的区别
    重载:同一个函数的不同表现形式。同一个类中;函数原型不同(函数名相同,参数列表即顺序、个数、类型不同);virtual关键字可有可无。 重写:继承关系中,派生类对基类同名函数有不同的表现形式。有继承关系的类;函数原型相同;基类成员函数必须声明为虚函数(virtual)。 隐藏:继......
  • C++ | 每一个C++程序员都应该知道的RAII
    导读:RAII是C++中一种管理资源、避免资源泄漏的惯用法,利用栈的特点来实现。本文较为详细介绍了RAII的原理、使用方法和优点,并且通过实例讲解了RAII在C++STL中的应用,如智能指针和互斥锁等,在最后进行了编程实践。本文适合对C++编程有一定了解的开发者阅读。1.什么是RAIIRAII是R......
  • C和C++的区别
    1.头文件(c++标准头文件都是有命名空间的);2.c++有命名空间,可以解决命名冲突的问题;3.输入与输出1)c++:读入std::cin<<     输出std::cout>>std::endl;2)c:读入:scanf输出:printf4.对空间的开辟和释放c:malloc,calloc,realloc,free......
  • C++---数据结构---队列(queue)
    queue容器queue基本概念概念:Queue是一种先进先出(FirstInFirstOut,FIFO)的数据结构,它有两个出口队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为—入队push队列中出数据称为—出队popque......
  • 【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
    文章目录一、继承+组合模式的类对象构造函数和析构函数调用规则1、场景说明2、调用规则二、完整代码示例分析1、代码分析2、代码示例一、继承+组合模式的类对象构造函数和析构函数调用规则1、场景说明如果一个类既继承了基类,又在类中维护了一个其它类型的成员......
  • UniApp实战开发指南:构建跨平台应用的终极选择【UniApp实战】
    UniApp是一个强大的开发框架,可让开发者使用Vue.js构建跨平台应用。本文将介绍UniApp的核心概念和技术深度,并通过一个实例演示如何使用UniApp开发一个简单的待办事项应用。1.介绍UniAppUniApp是DCloud推出的一款基于Vue.js的跨平台开发框架。它允许开发者使用一套代码构建同时运行......