看着目录来阅读

第一个是免费视频
音游制作实用插件-Koreographer入门教程)

第二个是siki学院的收费视频
Unity2D 音游案例-节奏大师(基于Koreographer)

Demo 音游制作实用插件-Koreographer入门教程

视频

视频演示了,球的弹跳,方块的缩放,特效的显示
音游制作实用插件-Koreographer入门教程

ogg,文件,文件Track

ogg,mp3改下后缀成ogg
文件,紫图标
文件Track,黄图标

Event ID比较重要,代码通过这一变量来读取文件

球的脚本

有打点就复位(快歌打点密,不复位飞到天上去),然后加速度,

using SonicBloom.Koreo;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Ball : MonoBehaviour {Rigidbody rgb;string eventID;float jumpSpeed = 3f;// Use this for initializationvoid Start () {jumpSpeed = 5f;eventID = "Piano";rgb=GetComponent<Rigidbody>();Koreographer.Instance.RegisterForEvents(eventID, BallJump);}void BallJump(KoreographyEvent evt){transform.position = Vector3.zero;  //打的点密,不归零来不及Vector3 v = rgb.velocity;v.y = jumpSpeed;rgb.velocity = v;       }
}

控制节点

三个组件,音源、蓝图标,红图标。
红图标、上面创建的紫图标拖到青图标上

效果

这个面板就是上面的“进去打点”弹出的
Main,Piano(自己命名的,脚本读的就是EventID)填上去
点击播放,快捷键“E”就进行打点(点就是两条轨道中间的“红长矩形”,点击选中变绿)
打完,Ctrl+S,退出就运行

tips:
点击激活轨道后,Ctrl+A,可以显示点的命名

Koreographer的理论内容---------------------------------------------

一种音频格式ogg

mp3转mid

需要是伴奏,有人声打点很乱。
只有伴奏也不好用,打的太密了。
所以请手打
网上推荐的mp3转mid

两个插件中的类型文件

Koreography(紫图标)

Koreography Tracker(黄图标)

一个编辑面板

关系

Koreography(紫图标)的编辑面板
编辑后的输出就是Koreography Tracker(黄图标)

Zoom或者Ctrl+上下,可以缩放轨道

打点(需要单击激活轨道UI)

快捷键E(常用,接近Pr)
Select下双击(觉得费劲)
Draw下单击
Clone还没用过

OneOff打的点都是短的,一样长的
Span打的点,按键时间长或连着,会有的变长,长短不一

以上都注意Snap to Beat Divide beat by (1)。
打钩就是打的点会对齐轨道中的竖线。
不打就自由地多不用对齐。
我是对应人声(唱一个字打一下)打点,比较密集,所以选后者

有打的点的详情需要滑轮滚一下

CtrL+A显示点的名字

一个总节点

就是上面说的控制节点

三个组件,音源、青图标,红图标。
红图标和上面创建的紫图标,都拖到青图标上

Demo Unity2D 音游案例-节奏大师(基于Koreographer)----------------------------------

进入游戏

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;public class StartGameButton : MonoBehaviour {// Use this for initializationvoid Start () {GetComponent<Button>().onClick.AddListener(StartGame);}// Update is called once per framevoid Update () {}private void StartGame(){SceneManager.LoadScene(1);}
}

选中是带脚本的

UI 元素 隐藏不影响

特效

场景中的3个特效是示例,隐藏不影响

键盘按键

键盘的2组TargetTop(音符生成的位置)和TargetDown(音符结束的位置)隐藏不影响

脚本 NoteObject(音符的生成)

代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SonicBloom.Koreo;/// <summary>音符,绿色的音符</summary>
public class NoteObject : MonoBehaviour
{#region 字属RhythmGameController gameController;LaneController laneController;/// <summary>音符身上挂的组件</summary>public SpriteRenderer visuals;/// <summary>不同轨道(6个)上音符的图像,和透明、蓝色、绿色三种音符(蓝色到透明=长按的开始和结束,绿色=短按)</summary>public Sprite[] noteSprites;KoreographyEvent trackedEvent;/// <summary>长按开始</summary>public bool isLongNote;/// <summary>长按结束</summary>public bool isLongNoteEnd;public int hitOffset;#endregion#region 生命// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (gameController.isPauseState){return;}UpdatePosition();GetHitOffset();if (transform.position.z<=laneController.targetBottomTrans.position.z){gameController.ReturnNoteObjectToPool(this);ResetNote();}}#endregion#region 辅助//初始化方法public void Initialize(KoreographyEvent evt,int noteNum,LaneController laneCont,RhythmGameController gameCont,bool isLongStart,bool isLongEnd){trackedEvent = evt;laneController = laneCont;gameController = gameCont;isLongNote = isLongStart;isLongNoteEnd = isLongEnd;int spriteNum = noteNum;if (isLongNote){spriteNum+=6;}else if (isLongNoteEnd){spriteNum += 12;}visuals.sprite = noteSprites[spriteNum - 1];}//将Note对象重置private void ResetNote(){}/// <summary>返回对象池</summary>void ReturnToPool(){gameController.ReturnNoteObjectToPool(this);ResetNote();}/// <summary>击中音符对象</summary>public void OnHit(){ReturnToPool();}/// <summary>更新位置的方法</summary>void UpdatePosition(){Vector3 pos = laneController.TargetPosition;pos.z -= (gameController.DelayedSampleTime - trackedEvent.StartSample) / (float)gameController.SampleRate * gameController.noteSpeed;transform.position = pos;}void GetHitOffset(){int curTime = gameController.DelayedSampleTime;int noteTime = trackedEvent.StartSample;int hitWindow = gameController.HitWindowSampleWidth;hitOffset = hitWindow - Mathf.Abs(noteTime-curTime);}/// <summary>当前音符是否已经Miss</summary>public bool IsNoteMissed(){bool bMissed = true;if (enabled){int curTime = gameController.DelayedSampleTime;int noteTime = trackedEvent.StartSample;int hitWindow = gameController.HitWindowSampleWidth;bMissed = curTime - noteTime > hitWindow;}return bMissed;}/// <summary>音符的命中等级</summary>public int IsNoteHittable(){int hitLevel = 0;if (hitOffset>=0){if (hitOffset>=2000 && hitOffset<=9000){hitLevel = 2;}else{hitLevel = 1;}}else{this.enabled = false;}return hitLevel;}#endregion}

音符的生成

六个轨道,
0-5,绿色音符
6-11,长按的开始,蓝色音符
12-18,长按的结束,白色音符

音符 NoteObject

    //初始化方法public void Initialize(KoreographyEvent evt,int noteNum,LaneController laneCont,RhythmGameController gameCont,bool isLongStart,bool isLongEnd){trackedEvent = evt;laneController = laneCont;gameController = gameCont;isLongNote = isLongStart;isLongNoteEnd = isLongEnd;int spriteNum = noteNum;if (isLongNote){spriteNum+=6;}else if (isLongNoteEnd){spriteNum += 12;}visuals.sprite = noteSprites[spriteNum - 1];}

轨道 LaneController

    //检测是否生成下一个新音符void CheckSpawnNext(){int samplesToTarget = GetSpawnSampleOffset();int currentTime = gameController.DelayedSampleTime;while (pendingEventIdx < laneEvents.Count&& laneEvents[pendingEventIdx].StartSample < currentTime + samplesToTarget){KoreographyEvent evt = laneEvents[pendingEventIdx];int noteNum = evt.GetIntValue();NoteObject newObj = gameController.GetFreshNoteObject();bool isLongNoteStart = false;bool isLongNoteEnd = false;if (noteNum > 6){isLongNoteStart = true;noteNum = noteNum - 6;if (noteNum > 6){isLongNoteEnd = true;isLongNoteStart = false;noteNum = noteNum - 6;}}newObj.Initialize(evt, noteNum, this, gameController, isLongNoteStart, isLongNoteEnd);trackedNotes.Enqueue(newObj);pendingEventIdx++;}}

音符图片的索引对应着文件的卡点


以下代码将“紫图标”中的所有点装入rawEvents。
0-5,6-11,12-17皮队ID,相应Add入六个轨道 rawEvents[i];

RhythmGameController

    void Start(){InitializeLeadIn();simpleMusicPlayer = simpleMusciPlayerTrans.GetComponent<SimpleMusicPlayer>();simpleMusicPlayer.LoadSong(kgy, 0, false);// 初始化所有音轨.for (int i = 0; i < noteLanes.Count; ++i){noteLanes[i].Initialize(this);}playingKoreo = Koreographer.Instance.GetKoreographyAtIndex(0);// 初始化事件。KoreographyTrackBase rhythmTrack = playingKoreo.GetTrackByID(eventID);//获取事件轨迹// 获取Koreography中的所有事件。List<KoreographyEvent> rawEvents = rhythmTrack.GetAllEvents();//获取所有事件//KoreographyEvent rawEvent = rhythmTrack.GetEventAtStartSample(2419200);//rawEvent.for (int i = 0; i < rawEvents.Count; ++i){//KoreographyEvent  基础Koreography事件定义。 每个事件实例都可以携带一个//有效载荷 事件可以跨越一系列样本,也可以绑定到一个样本。 样品//值(开始/结束)在“采样时间”范围内,* NOT *绝对采样位置。//确保查询/比较在TIME而不是DATA空间中发生。KoreographyEvent evt = rawEvents[i];int noteID = evt.GetIntValue();//获取每个事件对应的字符串// Find the right lane.  遍历所有音轨for (int j = 0; j < noteLanes.Count; ++j){LaneController lane = noteLanes[j];if (noteID > 6){noteID = noteID - 6;if (noteID > 6){noteID = noteID - 6;}}if (lane.DoesMatch(noteID)){//事件对应的字符串与某个音轨对应字符串匹配,则把该事件添加到该音轨// Add the object for input tracking.lane.AddEventToLane(evt);// Break out of the lane searching loop.break;}}}//SampleRate采样率,在音频资源里有。//命中窗口宽度,采样率*0.001*命中时长hitWindowRangeInSamples = (int)(0.001f * hitWindowRangeInMS * SampleRate);}

按键(LaneController)

脚本是挂在 Taget[1-6] 上的LaneController
按SDF JKL六个键

不同评价图片的判定逻辑

判定

特效

01 ClickDownSprite激活(键盘变蓝)
02 特效HitLongEffectGo实例(下图大的一直转圈圈的特效)
03 特效DownEffectGo实例(下图的绿点,音符没来前按键最明显能看到小绿点)
按下后按空,看到 01,02,03 都执行了
按下后按中,看到 01,02 都执行了

这里有DestrotEffect的脚本佐证hitEffectObjectPool对应02,downEffectObjectPool对应03。所以下图第二个特效还没见其用到

    void ReturnToPool(){if (isHitted){gameController.ReturnEffectGoToPool(gameObject,gameController.hitEffectObjectPool);gameObject.SetActive(false);}else{gameController.ReturnEffectGoToPool(gameObject, gameController.downEffectObjectPool);gameObject.SetActive(false);}}

音乐的播放

谁控制

SimpleMusicPlayer会加载AudioSource,调用SimpleMusicPlayer的方法就控制

开局以第一个音符经过按键才开始播放Bgm

SimpleMusicPlayer的AutoPlayAwake打钩的话,AudioSource的PalyAwake不管打不打,都会播放。
但是这个Demo是第一个音符经过按键才开始播放Bgm。
。。。。。
详解Unity中Time类的用法与深入探究
。。。。。
按脚本是计时8s播放Bgm。Bgm是一上来就有音符产生

。。。。。
代码来自于 RhythmGameController : MonoBehaviour

    [Tooltip("开始播放音频之前提供的时间量(以秒为单位),也就是提前调用时间。相当于time计时不跑的变量")]//其他public float leadInTime;float leadInTimeLeft;//音频播放之前的剩余时间量,(盲猜是区别开局与暂停播放,Bgm)/// <summary>音乐开始之前的倒计时器。相当于timer计时在跑的变量</summary>float timeLeftToPlay;void InitializeLeadIn(){if (leadInTime > 0){leadInTimeLeft = leadInTime;timeLeftToPlay = leadInTime;}else{audioCom.Play();}}// Update is called once per framevoid Update () {if (isPauseState){return;}if (timeLeftToPlay>0)//倒数音乐开始{timeLeftToPlay -= Time.unscaledDeltaTime;if (timeLeftToPlay<=0){audioCom.Play();gameStart = true;timeLeftToPlay = 0;}}if (leadInTimeLeft>0)//倒数我们的引导时间{leadInTimeLeft = Mathf.Max(leadInTimeLeft - Time.unscaledDeltaTime, 0);}......

游戏中的暂停继续会影响Bgm

RhythmGameController中一下。simpleMusicPlayer是音游插件的脚本

    //游戏的开始与暂停public void PauseMusic(){if (!gameStart){return;}simpleMusicPlayer.Pause();}public void PlayMusic(){if (!gameStart){return;}simpleMusicPlayer.Play();}

每次按键的评价图标

如图看到,Great,Perfectdt都是击中,只是音符案件的偏移量。所以连续击中下面都有分数递增显示

    #region 战斗中的三个//显示命中等级对应的图片public void ChangeHitLevelSprite(int hitLevel)//Great Perfect Miss三种{hideHitLevelImageTimeVal = 1;hitLevelImage.sprite = hitLevelSprites[hitLevel];hitLevelImage.SetNativeSize();hitLevelImage.gameObject.SetActive(true);hitLevelImageAnim.SetBool("IsNoteHittable",true);if (comboNum>=5)//连击5次开始显示轨道上的分数{comboText.gameObject.SetActive(true);comboText.text = comboNum.ToString();comboTextAnim.SetBool("IsNoteHittable",true);}//hitLevelImageAnim.Play("UIAnimation");}private void HideHitLevelImage(){hitLevelImage.gameObject.SetActive(false);}public void HideComboNumText()//轨道上的分数。也就是在Great Perfect Miss下的分数{comboText.gameObject.SetActive(false);}#endregion

扣血与分数

可以看到口5次分,就结束了

    #region UI上的3个public void UpdateScoreText(int addNum){score += addNum;scoreText.text = score.ToString();}public void UpdateHP(){hp = hp - 2;slider.value = (float)hp / 10;if (hp==0){isPauseState = true;gameOverUI.SetActive(true);PauseMusic();}}//游戏的开始与暂停public void PauseMusic(){if (!gameStart){return;}simpleMusicPlayer.Pause();}public void PlayMusic(){if (!gameStart){return;}simpleMusicPlayer.Play();}#endregion

通关 失败判定

结束界面

    #region 结束后的两个public void Replay(){SceneManager.LoadScene(1);}public void ReturnToMain(){SceneManager.LoadScene(0);}#endregion

“音游制作实用插件-Koreographer入门教程”,“Unity2D 音游案例-节奏大师(基于Koreographer)”相关推荐

  1. max转obj_工程动画制作 | Max插件Multiscatter进阶教程

    本次的讲解是:利用黑白遮罩图摆放树木,树木只会种植在需要的地方,达到理想的效果. (道路.房屋.建筑等不需要种树的地方是没有树的,草地上面树木尽量是一片一片成群的,树木也要有高有低的,每一颗树的方向也 ...

  2. linux 动画制作软件有哪些,2D动画制作软件OpenToonz使用入门教程

    整个软件用下来还算容易上手,基本功能很容易摸清了.如果之前使用过 flash做过动画,一天之内估计就能上手. OpenToonz这个软件的弊病就是稳定性差,还没做什么大项目呢,就自己先崩溃了好几次了, ...

  3. CobaltStrike 插件编写入门教程

    作者: 飞天魔鬼 免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 简介 这篇文章主要以写一个判断beacon中存在的杀软进程脚本为例子来介绍如何去尝试从零开始写一个cobal ...

  4. 【SAP BO】制作SAP BO Dashboards入门教程(一)

    SAP BO Dashboards 是SAP的一种可视化报表,数据来源于数据仓库DS -> Universe-> BO. 创建项目的第一步就是调研需求,然后模拟数据建立模型,确认模型,搭建 ...

  5. 适用于程序员的钢琴、五线谱入门教程

    适用于程序员的钢琴教程 全集分为五集: 这是由山东琴律信息科技有限公司制作的'钢琴五线谱入门教程' 全集分为五集: 钢琴(带你认识钢琴,琴键,调式等) 音高(把五线谱中的音高部分单独拿出来讲) 音值( ...

  6. MoveIt!入门教程 - 创客智造

    网址: http://www.ncnynl.com/category/ros-moveit/1/ MoveIt!入门教程-目录 ROS与MoveIt 说明 机械臂的运行,在工业利用上非常普及 Move ...

  7. 比读文档更易上手的Spark入门教程来啦!

    Spark 开创至今,已经走过了近 12 年.12 年间,时代的脚步不断前进,我们看到互联网不断发展,各种初创公司崭露头角,在公司日常业务中需要处理的数据量也飞速增长.数据中心也从云下逐渐迁往云上,从 ...

  8. 舵机任意角度程序_【舵机初动】基于Mind+ Ardunio入门教程10

    点击上方"蘑菇云创造"可以关注我们哦 本项目要接触到舵机.舵机是一种电机,它使用一个反馈系统来控制电机的位置.可以很好掌握电机角度.大多数舵机是可以最大旋转180°的.也有一些能转 ...

  9. Unity3D教程:手游开发常用排序算法 -下

    五.堆排序(Heap Sort) 1. 基本思想: 堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小 ...

最新文章

  1. HDU 5729 Rigid Frameworks(连通性DP)
  2. error;It could not find or load the Qt platform plugin “windows”
  3. TCP/IP详解--第四章
  4. java real football_Java学习--设计模式之行为型模式(三)
  5. 如何找到odata服务实现的具体backend 系统
  6. AtomicReference 原子引用
  7. Perl迎来25岁生日
  8. 【今日CV 计算机视觉论文速览 第148期】Mon, 29 Jul 2019
  9. 设计模式解密(9)- 装饰者模式
  10. Caffe 数据结构
  11. RPG Maker MV如何导入dlc素材?
  12. Kubernets的资源管理
  13. Docker容器获取宿主机信息
  14. JavaScript判断一个数字是否为素数
  15. 深度学习项目实战(一):猫狗识别
  16. unity简单复刻无敌破坏王
  17. Go GUI---lxn/walk 自带demo学习---7.文件浏览器
  18. 33的挑战状(bilibili首届安全挑战赛)
  19. 巴西数字支付公司StoneCo美国上市 蚂蚁金服是股东
  20. 中国风商业融资PPT模板

热门文章

  1. python中全局变量_python如何使用全局变量
  2. 2020最新swoole视频教程推荐(从入门到高级)
  3. jdbc 链接 sybase
  4. mac屏幕分辨率调整软件Resolutionator for Mac
  5. mysql导入大量数据_mysql快速导入大量数据问题
  6. 网站推广技巧之单向链接推广
  7. python 标签 轴_如何在matplotlib中将轴标签对齐到右侧或顶部 - python
  8. 微信短信显示服务器解包异常,微信异常,微信登不上
  9. Violence detection-Hockey Fight-CNN+LSTM暴力检测CNN+LSTM实例
  10. psnr,ssim解读