回到音轨控制者,声明一下,需要使用到的,各个对象变量;
![[Pasted image 20220414222547.png]]
然后写一个,检测是否碰击中音符对象的方法;
![[Pasted image 20220414222557.png]]
再写一个,音轨控制器,初始化的方法;
![[Pasted image 20220414222656.png]]
在音符管理器中,再写一个方法,是用来检测,是否生成下一个音符的;
![[Pasted image 20220414222701.png]]
回到关卡类中,新增一个通用方法,用来计算玩家,在当前关卡得分的评定等级;
![[Pasted image 20220414222704.png]]
再写一个通用方法,是用来处理,完成当前关卡的逻辑处理;
![[Pasted image 20220414222709.png]]
完善一下,当前关卡的游戏执行逻辑,也是通用的部分;
![[Pasted image 20220414222911.png]]
回到音符控制器,添加一个函数方法,用来判断,事件负荷上,音符ID是否跟当前音轨ID匹配;
![[Pasted image 20220414222915.png]]
继续添加两个方法,分别是添加事件,和清除无效音符的;
![[Pasted image 20220414222920.png]]
继续添加,重置音轨状态,和回收音轨控制者的函数方法;
![[Pasted image 20220414222924.png]]
回到关卡类,完善一下,退出关卡的相关逻辑;
![[Pasted image 20220414222928.png]]
继续加一下,事件音轨的匹配方法;
![[Pasted image 20220414222933.png]]
添加一个,进入当前关卡,播放音乐,正式开始游戏的方法;
![[Pasted image 20220414222939.png]]
以上,就是关卡类的,通用方法了; 然后,回到音符对象类,完善一下,音符对象的函数方法;
![[Pasted image 20220414222951.png]]
继续,添加一个更新函数;
![[Pasted image 20220414222957.png]]
以上,就是音符对象的各个函数方法接口了;
回到游戏管理类中,添加一个“游戏启动”的整合相关; 其中,添加一个,初始化游戏的方法;
![[Pasted image 20220414223036.png]]
回到推动游戏进程的管理类中,创建一个方法,是用来重置游戏的;
![[Pasted image 20220414223123.png]]
再创建一个空方法,是用来实例化关卡对象的; (这个是用来,实例化具体关卡的,所以是涉及到,每一关具体的业务逻辑,所以需要后面再补充)
![[Pasted image 20220414223132.png]]
再创建一个方法,是用来加载当前关卡对象,开始游戏的;
![[Pasted image 20220414223137.png]]
继续加一个方法,是用来退出当前关卡的;
![[Pasted image 20220414223142.png]]
继续补充两个方法;
![[Pasted image 20220414223146.png]]
回到游戏管理类中,补全“游戏管理”整合的,函数调用接口;
![[Pasted image 20220414223150.png]]
然后,补全一下,游戏启动的接口;
![[Pasted image 20220414223154.png]]
然后,在游戏管理类中,补全Start函数,Update函数;
![[Pasted image 20220414223159.png]]
回到关卡类,加上第一关的类,当然是继承自关卡类的; 需要实现的类,也点击安按钮,自动添加一下;
![[Pasted image 20220414223203.png]]
然后,加一下,需要使用到的对象;
![[Pasted image 20220414223208.png]]
可以看到,上面的对象,有一个是首长,所以就说明,第一关这些具体逻辑,是涉及到了,具体的游戏内,运行对象的;
而首长的设定是,后面会变成敌人的,所以在处理首长之前,需要新建一个敌人(雪人)的脚本,而敌人本质上,就是音符对象,所以敌人,又是继承自,音符对象的;
在游戏文件夹中,创建一下;
![[Pasted image 20220414223212.png]]
调用一下,需要使用到的命名空间;
![[Pasted image 20220414223215.png]]
在游戏文件夹中,再创建一个,首长的脚本文件;
![[Pasted image 20220414223220.png]]
添加一下,命名空间的引用,优化一下代码结构,继承关系,声明一下,需要使用到的各个对象;
![[Pasted image 20220414223224.png]]
首长在最开始的时候,设定不是坏人,而是引导玩家的一个角色,所以会有,他跟玩家对象的教学关卡,也就有,他跟玩家的对话;
所以新增几个方法,分别是用来操作,显示和隐藏提示内容的;
![[Pasted image 20220414223228.png]]
首长跟玩家对话完毕后,会跑出屏幕外,所以加一个接口,是用来处理,跑出屏幕外的;
![[Pasted image 20220414223232.png]]
继续写两个方法,分别是,重置司尼状态的,和对象池回收的; 其中是有包含,父类中的,回收音符的方法;
![[Pasted image 20220414223237.png]]
然后,写好首长的Awake唤醒函数; 其中包含了事件的注册,初始位置的赋值等操作;
![[Pasted image 20220414223240.png]]
以上,就是首长,在教学关,需要用到的函数方法了; 而首长这个脚本,是需要挂在,首长这个预制体身上的;
而首长是有动画的,在原工程可以看到,所以是直接将动画,复制过去就好;
![[Pasted image 20220414223246.png]]
然后可以发现,首长的动画控制器,是一个衍生的动画控制器; 而衍生的动画控制器,是需要一个父动画控制器的,而目前为空;
![[Pasted image 20220414223249.png]]
它的父动画控制器,是玩家的动画控制器,所以需要把玩家的动画,也整体复制过来;
![[Pasted image 20220414223254.png]]
复制过去之后,首长的父动画,就自动关联上去了; 但是其中的动画内容是空的;
![[Pasted image 20220414223257.png]]
也没关系,直接拖曳填充过去,即可;
![[Pasted image 20220414223301.png]]
动画准备好了,脚本也准备好了,之后就直接复制,对应的预制体过去就好;
![[Pasted image 20220414223305.png]]
复制过去之后,可以看到,动画是自动挂上去了,而脚本文件没有自动挂上去,手动挂上去就好;
![[Pasted image 20220414223309.png]]
完成挂载后:
![[Pasted image 20220414223313.png]]
在关卡中,还需要使用到的,比较关键的物品,还有这个,音符控制器(可以看作是一个空物体),直接复制过去就好;
![[Pasted image 20220414223318.png]]
然后,还有一个,比较关键的预制体,就是玩家本身; 玩家本身是没有挂载脚本,只有动画,直接复制过去就好;
![[Pasted image 20220414223332.png]]
这两个预制体,分别是,目标物的行进路径,和销毁路径,也是直接复制过去就好;
![[Pasted image 20220414223337.png]]
然后玩家需要在第一关中,击打的雪人,也是需要一个脚本控制的,创建一下;
![[Pasted image 20220414223343.png]]
优化一下代码结构,它默认也是一个音符对象(被玩家击打,所以也是继承自音符对象,即可)
移动也是通过dotween控制即可;
![[Pasted image 20220414223348.png]]
写两个方法,分别是,播放被击中的音效,还有对象池回收相关的;
![[Pasted image 20220414223352.png]]
然后,重写一下,受击函数;
![[Pasted image 20220414223356.png]]
然后,重写一下初始化函数;
![[Pasted image 20220414223359.png]]
再重写一下Update更新函数;
![[Pasted image 20220414223403.png]]
在原工程中,这个就是第一关中,需要使用到的,目标雪人,直接复制过去就好;
![[Pasted image 20220414223407.png]]
依然会提示,脚本丢失; 没事,直接放上去就好;
![[Pasted image 20220414223410.png]]
放上去之后:
![[Pasted image 20220414223413.png]]
然后,还需要一个,雪人音轨控制者,用来单独控制雪人的生成相关,是继承自,默认的音轨控制者; 先在Game目录下,创建脚本;
![[Pasted image 20220414223418.png]]
完善一下代码结构; 写好检测,生成下一个音符的接口;
![[Pasted image 20220414223421.png]]
回到关卡类,在第一关中,写一个方法,是用来处理,获取雪人的移动路径,和销毁路径的;
![[Pasted image 20220414223424.png]]
然后,完成第一关的,进入关卡方法的重写操作;
![[Pasted image 20220414223428.png]]
加一个标签,为了跟后面的区分;
![[Pasted image 20220414223433.png]]
加一个训练模式的整合;
![[Pasted image 20220414223436.png]]
训练模式的设定,是首长会向玩家,说出不同的指令,例如攻击和跳起,而玩家需要执行指令;
![[Pasted image 20220414223439.png]]
然后,就是重玩训练模式的方法,就是各项的重置了;
![[Pasted image 20220414223443.png]]
准备好这些之后,就写一下,正式进入训练模式的函数接口了;
![[Pasted image 20220414223447.png]]
完成第一关和训练关的,进入逻辑之后,就可以开始重写,第一关的整体逻辑处理了; 但是可以发现,override的时候,出现了报错提示;
![[Pasted image 20220414223451.png]]
原因是,它的父类中,这个函数不是virtual虚函数,修改一下就好; 报错就消失了;
![[Pasted image 20220414223454.png]]
以上,就是第一关的相关逻辑了;