Unity游戏开发文档(3.1.2):下拉式音乐选择菜单

前言

   该文档为《Unity游戏开发文档(3):Dancing Line》的附属文档,亦可看作是单独的技术总结文档。

目录

  • 综述
  • 构建下拉菜单
  • 填充下拉菜单
  • 切换背景音乐
  • 最终效果
  • 参考资料


综述

无论是在游戏中还是在其他应用程序中,我们都经常使用到下拉式选择菜单这一UI组件。

现在我们有这么一个场景,即我们需要在游戏中为玩家提供切换背景音乐的功能。我们希望游戏在加载阶段先读取所有的背景音乐,然后根据背景音乐的数量和名称,为下拉菜单填充对应的音乐的选项。在游戏进行过程中,玩家通过点击选项即可切换到对应的背景音乐。


构建下拉菜单

我们在Unity的 Hierarchy 面板中,通过 “右键 — UI — Dropdwon” 即可创建一个Unity预设的下拉菜单组件:

Unity游戏开发文档(3.1.2):下拉式音乐选择菜单_第1张图片

通过 “右键 --- UI --- Dropdwon” 创建

Unity游戏开发文档(3.1.2):下拉式音乐选择菜单_第2张图片

预设Dropdown组件

我们可以看到,预设的下拉菜单组件里已经包含了三个预设的选项。在实际运行中,我们的是用我们自己的的选项来替换掉预设的选项。

Unity游戏开发文档(3.1.2):下拉式音乐选择菜单_第3张图片

Dropdown预设选项


填充下拉菜单

用自定义选项来填充下来菜单需要用脚本来完成。我们首先需要读取所有的背景音乐:这一步需要在游戏加载的过程中完成。而且为了提高效率,我们使用了异步加载音乐:

private AudioClip[] theme_musics_;

void Awake() {
    StartCoroutine(LoadMusics());		// Asynchronous load music file
}

IEnumerator LoadMusics() {
    theme_musics_ = Resources.LoadAll<AudioClip>("AudioClips/Themes/");		// Load music file into a list
    yield break;
}

在所有音乐文件完成加载后,我们首先需要把下来菜单预设好的选项给删除掉,然后遍历我们在上一步得到的音乐文件列表,把每一个音乐作为选项填充到下拉菜单中。这一步需要在Unity绘制好了所有UI组件后执行,因此我们应该在 OnGUI() 之后执行上述操作:

private Dropdown theme_drop_;

void Start() {
	ThemeMusicInit();
}

void ThemeMusicInit() {
    theme_drop_.options.Clear();			// Clear all default options

    foreach(var item in theme_musics_) {
        theme_drop_.options.Add(new Dropdown.OptionData() { text = item.name });	// Push customize options into dropdown
    }
}


切换背景音乐

完成了上一步后,我们的下拉菜单能够正确地显示所有的音乐选项,但直接点击的话不会出现音乐切换的效果。这是因为我们还没有实现下拉菜单的具体逻辑。

我们的游戏中首先需要具备一个 AudioSource 组件。接下来我们需要为下拉菜单添加一个监听器,负责监听玩家选择了新的选项的交互事件。当监听器被触发后,下拉菜单需要获取到被选择到的音乐,然后调用切换函数,把 AudioSource 中当前正在播放的音乐替换为被选择到的音乐。

当然了,为了显得正常一点,我们应该让下拉菜单在游戏完成加载后,立刻自动选择一首背景音乐播放,这样玩家进入游戏后不需要自己手动到菜单中选择,就能立刻听到背景音乐了。

完整的代码如下:

private Dropdown theme_drop_;
private AudioClip[] theme_musics_;
private AudioSource audio_source_;

void Awake() {
    StartCoroutine(LoadMusics());		// Asynchronous load music file
}

void Start() {
	ThemeMusicInit();
	theme_drop_.onValueChanged.AddListener(ChangeThemeMusic);	// Listen player event
}

IEnumerator LoadMusics() {
    theme_musics_ = Resources.LoadAll<AudioClip>("AudioClips/Themes/");		// Load music file into a list
    yield break;
}

void ThemeMusicInit() {
    theme_drop_.options.Clear();

    foreach(var item in theme_musics_) {
        theme_drop_.options.Add(new Dropdown.OptionData() { text = item.name });
    }

    theme_drop_.value = 1;						// Play music at the very beginning of the game
    audio_source_.clip = theme_musics_[1];
    audio_source_.Play();
    audio_source_.loop = true;
}

void ChangeThemeMusic(int index) {
    audio_source_.Stop();
    audio_source_.clip = theme_musics_[index];
    audio_source_.Play();
    audio_source_.loop = true;
}


最终效果

Unity3D-下拉式音乐选择菜单


参考资料

用Resources.Load方法加载音频:https://www.cnblogs.com/soviby/p/10013290.html
Unity UI Tutorial Dropdown C# Scripting: https://www.youtube.com/watch?v=URS9A4V_yLc
Dropdown.onValueChanged():https://blog.csdn.net/oncruise/article/details/95988493

原创博客,不得转载、抄袭

你可能感兴趣的:(游戏开发,unity3d,游戏开发)