Unity下落式音游实现——(5)根据音乐生成滑块

前期准备

终于到了最激动人心的时刻!仔细回忆需求,“需要在对应节奏处生成滑块”,其实就是在固定的时间点生成滑块。可以用一个dictionary存储对应时间点和生成的滑块类型,然后在update中每帧记录运行时间,到点了就生成对应的滑块。easy!right?

但这样似乎不能很好地满足某些需求,比如根据难度不同音乐播放速度会变化、音乐并不是连续播放,音乐与音乐会有停顿,同时得实现回放功能。对上述问题,好像不难想到对应解决办法:在每帧记录运行时间时乘上一个表示难度的系数、根据需求添加dictionary中的时间点。有没有更方便的做法呢?

答案就是这款插件:Koreographer!

插件介绍

Koreograpghy Editor

打开Window->Koreograpghy Editor

Koreograpghy包含音乐资源和对应的一系列音乐事件,下文中提到的Koreograpghy

新建一个Ky,将你想要处理的音乐拖进Audio Clip里。此时窗口上会出现音乐的波形图(不知道是不是叫这个)。白线表示一个beat(beat的长度和Tempo有关)

Tempo和音乐的节奏有关,需要提前和音乐方沟通(没记错的话120BPM是四四拍)Tempo越大,白线就会越密集。但注意不要出于降低时间间隔的原因去调大Tempo,可以去修改Snap To Beat1 Divide beat by;左下角Snap To Beat1 Divide beat by可以调整两根白线之间的小白线个数;可以点击波形图上方显示数字的小绿框(或小蓝框)切换时间轴的统计形式(有时间、sample数等)

之后新建一个track,点Track Event ID旁边的New,新建一个音乐事件。Payload可以理解为该事件的返回值,之后双击波形图中的小白线,小白线上就多了条小红杠,表示已经在这个时间点上设置了一个音乐事件。再点一下小红杠,便可以设置具体数值

tips:改变Tempo并不会影响已经设置好的Event,虽然小红杠不在小白线上会显得有点奇怪

等等!我们是不是忘了什么?滑块移动需要时间,那是不是应该要在对应节奏之前提前一点时间设置event呢?那不同难度下的“提前量”也不一样,难道要设置三个Koreograpghy吗?

第一个问题:正确的,对于常规需求(不分段也不回放)而言,只需简单地将event提前就好了(将event提前很简单,在Koreograpghy Editor中也不难实现,按正常节奏设置了event之后,选中全部event,一起往前拉)。需要注意音乐资源的开头需要有一段让滑块移动的空白期

但对于我这个奇怪需求而言,确实不能只是简单地将event提前。原因是会有一些属于下个分段的滑块被提前生成到上一个分段中,在模式切换时这些滑到一半的滑块需要清除,而播放下一段音乐时这部分滑块又需要在轨道的正确位置(不在起点)上被显示。因此需要特殊处理(有兴趣的见实现回放功能

第二个问题:错误的,只需设置一系列标准速度下的event,之后调整难度时随着整体音乐的播放速度变化,提前量自然会正确变化。

Koreographer组件

在SceneController(或者别的空物体上)添加组件:Koreographer和Simple Music Player(设置好Koreograpghy和Target Koreographer)

根据需求,将Track event的返回值设置成int,分别对应7个鼓;因为音乐中都是两个鼓同时被敲下,于是创建了两个Track event,时间点一样,返回值不一样;另外需求中将音乐分为多个小段,每个小段结束后会停顿一段时间,显示一些信息,再创建了一个Track event(命名为MissionClips)记录了关卡切分时间点

之后就进入代码部分了

应用Event

在使用Event之前,需要在脚本中注册单例,使用方法类似观察者模式;同时需要声明一个string数组,记录触发的eventID

//   SceneController.cs
public string[] eventID;
void Start()
{//  注册单例Koreographer.Instance.RegisterForEvents(eventID[0], genSlider);Koreographer.Instance.RegisterForEvents(eventID[1], genSlider);Koreographer.Instance.RegisterForEvents(eventID[2], controlPlaying);
}

修改genSlider参数

void genSlider(KoreographyEvent eventCallback)
{// 保持和原来参数一致int OrbitNum = eventCallback.GetIntValue();...
}

串联关卡

//   SenceController.cs
void Start()
{//  获取组件并调速用audio = GetComponent<AudioSource>();audio.pitch = SlideTime.standardTime / movingTime;music.pitch = SlideTime.standardTime / movingTime;...// 直接播放audio.play();
}

pitch是AudioSource的速度变量(虽然官方文档中将它描述为音高),默认值是1

目前为止已经实现了音游的基本功能了

实现回放功能

这一部分真的困扰了我很长时间…如果你的需求只是简单的一首歌播完并且只会生成一种类型的滑块(指交互方式),那么你可以(幸运地)跳过这一部分,如果你想了解奇奇怪怪的需求(和奇奇怪怪的实现方法),那请往下看

仔细回忆需求,首先进入演示阶段,该阶段玩家不能操作(滑块可见且自己销毁),演示阶段结束后,进入游戏阶段,此时播放和演示阶段一样的音乐,玩家进行操作(滑块不可见且不能自动销毁

书接上回,我们不能只是简单地将event提前。那怎么办呢?难道又要直接暴力,在每个分段前加上一小段空白期吗?

我选择用两个AudioSource,一个AudioClip开头加了一小段空白期,另一个AudioClip没有加空白期,静音,挂载了Koreographer(负责控制滑块生成)。两个AudioClip同时开始播放,当没静音的AudioSource播放到对应节奏时,滑块刚好到达鼓盘处,也不会存在提前生成下一小段滑块的问题

在SenceController修改audio部分

void Start()
{//  将另一个AudioSource挂在了子物体上Transform[] t = GetComponentsInChildren<Transform>();music = t[1].GetComponent<AudioSource>();...
}
//  两个audio同时播放或停止
public void Play()
{//StartCoroutine(fixMusicOffset());audio.Play();music.Play();
}
public void Pause()
{audio.Pause();music.Pause();
}

接下来时实现回放功能,有如下几个方案:

一、暴力。手动将音频按照关卡分成很多小段,然后将每个小段复制一遍,最后将所有小段缝合到一起。否决,程序员的自尊不允许我采取如此低效的方法(事后回想还不如直接暴力省事…)

二、将音乐时间轴往回调。在同一个Koreograpghy进行操作,进入game阶段时将音乐往回调到上一段show开始的地方

听起来很直观,而且AudioSource提供了Time或timeSamples变量,直接修改该变量就能重定位音乐播放位置

三、用两个不同的挂了koregrapher的gameobject分别负责播放show状态和game状态的音乐。一条暂停,另一条播放到另一条暂停的地方

最终选择了第三种方案,因为(当时觉得)直观上比较简单易实现。于是我新创了一对AudioSource(之前提到的实现提前量)

由于为了分段设置了两个几乎一样的的koregrapher,需要区分game状态和status状态(用一个bool值),奇数次收到关卡切换的信息时暂停,偶数次播放;同时利用协程,达到慢开始(让之前的滑块滑完+两段音乐间过渡期)、慢结束(让音乐放完)的效果,在结束时改变游戏状态并广播

新增的那个koregrapher的内容就是SenceController中controlPlaying()的部分,除了ifBegin的初值不同,奇数播偶数停

//   SenceController.cs
void controlPlaying(KoreographyEvent koreographyEvent)
{if(!ifBegin){audio.Pause();StartCoroutine(showlyMusicPause());         //  在game到show间过渡时间也不可击鼓ifBegin = true;}else if(ifBegin){ifBegin = false;status = MissionStatus.show;StartCoroutine(showlyPauseInput());StartCoroutine(showlyBegin(koreographyEvent));}
}
//  协程函数就不放上来了

Unity下落式音

Unity下落式音游实现——(5)根据音乐生成滑块相关推荐

  1. Unity下落式音游实现——(6)串口编程与UI

    Unity下落式音游实现--(6)串口编程与UI 前期准备 还差输入处理(串口编程)和杂七杂八的UI就完成了 思路 串口编程比想象中简单,需要用到System.IO.Ports库,其实只要提前和硬件那 ...

  2. Unity下落式音游实现——(2)滑块移动及生成

    Unity下落式音游实现--(2)滑块移动及生成 前期准备 导入资源及布置UI,创建脚本SliderController.cs.SceneController.cs.GameInformation.c ...

  3. Unity下落式音游实现——(3)实现观察者模式

    Unity下落式音游实现--(3)实现观察者模式 前言 本来这一部分是计划放在后面的,但在整理鼓盘敲击判定时优化了原来的部分代码(删掉了一个不必要地函数),顺理成章地出了bug.最后发现是这个函数原会 ...

  4. Unity下落式音游实现——(4)鼓盘动画及敲击判定

    Unity下落式音游实现--(4)鼓盘动画及敲击判定 前期准备 导入资源及布置UI,创建脚本DrumController.cs 思路 由于有多个鼓盘,需要为每个鼓盘创建一个Animator,每个鼓盘有 ...

  5. Unity下落式音游实现——(1)需求分析

    Unity下落式音游实现--(1)需求分析 前言 由于项目比较繁杂,因此根据基本模块会分为数篇博客,记录了主要流程和某些具体的技术难点,以此作一个技术总结 效果预览图 GamePlay 1.记忆部分. ...

  6. unity传统2D下落式音游制作(一)

    菜鸡一个,喜欢自己做点什么,代码不规范还请见谅. 素材文件可以自己解决,不如说如果不是为了发行的话自己ps画着玩就好. 首先确定需要的组件有哪些,这里简单列一下,如果还有要补充的会在之后的文章里补. ...

  7. [Unity]类似节奏地牢的音游旋律系统的搭建记录(持续更新)

    [Unity]类似节奏地牢的音游节奏系统的搭建 近期发现之前写的一些文章看的人还是有不少,但大部分都是找了解决方案然后转述了一遍罢了,心想既然有人看不如做点使用的东西出来,于是结合现在正好在做音游的d ...

  8. dynamix判定_音游正确入坑姿势?(转自本人知乎)

    一 选择合适的音游(建议看上了哪个可以去B站搜视频看看) 1 亚音游如跳舞的线钢琴块滚动的天空冰与火之舞几何冲刺等等,这类游戏属于具有部分音游特征,但缺少部分音游特征,如跳舞的线钢琴块没有判定等级等等 ...

  9. 如何制作一个音游鬼畜视频

    前几天沉迷于"耗子尾汁"的马保国,开始了一段时间的鬼畜鉴赏,心想着自己能不能也能做一个马保国的鬼畜视频 正好最近MuseDash(喵斯快跑)这款音乐跑酷游戏又火出圈了,马老师的&q ...

  10. ios有什么ssr_这款偶像音游《IDOLiSH7》,凭什么位居日本iOS畅销榜Top4?

    游戏发行一年不到,下载数就突破100万.在7月8日App Annie所提供的日本IOS畅销排行榜中更是上升了30位,位居第4名.目前根据日本媒体报道,游戏下载数已突破250万. 作者:Wind 说到日 ...

最新文章

  1. python和revit_如何在Python中产生新的RevitAPI对象
  2. linux监测node进程,通过node_exporter监控linux服务器一
  3. leetcode309. 最佳买卖股票时机含冷冻期
  4. iMeta | 华中科大宁康组综述宏基因组数据用于蛋白质三维结构预测的方法论
  5. php ASCII 字符转换 (汉字及特殊字符) 宽字符 (uft8/unicode)
  6. 恢复出厂设置android手机号码,安卓手机怎么恢复出厂设置
  7. 安全云盘项目(三):3.1 Qt的工具_MVD架构和信号槽原理分析
  8. cocos2dx在不同安卓机型下scrollview裁剪失败
  9. 元年深度 | 侧袋机制应用实务探讨
  10. C++ Primer 第5版 练习5.14
  11. 常用浏览器User-Agent列表
  12. LaTex 美赛笔记
  13. 干货|一文看懂什么是“非标资产”
  14. 我理解的战争(程序员是需要有立场的)
  15. 88、气体灭火系统的设计灭火浓度
  16. python爬虫之爬取《贵州农经网》信息
  17. 火山安卓开发支付宝自动转账功能
  18. dedecms编辑器 php,dede编辑器怎么换成kindEditor编辑器
  19. 360踩在3721尸体上扶摇直上(转载)
  20. jai_imageio-1.1-alpha.jar

热门文章

  1. 网站实时监控,Web网站及前端性能监控方法
  2. 计算机系的的毕业感言,计算机班同学的毕业感言
  3. NYOJ234吃土豆(双层动态规划)
  4. 【第五届集创赛备赛】七、紫光同创李星钢和王斌赛题培训(2021年4月13日)
  5. 北航计算机考博经验,北京航空航天大学考博经历
  6. MobaXterm连接局域网的虚拟机
  7. CSS峰会圆桌论道丨共享产业数字化升级中的安全探索
  8. Smplayer命令行模式下的用法
  9. 服务器CPU和普通CPU的区别
  10. 实用的Google搜索技巧