UE4开发遇到的一些问题

UE4开发遇到的一些问题

十月 23, 2020

目录

1.前言
2.FPS开发中遇到的问题


前言

有天无聊翻自己空间突然发现我好像还有个博客…

啊,好久没写博客了,上次的博客都是3月份的了….
最近因为无聊开始接触了下虚幻4引擎,学习了段时间后就开始开发自己的游戏了。

刚开始的时候是使用虚幻引擎的蓝图系统来开发的,因为刚开始的时候对这个引擎的使用方法还不是很了解,所以就先用比较容易的蓝图来实验。
在了解使用方法后我采取了C++和蓝图共同开发模式,C++用于底层实现蓝图实现一些简单和重复的事情。

打个比方如果我要调整一个模型的位置,如果使用C++就会导致模型位置固定或者很难修改,但是蓝图可以自由的可视化调整,但是如果我要实现一个换弹的计算,使用蓝图就会让逻辑十分难理解,C++就很清楚明了。

再啰嗦几句,我现在制作的游戏预计到2021年下半年前应该可以做出DEMO,到时候欢迎来当小白鼠试验游戏BUG和游戏问题;


FPS开发中遇到的问题

嗯,开发的道路真的艰辛啊….

既然是使用引擎开发嘛,肯定会要使用API来开发嘛;
但是,我这边不是很建议去看中文官网的文档,中文官网文档真的太老了,老到什么程度呢?实例中使用的很多变量,函数其实很多都是已经废弃的,我在某个QQ群里遇见被某个变量或者函数搞到心态爆炸的人数起码有3-4个。

所以嘛,这边推荐去看一个官方实例(指使用UE4引擎创建的那个模板)如果遇到不明白的地方可以去英文版的官方去找API。

嗯…感觉说了点废话。

那就说下我遇到的一些问题:


如何在世界动态的生成一个Actor

我感觉可能很多看中文官方实例的都卡在这个地方了,就是官方那个FPS教程;
我在这边说一个我自己的思路,首先建立一个子弹(或者其他的你要的)类,这个类继承Actor。这个子弹(或者其他什么东西)里我推荐只写与这个子弹相关的功能,比如打中人物造成的伤害就是由这个子弹来造成。
然后在你要生成Actor的函数中这样写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ABullets* Bullets;
UWorld* const World = GetWorld(); //获得世界(在UE4中一个关卡可以理解成一个世界)

if(World != nullptr){

//因为我是要让子弹从屏幕正中心发射的所以要获得摄像机位置和旋转
FVector CameraLocation;
FRotator CameraRotator;
GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint(CameraLocation, CameraRotator);
FVector EndLocation = CameraLocation + CameraRotator.Vector() * MaxRange /*MaxRange是我设置的最大射程,变量类型是int*/ ;

if(!IsAim /*IsAim是判断是否瞄准,变量类型为Bool*/){

/*Recoil是用于模拟枪械后坐力,变量类型为int*/
float X = (Recoil * -100) + ((Recoil * 100) * rand()) / (float)(RAND_MAX + 1);
float Y = (Recoil * -100) + ((Recoil * 100) * rand()) / (float)(RAND_MAX + 1);
float Z = ((Recoil * 10) * rand()) / (float)(RAND_MAX + 1); //总不可能向下飘吧...

EndLocation.X += X;
EndLocation.Y += Y;
EndLocation.Z += Z;
}

//在世界中生成Actor
FActorSpawnParameters ActorSpawnParams;
ActorSpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding;
World->SpawnActor<ABullets>(Bullets->GetClass(), EndLocation, CameraRotation, ActorSpawnParams);
}

或者可以使用这样的办法:

1
2
3
4
5
6
7
8
9
10
11
AActor* TempActor;
ABullets* Bullets;

//要创建的Actor位置和旋转值
MakeTransform MakeTransform_Return = UKismetMathLibrary::MakeTransform(FVector(0.0, 0.0, 0.0), FRotator(0.0, 0.0, 0.0), FVector(1.0, 1.0, 1.0));

//生成一个Actor,但不执行构建函数
TempActor = UGameplayStatics::BeginDeferredActorSpawnFromClass(this, ABullets::StaticClass(), MakeTransform_Return, ESpawnActorCollisionHandlingMethod::Undefined, this);

//在世界中生成Actor并调用构造函数
Bullets = CastChecked<ABullets>(GameStatics::FinishSpawningActor(TempActor, MakeTransform_Return), ECastCheckedType::NullAllowed);

自定义武器生成

这个问题我只能说是给个思路,因为我的方法有点复杂时间问题我就简单的说下,下次专门写一个文章来详细的告诉解决办法。

我想说明的是要自定义生成枪械其实就是一个专门用来存放枪械的背包。
首先,要创建一个数据表来存放这个枪械的信息,比如这个枪械的类,子弹数量,枪械的模型地址。
然后在你要生成的时候调用构造函数,然后这个构造函数的形参要这个枪械模型的地址和子弹数,然后再将这个生成的枪械放到世界中并附加到你人物模型的插槽上。


嗯….写了点感觉好像要说的有点多,要不我之后专门写一个来说明问题算了;

结语


嘛,就先写这么多吧,其实这段时间学到的东西挺多的,我在想哪天做个系列教程好点,就当记录下吧方便以后忘记了还能重新看一边。