博主写完课设回来了!
既然是通关(写完作业后回来),穿越过来,一定是带回来很多东西的。先说说我初步使用ue5完成一个简单的游戏项目的感受吧:
一定是勤加练习,学过C++之后(来学UE5大多都应该学习了C++)你可以根据编译器中不同字段的颜色来判断这个字段大概是干什么用的,在学习刚开始时,你一定会觉得有些东西难以理解,但是你学过C++对某些东西会感到熟悉,基本语法结构不会有什么问题,静心下来慢慢读也能够读懂大概意思。在练习到一定程度之后,你会发现有些句子一敲打出来你就能够知道是什么意思,然后和其他的代码联系起来,你大概就能猜到这个功能要干嘛。继续加深练习,你就能根据自己想要的功能去实现代码了(博主现在还没有达到这个水平。。。)
总结一下就是多练,先跟着别人练习,然后跟着一些项目练习,最后自己独立写项目。大概就是这么一个过程。好了回归正题,我们今天来学习一下今天将要学习的东西。
在前面的学习中,我们知道用UE5自带的宏来联系C++和蓝图,我们就可以用C++实现功能,蓝图来映射对象了。今天就学习一下把前面的结合起来创建一个实例(这是UE5必须得会的),我们以一个普通的正方体入手:(我以后的教学都放在Teach这个工程下)
我们先创建一个C++类来编写这个正方体的基本逻辑:
因为我们想要这个正方体可以被作为对象,所以我们在选择C++类的父类时,选择Actor作为父类(在UE中大多数对象的父类都是Actor)并命名为CubeActor公有类
然后我们到VS当中,我们这里就实现让这个立方体自行向上移动的功能吧(在UE5中z轴为向上)
先在h文件宏声明一个变量,命名为AutoMoveSpeed,具体代码如下:
UPROPERTY(EditAnywhere,BlueprintReadWrite,Category=Cube);
float AutoMoveSpeed;
因为我们想在任何地方可以编辑就是EditAnywhere,在蓝图中可读可写BlueprintReadWrite
那为什么是float?,因为UE中以厘米为单位,而且行走路程也不会是整数的你总不会是小学数学题上面的小明吧?
然后我们到cpp构造函数里面初始化一下: (因为这里没涉及啥其他的,可以直接在声明时初始化掉,但是博主养成了习惯在构造函数里面初始化)(年纪大了,脑子转不过弯,见仁见智,在简单的时候简单最好)
AutoMoveSpeed = 100.f;
然后我们想让他一直向上自动移动,我们就需要在Tick函数中实现Z轴的改变。我们需要先获取该对象当前的位置,然后再根据当前的位置添加,最后设置位置。
FVector StartLOC=this->GetActorLocation();
StartLOC.Z += AutoMoveSpeed*DeltaTime;
this->SetActorLocation(StartLOC);
这里为什么要乘以DeltaTime?这个可以相当于1/当前帧率,因为Tick函数是每一帧率调用一次乘以DeltaTime就是让改变的值变小一点,或者换算单位,把每帧率换算成每秒,比如这里的AutoMoveSpeed就成为了每秒移动的距离。
(听了这个解释之后应该能猜出来Tick是很吃性能的,一般我们不会在Tick函数里面搞事情,就算需要持续进行的操作都不会用Tick(比如中毒也是以秒为单位),大多数情况有其他更加好的替换办法(竞技类游戏也看设备好不好就是这个方法不好替换的原因,设备越好,同样的技术打出来的操作更厉害),比如设置一个响应时间,用定时器定时去调用我们这里主要是为了方便,后面会讲解定时器)
然后我们编译运行一下(如果这里报错了可能是UE实时编译的问题,关掉UE在进行编译(我们也可以关掉UE的实时编译功能,CSDN上有教学,可以自行搜索一下))
然后进入Content文件夹新建一个Blueprints文件夹(一般我们的蓝图类就放在这个文件夹下)
右键内容浏览器空白部分创建蓝图类,在选择父类时选择我们刚才创建的那个类,可以在所有类中搜索一下。并将这个蓝图类重命名为BP_CubeActor(BP_前缀用来区分我们自定义的蓝图类和C++类)
然后双击这个蓝图类,进入蓝图编辑器,在组件中给到这个类一个立方体组件,然后在蓝图编辑器中编译一下
最后在地图中拖入一个正方体,运行游戏就可以看到效果了:
现在你已经会创建Actor了,去给我做个游戏出来(手动滑稽) (不过根据此原理做一个简单的跑酷游戏了)