如想尝试使用,请在此处下载Photo Mode资源包,将PhotoMode Prefab添加到游戏中,并按照这些步骤为Unity场景和Forward Renderer创建引用。完成后,你便能在游戏中设置相机位置、景深、镜头光晕、覆盖贴纸、滤镜等照片选项。模块化的Photo Mode还支持灵活地改变界面外观和按键行为,甚至支持创建自定义效果。请在Photo Mode Overview 视频中了解详细的设置过程。
Photo Mode在设计时考虑到了与各平台原生截图功能的兼容,附带的Hide UI选项可在视图中隐藏UI来方便保存照片,照片在截取后可通过设备的分享或截图按钮进行保存。
本演示包的运作由几种功能和系统支撑,这里我将快速介绍下各系统的使用方式:
- UI菜单系统:大多数Photo Mode都包含一个滚动条和输入框,选项依靠Unity Event调用对应的方法,在运行期间调整数值,这些参数可以是相应的Cinemachine、Volume或UI设置。所有方法皆可在PhotoMode.cs脚本中找到。滚动条的最小和最大值可在脚本组件中设定,本演示包包含了滚动文本等多种自定义UI,及一个Photo Mode的贴纸摆放系统。
- Input System:本演示包还使用了Input System,支持快速修改Photo Mode的控制键位,防止与原项目的输入键位冲突,还支持在键盘与游戏手柄两种控制方法之间切换。鉴于在Photo Mode中使用Player Input组件可能会使其与游戏已有的Input System发生冲突,我们借助了Input System API来新建了独特的输入操作引用。这些引用具体是在PhotoModeInputs.cs脚本中实现的,让用户能够在Photo Mode中进行输入操作,而不会影响到Player Input组件。我们还建立了自己的事件系统,用以在Photo Mode下覆盖原项目的事件系统。
- Cinemachine:出于模块化的考虑,我们为Photo Mode创建了单独的虚拟摄像机,使其能在不影响原摄像机的前提下完成镜头的环绕或升降。要想运行这个单独的摄像机,我们必须要在场景中创建一个Cinemachine Brain组件,由组件自动完成摄像机的搜寻,及PhotoMode.cs脚本与摄像机的关联。
- Volumes(体积)组件:Focus Distance(焦距)、Aperture(光圈)、Exposure(曝光)、Contrast(对比度)和Saturation(色饱和度)等镜头设置由Photo Mode的全局Volume组件管理。Volume组件可调整参数来匹配目标工程原来的后期处理设置。
- Shader Graph:Photo Mode中的多种滤镜效果皆使用Shader Graph制作而来,并借助URP的Render Pass功能进行实际应用。Shader Graph支持实现和定制新的渲染通道、扩展渲染管线。在Photo Mode中,我们特地使用了一个Blit方法将Shader Graph着色器应用到纹理中,实现一种全屏滤镜的效果。
- Custom Sticker System(自定义贴纸系统):Photo Mode的贴纸系统借助EventSystem的Navigation参数来创建一个位置坐标系,用于修改贴纸位置。放置贴纸的光标可显示贴纸的位置、角度、比例和图案,作为粘贴的信息参考。一旦贴纸放置完成的行为被触发,PhotoModeStickerController.cs脚本就会从当前的贴纸样本库中选中贴纸,再应用给定的变换值与图片设定,并将其设为“可见”。