这次的音游,是2d的,所以新建一个2d的unity工程就可以了; 首先需要导入三个包文件; ![[Pasted image 20220414214354.png]] 先拖拽导入这个; ![[Pasted image 20220414214359.png]] 然后是导入游戏的资源文件; ![[Pasted image 20220414214401.png]] 再之后,就是导入音游插件了; ![[Pasted image 20220414214409.png]] 如果提示升级,让它升级就完事了; ![[Pasted image 20220414214419.png]] 导入之后,有可能会出现报错,是因为插件里面的demo,是用了旧版本的一些api接口,然后在新版本的unity里面,不支持了; 反正旧版本的插件demo,也是不需要的,直接删掉就好了; 删掉这个文件夹就可以了; ![[Pasted image 20220414214533.png]] 删掉之后,引擎会自动重新编译,等它编译完就没有报错了; 然后,首先设置一下,鼠标的光标; ![[Pasted image 20220414214538.png]] 期间可能会出现这个提示,直接取消就好,不用安装的; ![[Pasted image 20220414214542.png]] 然后,就是这里设置的; ![[Pasted image 20220414214546.png]] 点这里,就可以设置一下; ![[Pasted image 20220414214551.png]] 知道名字的情况下,是可以直接搜出来的; ![[Pasted image 20220414214555.png]] 然后就设置好了; ![[Pasted image 20220414214602.png]] 这时切换到game界面,就可以看到设置是生效的; 用截图软件无法截鼠标,所以这个没截图; 测试一下,使用插件,右键点击,创建,其中分别是插件汇总音轨,还有单一轨道 ![[Pasted image 20240510144337.png]] 整两个,后续删掉就好,分别是汇总的Music,还有单一轨道Beat ![[Pasted image 20240510144716.png]] 需要注意的是,单一轨道需要设置一下,EventID ![[Pasted image 20240510144756.png]] 汇总轨道,拖曳需要播放的音乐过去,然后把,测试的单一轨道Track也拖曳过去; 再点击按钮,打开编辑界面 ![[Pasted image 20240510144846.png]] 选择了对应的轨道,会自动刷新上,对应的EventID ![[Pasted image 20240510145255.png]] Beats是设置,分隔线间距,而Tempo是设置密集程度,方便打节拍点; 空格键,是播放/暂停功能,方向键左右,是快进和快退功能; ![[Pasted image 20240510145347.png]] 回车键,是打点,方向键上下,是设置播放速度,为了方便打点,也可以先设置慢速播放,当然,也是可以手动设置: ![[Pasted image 20240510145639.png]] 这里是设置,打点对应的变量,例如现在可以设置是int,就会默认数值是0 ![[Pasted image 20240510145715.png]] ![[Pasted image 20240510145758.png]] 也可多选、框选,拖曳前后移动,或者删除都可 ![[Pasted image 20240510145827.png]] 单个操作也可,右键,可选剪切、复制等操作; 单个选中,del键,就是删除单个; ![[Pasted image 20240510145918.png]] 测试完毕,删除即可; 然后,就开始写代码了,首先新建一个文件夹; ![[Pasted image 20220414214607.png]] 在代码文件夹里面,再创建三个文件夹,分别是代表,框架,游戏业务逻辑,ui界面逻辑; ![[Pasted image 20220414214610.png]] 先创建一个基础的脚本文件,游戏管理类; ![[Pasted image 20220414214614.png]] 然后,通过rider打开一下,这个脚本文件,顺便打开这个工程文件; ![[Pasted image 20220414214619.png]] 这个要新建脚本的话,就可以这样,直接通过rider来创建即可; ![[Pasted image 20220414214623.png]] 在框架目录下,直接创建剩下的几个管理类,分别是音频管理器,玩家管理器,资源管理器,节奏管理器,UI管理器; ![[Pasted image 20220414214642.png]] 回到游戏管理器,这个是需要继承自mono的,然后这些就是用到的命名空间; ![[Pasted image 20220414214708.png]] 然后,先写一个获取器,和设置器; ![[Pasted image 20220414214713.png]] 然后,先处理资源管理器的逻辑; 资源管理器,涉及到资源工厂,和对象池相关; 还是在Framework文件夹,先创建一个ResFactory脚本,作为资源工厂; ![[Pasted image 20220414214717.png]] 改一下脚本的目录结构,引用需要的命名空间,写一个统一调用的接口; 其中的两个方法,分别是用来初始化工厂,和获得资源的; ![[Pasted image 20220414214720.png]] 然后,资源工厂这个类,是继承自这个接口的; ![[Pasted image 20220414214724.png]] 先自动生成继承过来的,需要实现的函数; ![[Pasted image 20220414214728.png]] 然后,定义一个字典,一个func委托; ![[Pasted image 20220414214735.png]] 然后,那个委托,是用来返回的; ![[Pasted image 20220414214740.png]] 然后,就是初始化资源工厂函数的完善; ![[Pasted image 20220414214756.png]] 然后,就是对象池相关了; 新建一个ObjectPool脚本文件; ![[Pasted image 20220414214800.png]] 然后,删掉默认的命名空间,还有类相关,只调用后面使用到的,命名空间,而且定义一个接口; ![[Pasted image 20220414214805.png]] 然后,定义一个类,是继承自这个接口的,先实现一下,继承过来的函数; ![[Pasted image 20220414214815.png]] 声明一个资源工厂的私有变量,一个栈; 然后,再写一个构造函数; ![[Pasted image 20220414214833.png]] 然后,完善获取游戏物体对象的函数; ![[Pasted image 20220414214945.png]] 然后,完善回收对象,到对象池的方法; ![[Pasted image 20220414214949.png]] 还需要一个管理类,来统一管理,所有的物体路径,在框架文件夹里,新建; ![[Pasted image 20220414214956.png]] 因为都是常量,所以直接复制粘贴过来就好; ![[Pasted image 20220414215000.png]] 资源管理相关的其他类都准备好了,接下来就回到资源管理类中,先调用好,需要使用到的命名控件,还有定义好对应的管理类; ![[Pasted image 20220414215007.png]] 然后,声明定义几个资源工厂,再写一个初始化工厂的函数; ![[Pasted image 20220414215016.png]] 然后,最开始,就是图片工厂的初始化操作; ![[Pasted image 20220414215022.png]] 紧跟其后的,还有三个资源工厂的初始化,参考原工程写就好; ![[Pasted image 20220414215031.png]] 初始化完成之后,就要获取相应资源了,也是写上,对应的接口即可; ![[Pasted image 20220414215047.png]] 以上,就是资源管理相关的整合,然后就到了,对象池相关的,资源整合,先声明定义一个对象池的字典,然后再写一个,对象池字典初始化的方法; ![[Pasted image 20220414215052.png]] 然后,写一个,从对象池中,获取数据的方法,从预制工厂中,取得数据即可; ![[Pasted image 20220414215057.png]] 再写一个,回收对象的方法,也是直接调用,对象池中的回收方法即可; ![[Pasted image 20220414215101.png]] 调用一下游戏管理类(备用),然后写一个构造函数,其中包含上面写好的,资源管理,和对象池管理的初始化操作; ![[Pasted image 20220414215106.png]] 回到游戏管理类中,声明一个资源管理类的变量,再写一个初始化管理类的方法,直接new实例化一下; ![[Pasted image 20220414215112.png]] 然后,就开始弄事件管理器了; 事件系统的话,实际上就是由委托构成的; 先改一下,对应的目录结构,调用一下,需要用到的命名空间,再声明一个委托的字典; ![[Pasted image 20220414215117.png]] 先写一下注释; ![[Pasted image 20220414215122.png]] 加一个注册事件的方法; ![[Pasted image 20220414215125.png]] 然后,就是取消注册事件的方法; ![[Pasted image 20220414215130.png]] 然后,就是发送事件的方法; ![[Pasted image 20220414215134.png]] 在外部也定义一个整合,用来划分,特殊的消息结构,例如对话的游戏开始等; ![[Pasted image 20220414215138.png]] 用结构体,来填充一下整合; ![[Pasted image 20220414215142.png]] 在游戏管理类中,也声明和初始化,事件管理类的对象; ![[Pasted image 20220414215147.png]] 在游戏管理类中,补充一下,资源管理的整合; ![[Pasted image 20220414215152.png]] 填充一下整合,主要是跟获取资源相关的函数调用; 后面统一都在游戏管理类这个中介,调用就好; ![[Pasted image 20220414215200.png]] 再补充一个事件管理的整合; ![[Pasted image 20220414215210.png]] 填充一下; ![[Pasted image 20220414215214.png]] 顺道再加上,游戏管理类的唤醒函数,主要都是跟初始化,实例化相关的; ![[Pasted image 20220414215223.png]]