10/15/2020
if (GEngine)
{
// 显示调试信息五秒。
// -1"键"值(首个参数)说明我们无需更新或刷新此消息。
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("Hello World, this is FPSGameMode!"));
}
定义游戏规则:
// 调用后将功能绑定到输入
void AFPSCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// 设置"移动"绑定。
PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
}
InputComponent 是定义如何处理输入数据的组件。InputComponent 可附加到需要接收输入的 actor。
BindAxis 和BindAction 绑定了一个委托函数到项目设置中定义的行为或者轴
因为蓝图可以可视化操作,C++加载一个模型后,并不能直接看到模型的样子,最重要的是模型的初始位置和朝向的调整是很难确定的,同时摄像机的视图也需要仔细调整!
当你对C++的某些Component的属性进行重写的时候,它并不会更新已经生成的蓝图类,比如加入你已经拥有了一个FPSCharacter的蓝图类,现在C++想要隐藏骨骼模型
GetMesh()->SetOwnerNoSee(true);
蓝图类Renderring下的Owner No See 属性将会有一个恢复默认设置的标志,这个标志表示C++里面设置了默认情形,但需要手动调整。如果你生成了一个新的蓝图类,将会直接赋值默认属性。
UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
USphereComponent* CollisionComponent; //即蓝图中的Sphere Collision
// 使用球体代表简单碰撞。
CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
// 设置球体的碰撞半径。
CollisionComponent->InitSphereRadius(15.0f);
// 将碰撞组件设为根组件。
RootComponent = CollisionComponent;
// 发射物运动组件。
UPROPERTY(VisibleAnywhere, Category = Movement)
UProjectileMovementComponent* ProjectileMovementComponent;
// 使用此组件驱动该发射物的运动。
ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
ProjectileMovementComponent->InitialSpeed = 3000.0f;
ProjectileMovementComponent->MaxSpeed = 3000.0f;
ProjectileMovementComponent->bRotationFollowsVelocity = true;
ProjectileMovementComponent->bShouldBounce = true;
ProjectileMovementComponent->Bounciness = 0.3f;
// 在发射方向上设置发射物初速度的函数。
void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
{
ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
}
定义发射物生成的位置或方向
// 定义生成的发射物类,人物生成发射物
UPROPERTY(EditDefaultsOnly, Category = Projectile)
TSubclassOf<class AFPSProjectile> ProjectileClass;
// 从摄像机位置的枪口偏移,即方位
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
FVector MuzzleOffset;
//实现射击
void AFPSCharacter::Fire()
{
// 尝试发射物体。
if (ProjectileClass) //在蓝图中会给一个蓝图子弹类,带有模型的
{
// 获取摄像机变换。
FVector CameraLocation;
FRotator CameraRotation;
GetActorEyesViewPoint(CameraLocation, CameraRotation);
// 将 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 = Instigator;
// 在枪口处生成发射物。
AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
if (Projectile)
{
// 设置发射物的初始轨道。
FVector LaunchDirection = MuzzleRotation.Vector();
Projectile->FireInDirection(LaunchDirection);
}
}
}
}
Edit->Project Setting->Engine->Collision
CollisionComponent->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));
InitialLifeSpan = 3.0f; //子弹的声明周期
// 发射物命中物体时调用的函数。
UFUNCTION()
void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit);
// 发射物命中物体时调用的函数。
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);
}
}
CollisionComponent->OnComponentHit.AddDynamic(this, &AFPSProjectile::OnHit);
// 将在屏幕中央绘制此项。
UPROPERTY(EditDefaultsOnly)
UTexture2D* CrosshairTexture;
void AFPSHUD::DrawHUD()
{
Super::DrawHUD();
if (CrosshairTexture)
{
// 找到画布中心。
FVector2D Center(Canvas->ClipX * 0.5f, Canvas->ClipY * 0.5f);
// 纹理维度进行一半偏移,使纹理中心和画布中心对齐。
FVector2D CrossHairDrawPosition(Center.X - (CrosshairTexture->GetSurfaceWidth() * 0.5f), Center.Y - (CrosshairTexture->GetSurfaceHeight() * 0.5f));
// 在中心点绘制准星。
FCanvasTileItem TileItem(CrossHairDrawPosition, CrosshairTexture->Resource, FLinearColor::White);
TileItem.BlendMode = SE_BLEND_Translucent;
Canvas->DrawItem(TileItem);
}
}
UE4官网第一人称射击