obsidian/笔记文件/2.笔记/节奏天国_第一章.md
2025-03-26 00:02:56 +08:00

8.9 KiB
Raw Permalink Blame History

这次的音游是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