[UE4] 浅析ADVANCED PHOTO MODE

本文详细介绍了游戏中的相机模式组件及其相关BP,包括PhotoModeComponent、PhotoModeDataInterface、FreeCamera等。主要内容涉及相机初始化、模式切换、相册操作、函数库以及UI控件的事件处理,展示了如何实现拍照、存储和浏览照片的逻辑。此外,还涵盖了键鼠和手柄输入的适配,以及UI交互的细节设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序言

主要BP共6个

  • PhotoModeComponent 相机模式组件
  • PhotoModeDataInterface 接口BP
  • PhotoModeFreeCamera 自由相机
  • PhotoModeFunctionLibrary 函数库
  • PhotoModeGalleryWidget 相册模组控件
  • PhotoModeWidget 相机模组控件

主要BP详述

1. PhotoModeDataInterface

接口BP主要为了频繁复用的函数而设计,只有两个声明:

  • SendPhotoData 传送PhotoData数据结构
  • TabToOpen 点击打开不同的tab

在控件蓝图中实际定义并频繁使用

2. PhotoModeComponent

最重要的相机模式组件,它能够赋予使用相机模式的能力。
其中定义了三个事件:

  • INITIALIZATION 初始化
  • PHOTO MODE 打开相机模式
  • GALLERY 打开相册
2.1 INITIALIZATION

传入了角色、camera组件、Spring Arm组件、Controller信息,并对相关控件参数、相机控件和相册控件参数完成初始化操作。

2.2 PHOTO MODE

打开相机模式的时候先判断一下是否已经打开了相册UsingGallery?如果打开了则执行Reset相册(关闭)
之后就是判断是否已经打开了相机模式(用一个bool变量UsingPhotoMode?判断)

如果没打开

  1. 则设置camera相关组件(相机、弹簧臂和相机模式组件)在暂停的时候tickable
  2. 设置pauseUsingPhotoMode?
  3. 游戏并且打开控件菜单
  4. 捕获最后输入的key类型来判断是键鼠还是手柄模式,以显示icon和具体操作

LastKey变量的一大用途就是判断键鼠还是手柄输入模式

如果已经打开

  1. 重设tickable的事件,关闭菜单并unpause游戏
  2. 取消inputModeGameOnly,取消角色隐藏
  3. 恢复SpringArm和Camera的初始值
2.3 GALLERY

逻辑和相机模式类似,多了一个bool变量EnableGallery?控制是否能够启用相册,UsingPhotoMode?判断相机模式开启了没有,开启了则需要Reset相机模式(关闭)

简述一下开启相册的执行流:

  1. 设置UsingGallery?
  2. 开启相册控件,判断此时是否需要暂停游戏(自己可设置这个bool值)
  3. 记录controller判断键鼠还是手柄操作模式
  4. 根据controller判断是否显示鼠标

3. PhotoModeFunctionLibrary

函数库被分为了两部分

  • AdvancedPhotoMode 功能性函数
  • AdvancedPhotoModeSave/Load 相片数据结构的存储和装载

这里大概介绍一些各个函数的用途:

  1. Screenshot (with UI):调用控制台截图(有UI),返回路径
  2. HighResScreenshot (without UI):调用控制台高分辨率截图(无UI),返回路径
  3. Get Default Screen Resolution:获取屏幕分辨率
  4. Directory Path Correction:检查自定义输出路径是否存在,不存在则使用默认路径
  5. Get Screenshot File:根据路径获取截图
  6. NormalizeScreenshotPath:标准化路径
  7. MakeThumbnail:获取缩略图(可以指定缩小比例)
  8. Hide HUD When Using Photo Mode:隐藏UI
  9. SavePhoto:将照片保存到Photos数组中
  10. LoadPhotos:从本地游戏存档读取相册
  11. SaveAllPhotos:将相册数组保存

4. PhotoModeFreeCamera

这个自由相机是拍照模式中开启自由模式生成的,内部主要实现了键鼠和手柄的输入切换来控制相机移动。

移动中限制菜单输入,并限制最大移动和旋转边界

5. PhotoModeWidget

相机模式控件,主要分析一下事件图表内容。
逻辑主要分为四部分:

  • 构造前处理、构造、析构
  • 控件变量初始化
  • 聚焦事件
  • 事件分发器、键输入和表单
5.1 各种构造

构造前处理完成了对控件的滑标和确认框的初始化
构造事件完成了界面颜色设置、界面动画设置、打开界面时是否显示鼠标的设置、设定初始聚焦为0号tab
析构事件完成了camera和gameplay内容的恢复

5.2 控件变量初始化

输入当前相机参数、当前弹簧臂参数、后处理默认参数、手柄图标切换、初始化各个表单命令按钮

5.3 聚焦事件

主要是处理焦点在不同tab上的逻辑,切换focus表单,移出focus的逻辑,鼠标进入离开逻辑。

5.4 处理其他逻辑

这一部分包含了tab的切换逻辑、键鼠和键盘操作的按键切换、自由相机的相关事件分发器的bind以及滑轮事件分发器的参数改变。

6. PhotoModeGalleryWidget

相册模组的划分更加琐碎,大致上与相机模组逻辑一致,这里简述一下。

6.1 前构造

构造前处理更新PhotoData相关数据,生成相关页面和照片的缩略图。

6.2 构造

构造事件完成了界面动画开启,处理鼠标是否显示以及聚焦事件。

6.3 初始化

初始化传入是否启用相册数据、相机组件引用、是否显示鼠标、默认手柄图标。

6.4 按键事件

键盘按键事件以及按钮触发事件

6.5 翻页

翻页相关逻辑

6.6 聚焦事件

与相机模组同理

6.7 接口事件

重载了接口BP中的虚函数,处理数据传送逻辑

6.8 析构

重设各种数值和内存回收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值