前言
该文档为《Unity游戏开发文档(3):Dancing Line》的附属文档,亦可看作是单独的技术总结文档。
综述
无论是在游戏中还是在其他应用程序中,我们都经常使用到 “滚动式菜单” 这一功能。它的泛用性很广,当我们有大量的UI组件,但又没办法一次性在屏幕里放下时,滚动式菜单的价值就体现出来了。
在 Dancing Line 中,我们希望用一个滚动式菜单来作为玩家选择关卡的载体。它需要具备以下几个功能:
- 能够滚动地显示所有选项,用户能够通过鼠标滚轮,鼠标拖曳或是特定的UI交互件来滚动菜单。
- 在任何时候都会有一个选项作为当前被选中的选项。当用户结束滚动后,菜单需要自动进行校准,使得离中心点最近的一个选项被设为选中的选项。
- 被选中的选项的尺寸要比未被选中的选项的尺寸大。当一个新的选项被设为选中的选项后,它的尺寸需要被相应地放大,而被替代掉的选项则需要相应地缩小。
- 用户点击被选中的选项后,将会跳转到对应的关卡中。


构建滚动菜单
关于如何创建一个滚动菜单可参考下方的视频
Swipe Control with Touch for Menu Level: https://www.youtube.com/watch?v=GURPmGoAOoM
读取关卡信息
创建了滚动菜单后,我们需要在外部读取游戏所有的关卡,然后把关卡转换为滚动菜单中的选项,并替换掉原有的预设选项。
那么我们首先需要做的是读取外部的关卡信息。在 Dancing Line 中,我们在游戏文件的根目录下设置了一个 Maps 文件夹用以存放关卡,每个关卡会各自存放在以关卡名为文件夹名的文件夹下。每个关卡的文件夹下需要包含一个与关卡同名的 .csv 和一个与关卡同名的 .mp3 文件,这些是游戏运行的必备文件。所以关卡的文件目录应该如下:
Dancing Line
|-- ...
|-- Maps
| |-- Chinese Garden
| | |-- Chinese Garden.csv
| | |-- Chinese Garden.mp3
| |
| |-- Piano
| | |-- Piano.csv
| | |-- Piano.mp3
| |
| |-- Winter
| | |-- Winter.csv
| | |-- Winter.mp3
| |
|
此外我们希望在玩家选择关卡的时候,游戏能为玩家播放每个关卡的示例音乐,以便让玩家对即将开始的关卡有一个预先的认知。因此我们在读取关卡时,也需要一并读取关卡的音乐文件。以下是读取关卡信息的实现代码:
private string project_path_;
private string maps_path_;
private string csv_path_;
private string mp3_path_;
private DirectoryInfo maps_info_;
private DirectoryInfo[] maps_list_;
private FileInfo csv_info_;
private FileInfo mp3_info_;
public List<string> map_name_list;
public List<AudioClip> map_music_list;
void Awake() {
LoadAllMaps(); // We must use "Awake()" rather than "Start()" since we need to load the game data file at the very beginning of the game.
}
void LoadAllMaps() {
project_path_ = System.Environment.CurrentDirectory; // Get the directory of the game project file
maps_path_ = project_path_ + "/Maps"; // Get the directory of the "maps" folder
GlobalData.project_path = project_path_;
GlobalData.maps_path = maps_path_;
if (!Directory.Exists(maps_path_)) {
// Create maps folder if it dose not exist yet
Directory.CreateDirectory(maps_path_);
}
maps_info_ = new DirectoryInfo(maps_path_);
maps_list_ = maps_info_.GetDirectories(); // Get all map folder names under the "map" folder into a list
foreach (DirectoryInfo map_name in maps_list_) {
csv_path_ = map_name + "/" + map_name.Name + ".csv";
mp3_path_ = map_name + "/" + map_name.Name + ".mp3";
csv_info_ = new FileInfo(csv_path_);
mp3_info_

本文档详细介绍了在Unity中构建滚动菜单的过程,包括读取关卡信息、填充菜单选项、实现选项自动对齐和大小调整,以及在选项变换时切换示例音乐。滚动菜单用于展示游戏关卡,允许玩家通过鼠标滚轮或交互件滚动选择,选中项会放大,点击后进入对应关卡。同时,文章提供了具体的代码实现和逻辑解释。
:滚动式关卡选择菜单&spm=1001.2101.3001.5002&articleId=120123324&d=1&t=3&u=aa2ffc13d5e440ac9ac724086ed26769)
1986

被折叠的 条评论
为什么被折叠?



