一、前言
我使用的虚幻4引擎版本为4.25.3,碰到的问题是针对官网C++编程教程中第一人称设计游戏教程出现的情况。
二、问题与实现
2.1、缺少引用的编译错误
如图1所示的步骤2.7中,将官网的代码Copy到工程文件中编译不通过;
实现方式:添加确实的引用头文件“#include "Camera/CameraComponent.h" ”,这个头文件是声明变量“
// FPS 摄像机。
UPROPERTY(VisibleAnywhere)
UCameraComponent* FPSCameraComponent;
必须的,可通过鼠标右键选中“UCameraComponent”这个类,然后点击速览定义弹出“UCameraComponent”的定义,如图2所示
最后鼠标悬浮在右边的“CameraComponent”上会提示这个类的包含路径,将最后两个路径名字即
#include "Camera/CameraComponent.h" 添加都.h文件的头部,注意一定不能在#include "FPSCharacter.generated.h" 的下面,否则会
#pragma once
#include "GameFramework/Character.h"
#include "Camera/CameraComponent.h" //必须手动添加这个头文件
#include "FPSCharacter.generated.h"
UCLASS()
class FPSPROJECT_API AFPSCharacter : public ACharacter
{
GENERATED_BODY()
...
}
编译报错。同样在后续出现的引用报错都可以采用这种方式解决。
2.2、问题二:3.2节中的Fire函数实现Copy官网的代码报错,如图3所示,这个“Instigator”我没找到怎么解决方法,只能注释掉,但是注释
之后居然还能实现射击效果。
2.3、模型不能一起导入
如图4a所示,这个案例教程一共有三个模型,我将这三个模型一起拖入虚幻4编辑器的文件夹中后如图4b所示
在3.2-实现射击这一节中设置组件“ProjectileMeshComponent”的Static Mesh部分选择刚刚导入的Sphere模型作为这个组件的网格,如图5所示选不到这个网格模型:
实现方法:删除Sphere模型重新单独导入一份该模型 。
2.4、代码中设置了子弹的生命周期时间大于零,子弹不消失的问题
// Sets default values
AFPSProjectile::AFPSProjectile()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
// 3 秒后消亡。
InitialLifeSpan = 1.0f;
// 使用球体代表简单碰撞。
...
}
在3.3 - 设置发射物的碰撞和生命周期这一节中设置了子弹的生命周期为1.0秒,但是在运行的时候子弹并没有消失。
实现方法:在蓝图BP_FPSProjectile中点击BP_FPSProjectile(self),如图6所示在Detail面板中找到InitialLifeSpan 并修改其为大于零的值,为0则表示子弹不消失。这里是因为C++代码的编译不能改变蓝图的面板上的设置,并且以面板上的设置为主,这个跟Unity中的问题有点类似。
2.5、教程的3.5 - 在视口中添加准星编译不过问题
这里创建的FPSHUD类需要添加头文件“"Engine/Canvas.h",代码如下:
// Fill out your copyright notice in the Description page of Project Settings.
#include "FPSHUD.h"
#include "Engine/Canvas.h"
#include "FPSProject.h"
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);
}
}
2.6、无法移动的问题
这个实在是有点迷,我也没有找到更好的解决办法。情况是这样,当我完成“2.3-实现角色移动函数”这一个步骤的时,运行游戏我的角色无法移动,我不知道为什么,检查了各种设置和代码都对。最后当我把AFPSProjectGameModeBase里面的StartPlay方法注释掉
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "FPSProject1GameModeBase.generated.h"
/**
*
*/
UCLASS()
class FPSPROJECT1_API AFPSProject1GameModeBase : public AGameModeBase
{
GENERATED_BODY()
// virtual void StartPlay() override;
};
相应的 AFPSProject1GameModeBase.cpp里面该方法的实现也注释掉:
#include "FPSProject1GameModeBase.h"
//void AFPSProject1GameModeBase::StartPlay()
//{
// if (GEngine)
// {
// GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("juast test!"));
// }
//}
然后就可以奇迹般的运行了,真是迷。
2.7、无法添加网格模型
2.8 - 为角色添加第一人称模型中在代码里面动态添加了手臂的网组件后需要手动再在BP_FPSCharacter 的蓝图的FPSMesh组件中添加网格模型。然后,当改变了
FPSMesh = CreateDefaultSubobject(TEXT("FPSMeshShowsdsdsd"));
中的TEXT内容并编译
FPSMesh = CreateDefaultSubobject(TEXT("FPSMeshShowsdsdsd"));
蓝图中的FMSMesh组件就看不到Detail面板了,也即无法手动给该组件添加网格模型。这个时候就需要注释掉创建组件的代码编译一次,然后再取消注释并编译才可以恢复看到该组件的Detail面板,也即通过这样才可以改变TEXT里的内容而不影响蓝图中的FPSMesh的组件内容。
三、总结
3.1、 在生成的时候,出现了两次虚幻4编辑器崩的情况不知道什么原因;
3.2、声明了新的组件类型的变量一定要添加对应的头文件;
3.3、不要将模型一次性全部拖拽式导入到编辑器中;
3.4、我还没找到原因的问题是在Character类设置打印消息时候,打印的代码放在BeginPlay中不显示消息,一定要放在构造函数中,当删除掉GameMode中的StartPlay方法时,在Character类的BeginPlay中写打印消息可以显示。
3.5、蜜汁疑惑:无法移动,注销掉AFPSProject1GameModeBase里面的StartPlay方法才可以继续移动。