Skip to content

Week2

这节课有点事,所以漏了一些内容,因此使用AI来生成了部分内容捏😋(指笔记部分)。主体是介绍UE的一些类。

了解UE5常见的类

Actor类

Actor是UE中的基类,是一种可以放置在关卡(Level)中的对象,从游戏场景中的静态网格体(Static Meshes),到声音、摄像机、玩家角色等,都是Actor。

1732794301001

如图所示,UE5中可以设置几种不同的Actor:

  • Actor:基类,可以放置在关卡中。
  • 角色(Character):可以移动的Actor,通常用于玩家角色,属于一种特殊的Pawn。
  • Pawn:可以移动的Actor,可以被控制。
  • 点光源(Point Light):发光的Actor。
  • 玩家出生点(Player Start):玩家角色的初始位置。
  • 触发框(Trigger Box):触发器,在场景中的特定区域内触发事件。
  • 触发球体(Trigger Sphere):球形触发器。

PlayerController 类

PlayerController 是一个用于处理玩家输入和控制的类。它是 PlayerPawnCharacter 之间的中介。在多人游戏中,每个玩家都有一个对应的 PlayerController

  • 负责处理玩家的输入(如键盘、鼠标、游戏手柄等)。
  • 管理 PawnCharacter 的控制,玩家通过 PlayerController 控制游戏中的实体。

GameMode 类

GameMode 定义了整个游戏或关卡的规则和玩法,它是整个关卡的“控制中心”。你可以在 GameMode 中配置玩家的 Pawn 类型、玩家开始时的位置、得分规则、游戏胜利条件等。

  • 管理游戏的核心规则和流程(例如,选择玩家角色、设置计时器等)。
  • 在单人游戏和多人游戏中,GameMode 负责处理大部分游戏逻辑。

GameState 类

GameState 用于存储有关当前游戏状态的信息,它在 GameModePlayerState 之间充当数据的传递者。GameState 是一个服务器端类,用于存储全局游戏信息(如当前回合、得分、时间等)。

  • 存储全局游戏信息,供所有玩家访问。
  • 可以用来实现同步游戏状态的逻辑,尤其是在多人游戏中。

Widget 类(UMG)

Widget 类用于实现用户界面(UI)。在 Unreal 中,UI 组件是通过 UMG(Unreal Motion Graphics)来创建的。你可以创建各种类型的 UI 元素,如按钮、文本框、进度条、图像等,并通过蓝图来处理 UI 逻辑。

  • 用于创建并控制游戏中的用户界面。
  • 支持丰富的 UI 设计与交互功能,如动态更新文本、响应按钮点击等。

作业:设计简单逻辑和UI

要求实现:

  • 物件规则:射击命中方块,获得积分X分;子弹命中方块后销毁;方块被子弹命中后,缩放为y倍,再次被命中后销毁
  • 游戏流程:游戏开始时随机几个方块成为“重要目标”,射击命中后获得双倍积分;游戏开始后限时T秒,时间到后游戏结算,打印日志输出每个玩家获得的积分和所有玩家获得的总积分

拓展:利用UMG制作结算UI替代日志打印;支持多人联机。

本次作业使用蓝图实现逻辑。

设计逻辑

玩家加分逻辑

为了实现计分逻辑,首先设置Score变量,根据蓝图结构确定,要在BP_FirstPersonCharacter中添加整数变量Score,然后设计加分逻辑:根据输入的方块分数和是否为“重要目标”来进行加分。

在蓝图中划出Score Counter的注释块方便管理,添加Custom Event并命名为ScoreHandler来处理分数,接收参数IsImportant和ScoreAmount,获取角色的Score变量(先添加这个变量才能Get),然后设计对应的加分逻辑并赋值回去。如下图所示:

1732796094641

碰撞调用加分

子弹的蓝图在BP_FirstPersonProjectile处,于是在此处添加逻辑:Event Hit触发后调用Other来获取方块的Actor,使用Cast to方法来得到对象,然后调用ScoreHandler函数来进行加分。如下图所示:

1732796401080

碰撞后缩小和销毁

把方块转换成蓝图类,然后添加逻辑:首次集中缩小,二次击中销毁,注意设置加分逻辑在销毁之前。

1732797862997

随机重要目标设定

把方块转换成蓝图类,在蓝图类内加入IsImportant的布尔值,默认设为0,然后在GameMode里获取所有方块实例,使用Random函数来随机设定,完成初始化。

1732797371146

我在此处使用了整数随机数生成器,并且通过大小比较来控制重要目标的生成比例,完成对方块的初始化。

加入倒计时

在GameMode中加入时间的float变量(此处我命名为TimeLimit),然后使用Set Timer by Event来计时并调用函数来减去时间。如下图所示:(仅展示部分逻辑)

1732796668746

设计UI

设计一个结束页面,使其能够展示分数,这里需要用到UMP组件,设计时注意先加入画布面板,然后设计有关部分。设计时使用锚点有利于在不同分辨率上保持位置的一致性。如下图展示:

1732796887080

1732796906027

这里我设计了两个按钮来实现重启和退出;红色文本框内配置了GetText来获取分数。

另外再设计一个页面来显示剩余时间:

1732797067159

结束页面应该在游戏结束(倒计时归零)后再打开,时间的UI应该在游戏完成加载后就开始显示,所以要在GameMode内加入相关显示逻辑:

1732797185898

1732797213689

成果

打包到安卓端测试:

1732797508829

1732797514864

如上图所示,完成了既定要求。

(联机不太好弄,有空再做)