紧接上回,本篇文章将和大家一同整理总结UE4关于角色网格、动画、子弹类和HUD的简单实现。
(五)角色添加网格
Character类为我们默认创建了一个SkeletaMeshComponent组件,所以我们仅仅需要做的就是使用哪一个静态网格模型。接下来我们为我们的FPSCharacter类创建一个蓝图,这样我们可以简单的把资源指定给静态网格模型这里,并且方便以后操作添加的组件。作为开始,我们首先要导入一个第三人称的静态网格模型,最后我们设置成两个网格,一个是我们自己看的,另外一个是其他人看到的。
1.添加一个完整的全身的网格,现在点击这里载入资源吧。我把我们要用到的所有资源全部放进去了,GenericMale.fbx文件就是有全身网格的,HeroFPP.FBX是等下我们要用到的自己看自己只有胳膊和武器的网格,Sphere.FBX是个球体网格模拟子弹,crosshair.TGA是瞄准的十字准心,FPP_Animations文件夹存放的是胳膊和武器的那个网格的用的的动画。这是我的目录结构,仅供参考。
大家把他们都载入进来吧,注意一点就是,注意载入全部,比如载入网格,需要勾选载入材质,载入动作的时候,要选择网格,如下:
好了,关于资源载入的问题,就一次性说清,以后就不说了。
2.在蓝图文件夹内,新建蓝图
这里注意!在下拉框中选择FPSCharacter,使其作为蓝图的父类,给蓝图命名为“BP_FPSCharacter”,打开它。
3.选中Mesh,指定网格,并把Mesh的z轴值改为-88
完成以后就应该是这样了,为什么是-88?因为是已经调整好的数值,当使用自己的网格模型时,需要自己调整,最终目标是 使得网格被外面的胶囊组件包裹,并且方向为箭头所指向的方向。这将会使得模型在世界中正确行走,方向正常。可以直接在视图中调整,也可以直接设置数值。
4.编译保存蓝图,现在,我们要告诉我们的游戏模型使用最新我们创建的蓝图类来作为游戏角色的pawn物体,而不是我们之前创建的父类:FPSCharacter。返回VS,在模式的CPP文件构造函数中,删除
DefaultPawnClass = AFPSCharacter::StaticClass();
并添加如下代码:
AMyNewFPSGameMode::AMyNewFPSGameMode(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
//DefaultPawnClass = AMyNewFPSCharacter::StaticClass();
static ConstructorHelpers::FObjectFinder<UBlueprint> PlayerPawnObject(TEXT("Blueprint'/Game/Blueprints/BP_FPSCharacter.BP_FPSCharacter'"));
if (PlayerPawnObject.Object != NULL)
{
DefaultPawnClass = (UClass*)PlayerPawnObject.Object->GeneratedClass;
}
}
(这里提前说一下,大家无视我的类名,按照自己的来即可)这里有非常重要的一个知识点:在C++中引用蓝图(这样,就可以打通C++和蓝图了!),更准确的说应该是引用资源,这里的蓝图是以资源出现,等下我们也会发现在引用十字瞄准点的时候,使 用的是同样的方法,那就是:
static ConstructorHelpers::FObjectFinder<UBlueprint> PlayerPawnObject(TEXT("Blueprint'/Game/Blueprints/BP_FPSCharacter.BP_FPSCharacter'"));
TEXT里面的是资源的路径,获取资源路径有个小技巧,就是在内容浏览器中右键资源,选中复制引用命令,就会把具体的位置复制到剪贴板中了。
5.回到编辑器,选择编译,等待编译成功进入游戏测试。如果你移动摄像机,你会发现角色的影子,按下F1+Shift键,来获得鼠标指针,点击上面的弹出,这 时候就可以在世界中随意的移动摄像机来看到角色的网格。
(六)更改摄像机试图(添加摄像机组件)
在上一节的结尾,默认的摄像机是在网格的脖子里,现在我们来创建一个正确的摄像机,并且可以设置摄像机的一些属性比如位置和视图。我们通过给我们的FPSCharacter类添加一个摄像机组件来完成(CameraComponent )。首先,我们为FPSCharacter添加一个属性来引用摄像机组件。
1.在角色.h文件里面添加下面的代码来添加一个公有变量FirstPersonCameraComponent。
/** First person camera
* 为摄像机新建变量,引用摄像机。在构造函数中做初始化------C++中添加组件!,蓝图中赋值。
*/
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)
TSubobjectPtr<UCameraComponent> FirstPersonCameraComponent;
2.我们在FPSCharacter的构造函数中创建真正的组件,
在FPSCharacter的构造函数中添加如下代码,来创建一个摄像机组件并且把他依附到胶囊组件上。
AMyNewFPSCharacter::AMyNewFPSCharacter(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
/********************创建、初始化摄像机********************************/
//创建摄像机组件
FirstPersonCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
FirstPersonCameraComponent->AttachParent = CapsuleComponent;
// 摄像机的位置稍微比眼睛要高
FirstPersonCameraComponent->RelativeLocation = FVector(0, 0, 50.0f + BaseEyeHeight);
// 允许玩家控制旋转
FirstPersonCameraComponent->bUsePawnControlRotation = true;
}
3.我们来调整摄像机的位置到眼睛的位置,在蓝图中也可以作调整,这里只用调整他的位置信息,不用调整旋转,因为旋转会被鼠标改变。这部分代码就是上面的下两行。
4.好了,进游戏测试吧,摄像机应该在角色的头上,所以当你向下看的时候,将会看到角色的头部!
(七)添加第一人称网格
常规的FPS要准备和处理两套网格,一套是其他人看到的自己,但是对于自己来说它是隐藏的,这个就是全身的网格;还有一种是只有武器和手臂的网格,他们要依附在摄像机上,当玩家是第一人称的时候才被看到。为了实现这个,我们首先要保持现有的网格,给它命名为“Mesh”,并且为我们的第一人称网格准备一个新的静态网格模型。
1.角色的.h文件中新建变量来引用新的网格。
/**
* 出生的时候的网格,只有手臂和武器。 也是添加一个变量引用新的网格
*/
UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
TSubobjectPtr<USkeletalMeshComponent> FirstPersonMesh;
2.在构造函数中,添加如下代码来创建配置网格
///********************创建、初始化只有手和武器的网格********************************/
创建一个网格组件,他只有手臂和武器
FirstPersonMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonMesh"));
FirstPersonMesh->SetOnlyOwnerSee(true);// 仅仅只有这个Pawn才可以看到
FirstPersonMesh->AttachParent = FirstPersonCameraComponent;
FirstPersonMesh->bCastDynamicShadow = false;
FirstPersonMesh->CastShadow = false;
///********************除了自己,其他人看到全身*******************************/
除了自己其他人都能看到
Mesh->SetOwnerNoSee(true);
上面其一部分代码中,说明了仅仅只有这个Pawn才可以看到,依附到第一人称摄像机,取消阴影;后一部分代码实现的功能呢,看注释把。
3.编译C++代码,打开BP_FPSCharacter 蓝图,选择FirstPersonMesh组件,右面Detail面板中指定。调整其位置属性为:{240,0,35},旋转属性{-180, 50, -180}.最后应该得到这么一张图
OK,进入游戏测试吧,