![fa60245b1978de780bf7dcfe61071952.png](https://img-blog.csdnimg.cn/img_convert/fa60245b1978de780bf7dcfe61071952.png)
从这章开始我们将从零创建个
FPS(first person shoot)游戏。
关于射击游戏的种类我以后会出个文章详细讲解。
我先说说FPS游戏制作的简单原理。
我们在玩许多FPS的时候可能都会认为自己在控制1个完整的人物。但其实你留心发现的话,你把视角往下看却看不到你的脚,你只能看到你的手臂而已。所以大多数FPS的制作其实都是只做手臂的动画而已。让人以为自己在控制整个人物。事实上只控制手臂而已。但为啥看别人是全人物的呢?那是因为我们准备了两套模型,及两套网格(Mesh)。一个给自己看(手臂),一个给别人看(全身)。很多人会问为什么要这样做?这样做的好处是:
一,如果是全模型的话,会考虑整个手臂动作于身体的兼容性。看起来就可能会比只有手臂的动作僵硬些。
二,优化会比全模型的好一点。也易于操作。
缺点:
看不到自己的脚,只能看到手臂。但无伤大雅。
所以本章你将学到:
一,按键绑定。
二,创建个第一人称游戏角色与
摄像机跟踪。
首先,新建个项目,如图选择空项目,选好保存目录。(注意名字要全英文)
![9f1ef59b374c907cb928999aa0f963a7.png](https://img-blog.csdnimg.cn/img_convert/9f1ef59b374c907cb928999aa0f963a7.png)
创建好后。打开虚幻4,在左上角文件里新建个c++类,如图。
![d2b062a1ed5af6a07d3fb5fae3c347d6.png](https://img-blog.csdnimg.cn/img_convert/d2b062a1ed5af6a07d3fb5fae3c347d6.png)
然后选character,如图
![e0cf132cab8c9ab0f41ed0c9043645f0.png](https://img-blog.csdnimg.cn/img_convert/e0cf132cab8c9ab0f41ed0c9043645f0.png)
名字随意,我打的是Schararter(路径有误),注意选公有。
创建编译好后,回到VS。可以看到他显示了我们刚才创建的类。(红线为visual Assist的bug醉)
我们先回到虚幻4界面,创建个人物蓝图,选择自己创建的角色类
然后起名为PlayerPawn;
将它拖到地板上面,并在属性栏里搜索possess,选择player 0;
这样子就可以不用GameStart组件,将它删掉。默认会从我们创建的角色视角开始。
之后切到VS2017在SCharacter.cpp文件下找到这位置打
![177d9d0ca3b1e61e65fae006bb5ae22f.png](https://img-blog.csdnimg.cn/img_convert/177d9d0ca3b1e61e65fae006bb5ae22f.png)
![58d8b639397878e33631cf51234aaefd.png](https://img-blog.csdnimg.cn/img_convert/58d8b639397878e33631cf51234aaefd.png)
PlayerInputComponent->
BindAxis(“MoveForward”, this, &ASCharacter::MoveForward);
PlayerInputComponent->
BindAxis(“MoveForward”, this, &ASCharacter::MoveForward);
PlayerInputComponent->
BindAxis(“MoveRight”, this, &ASCharacter::MoveRight);
PlayerInputComponent->
BindAxis(“LookUp”, this, &ASCharacter::AddControllerPitchInput);
PlayerInputComponent->
BindAxis(“Turn”, this, &ASCharacter::AddControllerYawInput);
因为网站字符大小所限,所以只能这样排版。
解释:
这是绑定按键的一个类函数BindAxis,主要是通过按键改变位置的变化和方向。
括号里的四个参数分别是
(“MoveForward”, this, &ASCharacter::MoveForward);
(绑定按键的名字,操作对象,按键时应发生的事件)
绑定按键的名字
这里我取得是“MoveForward”为前后行走的按键的名字,(注意名字不是乱取的)因为
你还要在UE4里设置绑定键.
操作对象
我们想要操作的角色就是我们创建的角色,所以用this。
按键时应发生的事件
MoveForward是我们自定义的函数,我们需要在头文件创建它。
在protect下打
void MoveForward(float x);
void MoveRight(float x);
//函数名不一定要跟我一样,但起码得看的懂和为以后的代码布局早想。
之后回到cpp文件在独立的区域打
void ASCharacter::MoveForward(float x)
{
AddMovementInput
(GetActorForwardVector()*x);
};
void ASCharacter::MoveRight(float x)
{
AddMovementInput
(GetActorRightVector()*x);
};
解释:AddMovementInput()
该函数可以改变角色的位置,改变的位置为括号的数值。
括号里的参数为角色的x轴的位置,也就是前后位置。
GetActorForwardVector()是获取当前角色的位置。而里面的变量x就是我们按键改变的数值。
这样的的话就可以达到前后移动效果。
左右同理。
这样就实现了前后左右移动。
那鼠标呢?
我们已经弄好了。
PlayerInputComponent->BindAxis
(“LookUp”, this, &ASCharacter::AddControllerPitchInput);
PlayerInputComponent->BindAxis
(“Turn”, this, &ASCharacter::AddControllerYawInput);
因为虚幻4已经写好了鼠标控制
AddControllerPitchInput;
AddControllerYawInput;
我们只需要调用就好了。
设置好后回到虚幻4编译。
然后在左上角编辑->项目设置->按键这块输入相对应的按键名字。如图
![9f58ee7ca7c335552fe7ec1aab9fa84d.png](https://img-blog.csdnimg.cn/img_convert/9f58ee7ca7c335552fe7ec1aab9fa84d.png)
注意名字一定要与代码的所答的名字对应,不然没有效果。
好了之后就可以移动了。
但目前只是个空壳,未免有点难看。我们先给他个躯体吧。
第二部分:创建第一人称角色
将模型放到我们创建的虚幻4游戏文件的Content文件夹里。
回到VS2017
我们先创建一个Mesh网格
你可以理解为模型所需要的容器。
在头文件里protect下打
UPROPERTY
(VisibleAnywhere, BlueprintReadOnly, Category = “FPcamera”)
class UCameraComponent* FPcamera;
UPROPERTY
(VisibleAnywhere, BlueprintReadOnly, Category = “FParm”)
class USkeletalMeshComponent* FParm;
以解释过,不明白可看上一章。
回到cpp文件里
在第一个函数里打
FPcamera = CreateDefaultSubobject
<UCameraComponent>(TEXT(“FPcamera”));
FPcamera->SetupAttachment
(GetCapsuleComponent());
FPspringarm->bUsePawnControlRotation = true;
FParm= CreateDefaultSubobject
<USkeletalMeshComponent>(TEXT(“FParm”));
FParm->SetupAttachment(FPcamera);
解释:
CreateDefaultSubobject 为创建组件尖括号里为组件类型,
TEXT里为组件名称。
setupattachment为绑定组件,即互相绑定的组件都要去那跟那,不能分开。
括号里为绑定的组件。
因为你不想看到你的眼睛(FPcamera)和手臂(FParm)分离吧。
bUsePawnControlRotation = true;
与许控制主角的转向。这样的话,摄像机就可以移动了。
输入好后,回到UE4编译。
完成之后
在新建的网格组件
添加我们下载好的模型
之后调一下摄像机的位置
就会看到
![53130a36e1afbe05edbbd4264e5cb7ea.png](https://img-blog.csdnimg.cn/img_convert/53130a36e1afbe05edbbd4264e5cb7ea.png)
大工告成了。