【Unity音游制作】你玩过节奏大师吗?(Koreographe插件导入游戏主体)【一】
👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity基础实战
⭐🅰️⭐
文章目录
- ⭐🅰️⭐
- ⭐前言⭐
- 🎶(==A==) Koreographe插件导入
- 🎶(==B==)项目背景搭建
- 1.背景图片导入黑锐Slice切割图集
- 2.透视摄像机的设置(项目打开默认的就是透视摄像机)
- 3.摄像机和音符轨道的位置和旋转角度的设置
- 4.动画效果的设置
- 5.编辑器拓展(新建文件夹Editor)
- 🎶(==C==)游戏场景UI面板制作
- 1.UGUI复合控件(Slider)做血条
- 2.Outline (外框线)做字体
- 🎶(==D==)逻辑主体相关
- 1.创建击打点
- 2.导入构建好的音乐插件工程
- 3.创建音乐管理器
- 4.RythmGameContorller脚本的初步构建(游戏管理器脚本)
- 5.STrackManager (音轨管理器脚本的构建)
- 6.NoteObject(音符快脚本的构建)
- ⭐🅰️⭐
⭐前言⭐
Koreographer是一款专为Unity游戏引擎设计的音乐插件。它由Sonic Bloom开发,旨在帮助开发者更好地管理和同步游戏音乐与动画的播放,从而提供更丰富和沉浸式的游戏体验。
Koreographer提供了一套强大的工具和功能,使开发者能够以精确的时间控制和节奏感来驱动游戏中的音乐和动画。它能够通过可视化编辑器轻松地将音频和动画事件关联起来, 使开发者能够精确地在特定音频时刻触发和控制游戏中的动画、粒子效果、声音效果等。
此外,Koreographer还提供了用于动态调整音频和动画播放速度、音频循环控制、基于音乐节奏的游戏事件触发等功能,使开发者能够更灵活地控制和调整游戏中的音乐和动画表现。
总而言之,Koreographer是一款强大的Unity音乐插件,为开发者提供了丰富的工具和功能,以实现更精确和沉浸式的音乐与动画表现。
🎶(A) Koreographe插件导入
- Koreographe插件导入
- 版本老的可能需要自行修改一下:如下:GUIText已经过时——>Text并引用头文件
🎶(B)项目背景搭建
1.背景图片导入黑锐Slice切割图集
- 若显示未下载相关的包,则进行如下操作
2.透视摄像机的设置(项目打开默认的就是透视摄像机)
- 原理:音游项目,那些下落的音符本来就是具有近大远小的效果,所以我们的透视摄像机它的作用也是具备近大远小的效果
3.摄像机和音符轨道的位置和旋转角度的设置
4.动画效果的设置
- 自定义添加DIY动画(可以改变背景图片和轨道的颜色),变成频闪
5.编辑器拓展(新建文件夹Editor)
- 图片切割(拓展)
作用:图片一键切割
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Collections.Generic;public static class ImageSlicer
{[MenuItem("Assets/ImageSlicer/Process to Sprites")]static void ProcessToSprite(){Texture2D image = Selection.activeObject as Texture2D;//获取旋转的对象string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称string path = rootPath + "/" + image.name + ".PNG";//图片路径名称TextureImporter texImp = AssetImporter.GetAtPath(path) as TextureImporter;//获取图片入口AssetDatabase.CreateFolder(rootPath, image.name);//创建文件夹foreach (SpriteMetaData metaData in texImp.spritesheet)//遍历小图集{Texture2D myimage = new Texture2D((int)metaData.rect.width, (int)metaData.rect.height);//abc_0:(x:2.00, y:400.00, width:103.00, height:112.00)for (int y = (int)metaData.rect.y; y < metaData.rect.y + metaData.rect.height; y++)//Y轴像素{for (int x = (int)metaData.rect.x; x < metaData.rect.x + metaData.rect.width; x++)myimage.SetPixel(x - (int)metaData.rect.x, y - (int)metaData.rect.y, image.GetPixel(x, y));}//转换纹理到EncodeToPNG兼容格式if(myimage.format != TextureFormat.ARGB32 && myimage.format != TextureFormat.RGB24){Texture2D newTexture = new Texture2D(myimage.width, myimage.height);newTexture.SetPixels(myimage.GetPixels(0),0);myimage = newTexture;}var pngData = myimage.EncodeToPNG();//AssetDatabase.CreateAsset(myimage, rootPath + "/" + image.name + "/" + metaData.name + ".PNG");File.WriteAllBytes(rootPath + "/" + image.name + "/" + metaData.name + ".PNG", pngData);// 刷新资源窗口界面AssetDatabase.Refresh();}}
}
🎶(C)游戏场景UI面板制作
1.UGUI复合控件(Slider)做血条
- 新建Silder后删除或者隐藏Handle Slide Area
Background作为血条背景框,Fill作为血条图形
2.Outline (外框线)做字体
🎶(D)逻辑主体相关
1.创建击打点
2.导入构建好的音乐插件工程
- 在Resources资源文件夹下面新建 Koreographe文件夹,并导入编辑制作好的 两项Koreographe资产
- 拖动添加音轨事件
- 打开后工程界面如图
- 音频中的采样率
在Unity中,采样率(Sampling Rate)是指音频数据每秒进行采样的次数。采样率决定了音频的频谱范围和精度,即采样率越高,音频的质量和精度越高。常见的采样率有44100Hz、48000Hz等。在Unity中,可以通过修改AudioClip的属性来设置音频的采样率。
3.创建音乐管理器
- 首先挂载Audio Source组件(为播放音乐)
- 其次添加Simple Music Player 配套的固定组件(不然播放不了音乐)
- 最后是Koographer单例
4.RythmGameContorller脚本的初步构建(游戏管理器脚本)
using SonicBloom.Koreo;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//-------------------------------
//-------功能: 游戏功能控制器
//-------创建者:
//------------------------------public class RythmGameContorller : MonoBehaviour
{//-----------------------------------------------[Tooltip("用于目标生成的轨道的事件对应ID")][EventID] //音游插件所带的API特性public string eventID;[Tooltip("命中目标的窗口范围(也可为音符被命中的难度,单位:ms)")][Range(8f, 300f)]public float hitWindowRange;public float noteSpeed = 1f; //音符速度//可按下检测的区域范围public float WindowSize{get{//速度 X 时间 (1m/s = 1000 m/ms)//要以Unity为单位(m/s)return noteSpeed * (hitWindowRange * 0.001f);}}//音符块命中的窗口的宽度private int hitWindowWidth;public int HitWindowWidth{get{return HitWindowID; }}//引用private Koreography koreography; //音乐插件public AudioSource audio; //音频资源public List<STrackManager> noteSoundTrack = new List<STrackManager>(); //声明装音轨的列表//音频的采样率的获取private int samplingRate;public int SamplingRate{get{return koreography.SampleRate; //返回采样率}}//音符块预制体资源public NoteObject noteObject;//按下特效预制体资源public GameObject downffect;//击中特效预制体资源public GameObject hitEffect;//长击中特效预制体资源public GameObject longHitEffect;[Tooltip("音频调用之前的延时时间")]public float playMusicTime;//音频播放前的时间差private float MusicOffsetTime;//音乐开始前倒计时 private float MusicCountdown;//当前的采样时间public int DelayedSampleTime{get{return koreography .GetLatestSampleTime()- SamplingRate *(int )MusicOffsetTime;}}//-----------------------------------------------void Start(){InitializeLeadIn();for (int i = 0; i < noteSoundTrack.Count; i++){noteSoundTrack[i].Initialize(this ); //实例化列表中的音轨}//获取到koreography对象koreography = Koreographer.Instance.GetKoreographyAtIndex(0);//事件轨迹的基类 ——>获取事件轨迹KoreographyTrackBase rhythmTrack = koreography.GetTrackByID( eventID);//获取事件List<KoreographyEvent > events = rhythmTrack.GetAllEvents();for (int i = 0; i < events. Count; i++){KoreographyEvent evt = events[i];int noteID = evt.GetIntValue(); //获取每个事件对应的数值//遍历所有音轨for (int j = 0; j < noteSoundTrack.Count ; j++){STrackManager sTrack = noteSoundTrack[j];//noteID的简单处理if (noteID > 6){noteID = noteID - 6;if (noteID > 6){noteID = noteID - 6;}}if (sTrack .IsMatch (noteID)) //若编号匹配{sTrack.AddEvnetToTrack(evt); //则将事件添加音轨对应的事件列表中break;}}}//命中窗口宽度的计算hitWindowWidth = (int) (SamplingRate * hitWindowRange * 0.001f);}void Update(){//倒数倒计时 (计时器)if (MusicCountdown > 0) //当音频还未播放前{MusicCountdown = Mathf.Max(MusicCountdown - Time.unscaledDeltaTime,0);//Time.unscaledDeltaTime;只与现实时间相关,不受timeScale影响}//倒数延时时间(计时器)if(playMusicTime > 0 ){playMusicTime = Mathf.Max(playMusicTime - Time.unscaledDeltaTime, 0); }}/// <summary>/// 初始化导入时间/// </summary>private void InitializeLeadIn(){if(playMusicTime > 0) //当具有延时时间时== 时间差 == 音乐倒计时{MusicOffsetTime = playMusicTime;MusicCountdown = playMusicTime;}else{audio.Play();}}
}
5.STrackManager (音轨管理器脚本的构建)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SonicBloom.Koreo;//-------------------------------
//-------功能: 音轨管理器脚本
//-------创建者: -------
//------------------------------public class STrackManager : MonoBehaviour
{private RythmGameContorller rythmGameContorller; //声明游戏管理器脚本成员变量 private List<KoreographyEvent> trackEvents = new List<KoreographyEvent>(); //声明KoreographyEvent事件列表[Tooltip("音轨对应事件的编号ID")]public int trackID; // Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}//实例化游戏管理器public void Initialize(RythmGameContorller contorller){rythmGameContorller = contorller;}//判断音轨是否和事件编号匹配public bool IsMatch( int noteID){return noteID == trackID;}//IsMatch = true ,则将当前事件添加进入音轨中的事件列表内public void AddEvnetToTrack(KoreographyEvent evt){trackEvents.Add(evt);}
}
6.NoteObject(音符快脚本的构建)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//-------------------------------
//-------功能: 音符脚本
//-------创建者: -------
//------------------------------public class NoteObject : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}
}
⭐🅰️⭐
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、
相关文章:
【Unity音游制作】你玩过节奏大师吗?(Koreographe插件导入游戏主体)【一】
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
高效解决Ubuntu Server 18.04.1 LTS 64bit更新gdb8.1.1到gdb12.1
文章目录 问题解决步骤 问题 因为需要用到gdb一些指令,但是gdb8.x好像存在普遍的问题,实现不了某些指令,比方说set detach-on-fork on,升级版本也没有比较好的教程 经过我不断的试错,我终于升级成功了!&a…...
【公示】2023年度青岛市级科技企业孵化器拟认定名单
根据《青岛市科技企业孵化器管理办法》(青科规〔2023〕1号)(以下简称《管理办法》)、《关于开展2023年度市级科技企业孵化器认定申报工作的通知》,经申报受理、区市推荐、形式审查、专家评审及现场核查等程序ÿ…...
【软件安装】(十四)Ubuntu22.04安装Psensor硬件监视器
一个愿意伫立在巨人肩膀上的农民...... Ubuntu系统硬件运行查询输入指令太繁琐,终端展示不直观,因此这款具有可视化监控Ubuntu系统下当前电脑的硬件CPU(中央处理器)、GPU(显卡)和硬盘等温度等功能ÿ…...
数组合并小程序
题目: 输入有序数组a, b, 不使用排序算法,及额外数组,按大小顺序合并a, b数组,元素不重复; 思路: 1. 如果比插入的数组大,那么往后插入,如果继续有大的,就移动位置插入…...
python练习二
# Demo85def pai_xu(ls_test):#创建一个列表排序函数命名为pai_xu# 对创建的函数进行注释"""这是一个关于列表正序/倒序排列的函数:param ls_test: 需要排序的列表:return:"""ls1 [int(ls_test[i]) for i in range(len(ls_test))]#对input输入的…...
专升本-数字媒体
数字媒体 概念: 媒体:是信息的载体,传播信息的媒介,能为信息的传播提供平台 数字媒体:多重媒体,使用文字,数据,图像,声音等各种媒体 数字媒体技术:利用计…...
蓝桥杯算法题-发现环
问题描述 小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增…...
Oracle存数字精度问题number、binary_double、binary_float类型
--表1 score是number(10,5)类型 create table TEST1 (score number(10,5) ); --表2 score是binary_double类型 create table TEST2 (score binary_double ); --表3 score是binary_float类型 create table TEST3 (score binary_float );实验一:分别往三张表插入 小数…...
Java封装最佳实践:打造高内聚、低耦合的优雅代码~
个人主页:秋风起,再归来~ 文章专栏:javaSE的修炼之路 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 1、封装 1.1 封装的概念 面向对象程序三大…...
开源,微信小程序-超级计算器T3000 简介
笔者于四年前自学微信小程序开发,这个超级计算器T3000就是当时的练习作品。超级计算器T3000的功能有很多,其中的核心技术是矩阵计算,使用的工具库是math.js,其次是复杂运算和分式运算。关于math.js的使用,可以参考另一…...
Dimitra:基于区块链、AI 等前沿技术重塑传统农业
根据 2023 年联合国粮食及农业组织(FAO)、国际农业发展基金(IFAD)等组织联合发布的《世界粮食安全和营养状况》报告显示,目前全球约有 7.35 亿饥饿人口,远高于 2019 年的 6.13 亿,这意味着农业仍…...
降低项目延期概率的5大注意事项
降低项目延期概率对项目非常重要。因为项目延期往往会导致成本增加,降低客户满意度,影响企业在市场上的竞争力,造成资源浪费。因此,我们需要降低项目延期概率,实现企业长远发展。 而降低项目延期概率,一般来…...
在VUE页面调用Extjs中定义的方法
VUE版本:VUE2 EXTJS版本:4.2.6 1、在extjs页面上写监听事件(主要利用了window.addEventListener来监听message事件 window.addEventListener("message", function(event) {// 这里写监听到消息后的逻辑,event.data就是…...
【独立开发前线】Vol.32 能够坚持下去的人并没有你想象的那么多
如果你有一个博客,你就已经超过了80%的独立开发者; 如果你每周更新自己的博客,你就已经超过了90%的独立开发者; 如果你每天更新自己的博客,你就已经超过了99%的独立开发者; 能够坚持下去的人并没有你想象…...
Java 扫描某包下所有类的注解并获得注解值
背景 : 需求 需要获取某个包下的所有的注解 并不是全部项目的 所以 只用针对某个包 进行扫描 获取注解 数据就行 百度了一圈 spring boot 没有自带的 获取注解集合的方法 在看 php 中 hyperf 框架 看到了 这个方法 就是因为 我需求是 php 和java 合体 微服务开发 …...
根据实例逐行分析NIO到底在做什么
Selector(选择器)是 Channel 的多路复用器,它可以同时监控多个 Channel 的 IO 状况,允许单个线程来操作多个 Channel。Channel在从Buffer中获取数据。 选择器、通道、缓冲池是NIO的核心组件。 一、新建选择器 此时选择器内只包含…...
TypeScript-对象的类型(接口)
1.接口 说明:TypeScript 中的接口(Interfaces)是一种用来定义对象的结构或者契约的方式。通过接口,你可以定义对象应该具有哪些属性、方法以及它们的类型。 2.一致性 说明:接口的属性名和对象的属性名必须一致性。 …...
Windows服务器安全策略配置几个步骤,轻松加强服务器安全
Windows服务器安全策略怎么做?不要觉得这是一个非常深奥遥不可及的问题,其实也是从各个方面去加固系统的安全性而已,它没有一个定论,今天德迅云安全就跟用户们分享一下windows服务器基本安全策略保障服务器基本安全的一些简单实用…...
Hive详解(2)
Hive 表结构 分区表 多字段分区:需要使用多个字段来进行分区,那么此时字段之间会构成多层目录,前一个字段形成的目录会包含后一个字段形成的目录,从而形成多级分类的效果。例如商品的大类-小类-子类, 省市县、年…...
【浅尝C++】STL第二弹=>迭代器失效详解/vector常用接口使用示例/vector底层结构探索/vector模拟实现代码详解
🏠专栏介绍:浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 🎯每日格言:每日努力一点点,技术变化看得见。 文章目录 vector介绍vector常用接口及使用示例构造类函数迭代器的使用容量操作增删改查 迭代器失效详解与v…...
【pytest】pytest` 中几种常用的参数化方法
pytest 是一个强大的 Python 测试框架,它提供了多种参数化测试的方法。参数化测试允许你使用不同的输入集来运行相同的测试逻辑,从而确保代码在各种条件下都能正常工作。以下是 pytest 中几种常用的参数化方法: 1. 使用 pytest.mark.paramet…...
设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注
场景 设计模式-装饰者模式在Java中的使用示例: 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…...
parallel linux虚拟机没有root权限
前言 今天刚在parallel上装上linux虚拟机,安装的是Debian发行版。用终端输入命令时,无意间发现当前用户竟然不是root用户,岂有此理!众所周知,Linux系统一般安装之后都是默认root用户的,但是可能parallel先…...
科技下乡:数字乡村改变乡村生活方式
在科技飞速发展的时代,数字化、信息化浪潮正以前所未有的速度席卷全球。在这场科技革命中,乡村不再是滞后的代名词,而是成为了数字乡村建设的热土。科技下乡,让数字乡村成为了改变乡村生活方式的重要力量。 一、科技下乡…...
【GitLab】Ubuntu使用宝塔安装GitLab最新社区版
首先在Ubuntu安装宝塔面板 在官网可以找到脚本一键安装 安装GitLab社区版 然后在宝塔面板的“软件商店”里面找到GitLab最新社区版 12.8.1一键安装 安装过程中可能出现以下问题: 1.卡在ruby_block[wait for logrotate service socket] action run 解决办法&…...
C++入门(2)
目录 3. C输入&输出 4. 缺省(默认)参数 4.1 缺省参数概念 4.2 缺省参数分类 全缺省参数 半缺省参数 5. 函数重载 5.1 函数重载概念 6. 引用 6.1 引用概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用效率比较 6.5.1 值和引用的作为返回值类型的性能比较 6.6 引…...
Prometheus +Grafana +node_exporter可视化监控Linux + windows虚机
1、介绍 背景:需要对多台虚机进行负载可视乎监控,并进行及时的报警 2、架构图 node_exporter :主要是负责采集服务器的信息。 Prometheus :主要是负责存储、抓取、聚合、查询方面。 Grafana : 主要是…...
腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践
腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…...
python 字典练习
def main():dict1{姓名:张三, 工资: 5000}dict2{姓名:李四, 工资: 6600}dict3{姓名:王五, 工资: 8500}dict4{}dict1.update(dict2)#字典的写法print(dict1)dict1.setdefault("3月",0)#存在不作为,不存在则增补print(dict1)names[]list[dict1,dict2,dict3]…...
做科技汽车的视频网站有哪些/世界十大搜索引擎排名
原标题:搞笑GIF段子:植发三天了,越来越粗壮了!!搞笑GIF段子:植发三天了,越来越粗壮了!!1.植发三天了,越来越粗壮了!!2.人在屋檐下不得…...
响应式网站的字体设置/成都品牌推广
前言 设计模式能够帮助我们设计出健壮,低耦合性的代码,从此和高耦合的代码say goodbye!在所有的的设计模式中,简单工厂算是我们平时接触比较多的吧,多线程中的消费者工厂类与生产者工厂类应该算是接触最早的设计模式&a…...
温州优化网站方法/app优化网站
在练习循环删除list中元素时遇到了一点问题。最开始写的代码是 for i in range(len(list)):del list[i] 这样写到后来会报错,原因是随着列表元素的删除和i的增加,对列表元素的访问会越界。 后来改成了如下代码 while i < len(list):del list1[i] 结果…...
建设化工网站的功能/seo网站推广有哪些
从一个Activity中要通过intent调出另一个Activity的话,需要使用 FLAG_ACTIVITY_NEW_TASK 否则的话,会有force close: 03-01 18:49:37.888 E/AndroidRuntime( 2706): FATAL EXCEPTION: main 03-01 18:49:37.888 E/AndroidRuntime( 2706): andr…...
购物网站的建设与维护/西安网站建设平台
Docker 基本用法 1. 安装社区版docker-ce 及 nvidia-docker2 插件 通过官网介绍的软件源的方式安装. 如果要安装nvidia-docker,由于其需要与docker-ce的版本匹配,所以如果是手动下载安装的话需要注意版本号. nvidia-docker对宿主机的要求是安装了nvidia驱动程序和docker程序,而…...
网站怎样和首页做链接地址/初学者做电商怎么入手
opencv相机读取的基本操作 快速入门 cap获取、writer获取、frame获取、frame写入、释放cap和writer import cv2 videoCapturecv2.VideoCapture(path)#读取本地视频 rtsp地址(例海康) addressrtsp://admin:账号地址:端口号/Streaming/tracks/摄像头号码…...