Unity游戏开发文档(3.1.3):滚动式关卡选择菜单

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

前言

   该文档为《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_ 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值