UE5——创建你的第一个游戏
Posted 在逆境中蜕变
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE5——创建你的第一个游戏相关的知识,希望对你有一定的参考价值。
文章目录
- 一、引言
- 二、游戏展示
- 三、整体大纲
- 四、内部实现
一、引言
对于刚接触UE的人来说,如何从0—>1创建出一个自己的小游戏,UE5官方提供了一个很棒的案例,如下
《Your First Game In Unreal Engine 5》视频原文
需要准备的材料有:
1、UE5引擎
2、Stack O Bot 提供的资源
3、耐心的看完这篇文章(浓缩了整个视频的精华)
二、游戏展示
三、整体大纲
1、创建工程
2、创建游戏中的第一个资产(一个小盒子)
3、创建地形(地形工具,切换到地形模式)
4、创建地形中的植被(草、石头)并刷到场景中
5、创建游戏的控制器包括(游戏模式、玩家控制器、玩家的pawn)
6、给角色添加动画蓝图以控制角色动作
7、创建场景中的NPC即AI(AIController+NavMeshBoundsVolume组件)
8、角色添加可以“下蛋”到脚底的功能,并给AI添加寻路至蛋的位置
9、丰富场景中的交互(按钮+门)
10、给场景内的角色移动增加扬尘效果(特效)
11、给角色行走添加声音
12、在门开启的时候给相机添加抖动
13、游戏打包
四、内部实现
1、创建工程
打开光照混合器,并将下面包括“创建天空光照”在内的几种光照都加入到环境中
经过上述操作,场景中就从一片黑暗变得丰富多彩了
Tips:
Ctrl + l:旋转书标可以改变太阳光(直射光)的直射方向
Ctrl + space:可以呼出资产面板(非常爽)
2、创建游戏中的第一个资产(一个小盒子)
将上述资源及对应的图片资源导入UE5中,有如下几种资源
接下去分别对“M_Metal”、“M_Carbon”、“M_Plastic”进行材质赋予
上面这种,是最基础的,即将一种颜色赋值给一种材质
上图是将一张贴图赋予材质的表面作为基础色,并将存有法线信息的图(法线图)设置到该材质的表面使其产生凹凸感,texcoord将两张图进行平铺即扩展使纹理更细密,下面两张图也是大同小异,不在介绍
如果对渲染不了解的可以不去研究material的连线什么含义,直接全部采用第一张的最简方式也可以
经过上述几种材质的加持,盒子便带有塑料、布料、金属等特质
3、创建地形(地形工具,切换到地形模式)
UE5自带了地形工具,如下进行切换
之后对地形进行创建,设定好需要的尺寸后点击创建
如果看不到创建出来的地形,设置一下场景中的显示,勾选上地形
创建一个材质并赋予其材质,如下的“My_LandScape_M”,并创建两个层分别是"Grass"、“Sand”
接着创建层信息,如下
至此我们可以通过笔刷对场地进行绘制,如下,场景可见两种颜色
接下来我们对两种环境"沙漠"、"草地"进行装饰,只需要将地形的材质进行扩展即可,原理同其他材质一般
此时能够看到沙漠和草地均出现了纹理
4、创建地形中的植被(草、石头)并刷到场景中
只有颜色和纹理的地形终究还是缺了点立体感,因此我们要在场景中加入各种植被,如草、石头、花、树
1、草地
创建如下植物
设置上述创建的植物的草地网格体为我们导入的草,其他诸如草地密度等参数可以自行调整
接着设置草的material,要注意的是要将草的混合模式设置为"已遮罩"
其中要注意上图右下角的两个节点,分别是左边"LandscapeLaerSample",右边是"LandscapeGrassOutput",通过设置这两个节点,可以在地形为Grass自动生成草,最后我们将一开始创建的"地形草地类型"设置到"LandscapeGrassOutput"中,草地即可自动生成
2、其他植被
相比起草地,其他类型的植被需要我们手动去刷,而不是自动生成,首先我们需要将植被创建出来
对于网格体面数比较多的植被,需要勾选编译Nanite,否则会出现植被制作完之后加载不出来的情况,Nanite技术在Matt虚幻引擎4->5的转化视频中、Chris Murphy在教程中会介绍
创建植物
同草一样将网格体设置给该植物
需要注意的是,岩石的体积较大,不像草一样能够不添加碰撞体,因此我们需要设置岩石的碰撞为"BlockAll"
下图为该岩石的material,不展开介绍
最后将岩石添加到植被中,如下
之后就可以笔刷刷岩石了
其他植物的创建同上,最终呈现的效果如下
5、创建游戏的控制器包括(游戏模式、玩家控制器、pawn)
1、游戏模式
GameMode定义了我们当前的游戏。它规定了游戏规则、评分、允许哪些actors在游戏中存在,以及谁可以进入游戏。
创建好GameMode之后,需要将GameMode中的**“玩家控制类”、“默认pawn类”**,并且到项目设置中将我们创建的GameMode设置上去,如图二
2、玩家控制器
PlayerController作为游戏中角色和玩家之间接口,本质上代表了玩家的意志,通常情况下,我们会将角色的所有输入定义在PlayerController里面,特别是对于一些复杂的情况,例如多玩家游戏或者游戏运行中动态更改角色的游戏,在这些游戏中由PlayerController对角色发出指令。
另外在某些情况下,将输入定义在PlayerController是必须的,例如超级马里奥这种角色可能会死亡并重生,重生之后会得到一个新的角色,导致存储在角色上的数据会被重置。但是PlayerController是在整个游戏中持续存在的,比如马里奥中的金币,因为存在PlayerController中,因此不会被重置。
这里没有将玩家的控制放在Controller中,转而放到了Pawn中,不过也不影响游戏的运行,因为这是一个单人单机游戏
3、Pawn
Pawn是Actor的子类,它可以充当游戏中的化身或人物(例如游戏中的角色)
我们会在"MyCharacter"中赋予角色移动及转向功能,这几个输入功能几乎是和整个游戏直接绑定的(不会随着游戏状态的变化而发生变化,例如W由前向行走变成释放技能),因此我们直接在输入设置中配置如下图
接着赋予这几个输入事件以功能,如下图
6、给角色添加动画蓝图以控制角色动作
使用UE自带的动画蓝图实现
1、导入角色对应网格体、骨骼、动画序列
角色材质的设置如下:
2、创建动画蓝图,并回到角色中将"动画模式"变更为使用动画蓝图,"动画类"变更为刚刚创建的动画蓝图,如图二
3、使用状态机对动画进行控制,分别是Idel、Walk、Run之间的转变
1、创建状态机节点并连接
2、在状态机中设置转化条件及对应动作
总图
Idel节点
Idel To Walk条件
Walk To Idel条件
Walk/Run节点在4中单独讲述
4、Walk/Run
这里我们将Walk/Run设置为同一个状态,通过角色身上的速度值来改变角色动画:
需要先获取角色速度,如下,在蓝图的事件图表中定义Speed,并对其进行赋值
创建混合动画,并暴露混合动画的控制变量Speed,如图二中**"水平坐标"的设置**
设置Walk/Run节点
7、创建场景中的NPC即AI(AIController+NavMeshBoundsVolume组件)
创建AIController;将AIController设置给场景中NPC;在场景中添加寻路检测NacMeshBoundsVolume;编写AIController蓝图,NPC得以获得目标
AIController的逻辑会在8中给出
Tips:P可以切换NavMeshBoundsVolume组件的可见性
8、角色添加可以“下蛋”到脚底的功能,并给AI添加寻路至蛋的位置
创建“蛋”的蓝图(继承自Actor);在PlayerController中创建“下蛋”逻辑;在AIController中创建“寻蛋”逻辑(包含FindBall函数的实现+NPC找到蛋后的逻辑);在“蛋”蓝图中实现重叠销毁自身逻辑
上述实现分别对应下面5图
9、丰富场景中的交互(按钮+门)
1、使用重叠检测实现按钮的开关功能
当按钮与其他物体重叠时,对按键执行一个向下移动模拟按下同时触发“碰撞检测组件”的碰撞开始事件(详看下面);结束重叠时反之
timeline节点的设置如下
2、创建碰撞检测组件用于监测按钮的按下和弹起
碰撞检测组件继承自ActorComponent,可以挂接到任意Actor上,组件承担事件分发的功能
3、根据碰撞检测组件的触发事件开关门
定义“OpenDoor”、“CloseDoor”事件,并且检测按钮对象身上的碰撞检测组件,如果碰撞了就执行“OpenDoor”;反之执行“CloseDoor”
注意左下角的Trigger需要对其开放(眼睛张开),方可在场景中指定其对象
timeline节点的设置如下
最后我们需要将场景中的门指定其Trigger(对应的按钮拖入)
10、给场景内的角色移动增加扬尘效果(特效)
创建Dust特效;将其挂载在动画对应的帧上
11、给角色行走添加声音
与挂接特效一样,只是创建的对象变成了音效
12、在门开启的时候给相机添加抖动
UE自带了相机抖动的基类,直接使用即可,创建完后只需要在门开关状态发生变化后播放相机抖动即可(如本章最后一图)
13、游戏打包
如若出现上图诸如android等左侧的警示符,只需更新/下载对应的SDK即可(Visual Studio内找)
最简单的 UE 4 C++ 教程 —— 隐藏并禁用游戏中的 Actor
【原教程是基于 UE 4.18,我是基于 UE 4.25】
接上一节,要在游戏中完全隐藏角色,你必须做三件事。
- 你必须禁用它的碰撞,
- 禁用它的滴答声,
- 并将其隐藏在游戏中。
您可以将代码添加到任何 actor 子类实例上。对于本例,我创建了一个单独的 actor 来演示它的用途。
创建一个名为 HideActor 的 actor。在头文件中我创建了两个:通过 bool HideInGame 来跟踪,如果我们想禁用 actor 的话,并在 void DisableActor 运行所有我们需要禁用的元素。我们将这两个变量放在 Disable 类别中,以使它们与 actor 的其他属性区分开
HideActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "HideActor.generated.h"
UCLASS()
class UNREALCPP_API AHideActor : public AActor
{
GENERATED_BODY()
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, Category = "Disable")
bool HideInGame;
UFUNCTION(BlueprintCallable, Category = "Disable")
void DisableActor(bool toHide);
};
在 BeginPlay() 中,我们检查 HideInGame 是否为真。如果为真,则运行 DisableActor() 。DisableActor() 隐藏actor,禁用它的冲突,并禁用它运行每一帧。
HideActor.cpp
#include "HideActor.h"
// Called when the game starts or when spawned
void AHideActor::BeginPlay()
{
Super::BeginPlay();
if (HideInGame)
{
DisableActor(HideInGame);
}
}
// Called every frame
void AHideActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AHideActor::DisableActor(bool toHide)
{
// Hides visible components
SetActorHiddenInGame(toHide);
// Disables collision components
SetActorEnableCollision(false);
// Stops the Actor from ticking
SetActorTickEnabled(false);
}
效果演示
以上是关于UE5——创建你的第一个游戏的主要内容,如果未能解决你的问题,请参考以下文章