Unity Crazyball复现

实验4.Unity Asset Store游戏Crazyball复现


从这里开始我屈服于UE4的慢,转unity了。
这个实验主要记录了我学习crazyball这个游戏的代码结构的过程,以及unity 动画效果的实现。

一、实验要求

目的:复刻指定游戏。
要求:完全复刻CrazyBall 游戏的内容及其功能,可添加游戏内容,但不能删减。
拓展内容:
球体具有生命值,多次碰撞后死亡。
在碰撞时具有“弹性变形”FX。
作品示例↓:

在这里插入图片描述

二、软件核心代码(算法+代码文本)

UE4刚转unity(UE4有点带不动了),以前有一点点unity的基础但是不算熟练,这次在参照示例程序实现基础功能和拓展内容以后又试着自己给它加了个鼠标转键盘操控的切换模式按钮。

这个游戏本身在unity商城里可以免费下载,搜索crazy ball即可,看它本身的代码结构感觉很棒,于是我就基本上和它一样没有怎么修改了(其实是想偷懒)。我在这个基础上给它新增了弹性动画,还添加了生命数。

1 基础功能实现

先把游戏的基本流程(包含我自己添加的更改操作模式)梳理一遍:

在这里插入图片描述

1. GameController.cs
游戏全局控制器,用于控制游戏模式的选择,关卡难度的增加,敌方小球以及障碍物的生成。挂载在游戏界面的空物体GameControllor上。

在这里插入图片描述

核心部分代码:
生成敌方小球和障碍物代码实现:
CloneMaze()在Update里会不断被调用来不断生成敌人。
此处用到了协程,用来控制间隔一段时间来不断生成敌人,用Invoke()函数也可实现此功能。

在这里插入图片描述

(生成小球障碍物参考了它的教程代码,查了点资料,对于quaternion.euler那个四元数旋转还不是特别理解…)

关卡难度增加代码实现:

在这里插入图片描述


2. PlayerManager.cs
PlayerManager.cs这个代码挂载在player上,用于监测玩家与敌方小球,障碍物的碰撞,控制玩家的分数,玩家的血量并根据玩家的血量更改游戏结束变量。
核心代码实现:
计算玩家分数和血量:

在这里插入图片描述


碰撞检测代码实现:
(包含播放弹性动画部分)

在这里插入图片描述


3. PlayerController.cs
这个代码挂载在player上,用于专门控制玩家的移动,包括控制其移动操作方式(键盘/鼠标),控制玩家小球不超出屏幕边界等。
实现键盘移动:

在这里插入图片描述


在这里插入图片描述


位置检测函数,防止小球运动出界:

在这里插入图片描述


最后在update函数里添加如下代码,以实现判断游戏模式改变操作方式的功能:

在这里插入图片描述


4. EnemyBallController.cs
EnemyBallController.cs用来控制敌人的移动和消灭,在Update里不断更新敌人的位置,超出底部边界后销毁。这个代码挂载在enemy的预设上。

在这里插入图片描述


5. PauseManager.cs
PauseManager.cs的核心功能是检测鼠标在暂停界面上对按钮的点击。当点击暂停按钮时停止对游戏界面的计时,点击retry,menu按钮时进行界面的跳转,点击changeMode按钮时进行操作模式的切换。
核心代码:
在update函数里面实时监测用户操作:鼠标点击和键盘按键。

在这里插入图片描述


鼠标点击的按钮有四种类型:

在这里插入图片描述


6. MenuManager.cs
游戏主菜单控制器,用于控制用户在主菜单界面上的点击操作,更新用户的最高得分等。挂载在游戏界面的空物体MenuManager上。
核心代码:
主菜单界面的点击监测:

在这里插入图片描述


协程实现当用鼠标点击时按钮产生动画效果:

在这里插入图片描述


对于分值更新,直接在该文件中的awake函数中更新最高分和上次得分的分值即可。

2 附加功能实现

附加功能1:给球体添加生命值,多次碰撞后再死亡。
实现思路:这个功能很好实现,在代码里面多加一个变量来记录玩家的血量,同时在UI里也设置text记录,onCollsion执行一次玩家血量-1,玩家血量为0时让游戏结束。

1.代码里添加变量:

在这里插入图片描述


2.在界面里面添加玩家血量的gameobj,颜色调成深红色。

在这里插入图片描述


3.然后把界面里的gameobj和代码里面的绑定一下:

在这里插入图片描述


4.在碰撞检测函数里添加如下代码:
让小球每与障碍物碰撞一次扣一滴血,当血量为0时置游戏结束flag为true。

在这里插入图片描述


附加功能2:在碰撞时具有“弹性变形”FX。
实现思路:使用Animator做两段动画,每次发生碰撞的时候能够从普通状态切换到弹性形变状态,动画播放一次以后再回到普通状态,但是前提要保证上一段动画播放完成才行。

过程概括:我先是查阅了资料看Animation和Animator的一些基本信息,然后自己做了两段动画的Animation

在这里插入图片描述


在这里插入图片描述

  1. 自己制作一段Animation
    我先是尝试随意把一张图片的type改成sprite类型然后拖到主场景里面去,快捷键ctrl+6给它添加animation。

    在这里插入图片描述


    打开animation界面后,我先是在add properties里面选择添加了sprite,像下面一样做了一套动画…然后挂游戏里的player上去运行发现——根本就没有变化?

    在这里插入图片描述


    检查了一下想起来原来我的小球是个很薄很薄的三维物体,而不是一张二维的图片——所以在动画里面应该直接改它的scale。按下面的重做了动画,更改对应时间的scale变化,然后挂上player,弹性效果就有了。

    在这里插入图片描述


    因为我希望让弹性的动画只播放一次,所以没有勾选循环Loop Time。

    在这里插入图片描述


    2.制作Animator

    在这里插入图片描述


    分别在Bounced和Normal两种状态上右键选择make transaction,使小球可以在弹性形变状态和普通状态之间相互转换:

    在这里插入图片描述


    简单的状态切换图如下所示:

    在这里插入图片描述


    关于状态机transition中solo和mute:

    在这里插入图片描述

    在视图窗口中,状态机Has Exit Time:勾选上为,当被触发后当前动画播完后再进行跳转; 取消勾选为,当被触发后动画立即进行跳转。这里勾选上。

    在这里插入图片描述


    在视图界面可以调整这两种状态的切换间隔,preview界面可以预览这两种状态的转变效果。

    在这里插入图片描述


    调整合适之后,接下来我们再conditions界面里设置状态切换条件,当判断变量isCollision为false即碰撞没有在发生时,玩家小球由弹性形变状态转换到普通状态。

    在这里插入图片描述


    同理,玩家小球由普通状态转换到弹性形变状态时。把判断条件改成isCollision=true。

调整效果的过程中,我遇到了一些问题:
***存在的问题:动画切换具有一定的延迟性效果。***往往是碰撞结束后延迟一小会儿才发生形变,虽然延时不长,但是这样就是整个效果显得非常不自然。
↓↓↓
**解决方案1:**比较了一下,小球的前后位置相对而言对碰撞的影响没有左右那么大,所以可以在不改变碰撞体大小的基础上把碰撞体稍微向上拖一点,让碰撞在距离小球本身一定距离时就被检测出来,这样能稍微缓解一下延迟影响。

在这里插入图片描述


解决方案2:关于Has Exit Time的理解。

在这里插入图片描述


在这里插入图片描述


亲试后发现勾上Has Exit Time就算在下面的setting里面把Exit Time设为0还是会比直接取消勾选Has Exit Time要慢一点。

↑↑↑我同时使用了两个解决方案,现在这个球就碰撞时就变得无比Q弹了。

还有一个坑人的地方!

在这里插入图片描述


模拟一遍它的过程如下图:

在这里插入图片描述


它的整体效果就是碰一下弹一下,然后保持在弹性动画最后一帧不动,再碰一下回到初始动画,第三次碰又弹一下然后保持在弹性动画最后一帧…就这样循环….
把第一个if里面的代码备注去掉也不能解决问题:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


确实也可以强制切状态,但是要用到animator.update函数。
用这个危险的函数让我的unity崩了好多次以后我决定不钻牛角尖把那个变量改来改去了,直接切状态它不香吗。
把代码改成了下面这样(更改部分圈出来了)。↓

在这里插入图片描述


成功的实现了碰一下弹一下。

附加功能3:鼠标/键盘模式切换。
在暂停界面添加一个“changeMode”的按钮。

在这里插入图片描述


在代码playerController.cs里添加变量playmode,注意这个变量最好设置为public,并且一定要设置为static,不然无法切换模式。

在这里插入图片描述


继续添加代码changeMode用于在另一个PauseManager.cs里调用。

在这里插入图片描述


然后在PauseManager.cs里调用Player 物体上挂载的 changeMode( )函数并重新回到游戏界面,此时游戏的操作模式已经改变。

在这里插入图片描述

三、游戏运行效果(截图)

效果截图(部分):

(还不会放gif,等我会了就补一个动图上去!)

四、实验心得

刚从ue4转unity,可以说unity比ue4简单太多太多了,而且跟我的ue4比起来真的是神速。但其实遇到的问题还是很多,刚开始做可以说是手足无措,按照教程代码架起来了整体框架,然后自己一点点给他加上了附加功能,又尝试了一下键盘映射。
做animator的时候遇到的坑让我崩了很多次,一点体会:我发现动画状态转换中的条件变量设置很实用,但是这次这种只有两种状态转换的其实不用变量也很方便…

原文地址:https://blog.csdn.net/qq_45642765/article/details/115099657

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...