11-创建场景:草坪
你好,我是悦创。
接下来,我们要实现一些游戏当作的玩法。
所谓,玩法就是游戏的一些机制。
我们,现在可以让青蛙朝三个方向不断的跳跃,不过我们也不希望青蛙在跳跃的过程中,毫无阻碍。
比如说:我们撞到了栅栏,撞到了小汽车,掉到河里的话,那么游戏都应该结束。所以,接下来我们要学习的就是如何触发这样的判断。
例如:在我们的游戏中,我们不希望我们的希望青蛙在我们的左侧的边界和右侧的边界,继续跳跃。——也就是我们的摄像头,只覆盖中间的范围。如果超越这个范围,游戏就失败了。
那其实就可以理解为:我希望左右两边有一个空气墙,青蛙碰到空气墙,也就判定游戏失败。
1. 空气墙
1.1 创建空气墙
然后养成习惯,将它的 Transform 归零:
1.2 调整空气墙
接下来就可以开始调整空气墙:
启动 Trigger ,这样青蛙和它就能碰撞了。
Command + D,快速复制。
再拖拽空气墙到右边。
1.3 空气墙跟随
这样就搞定了?
但是运行之后你会发现,青蛙跳着跳着就离开空气墙了。
我希望,这个空气墙可以不断的跟着我们的青蛙不断的移动。——所以,有什么好的方法呢?
我们之前讲过子物体跟随父类,父物体移动子物体也会跟随。
如果,你选择拖拽到青蛙的低下,成为青蛙的子物体也可以。我们试一试:
运行试一试,我们会发现向前没问题,左右跳跃就有问题了。
这样就无法实现碰撞边界的效果,所以怎么解决?——我们父类选择 Main Camera 即可,因为我们主摄像机就是如此。
那么,我们怎么判断触发上去了呢?
我需要给空白墙添加一个标签,方便我们来查找。
之前,我们讲过,摄像机有属于自己的标签:
1.4 空气墙设置标签
我们也可以给我们的空白墙设置标签。
1.5 编写代码
private void OnTriggerStay2D(Collider2D other) // other:帮助我们更好理解,除了当前的青蛙以外,对方的 Collider2D,对方的碰撞器就是 other。
// 我们来判断
{
if (other.CompareTag("Border")) // 比较标签
{
// 我们暂时没有其他处理,直接输出调试信息即可
Debug.Log("Game Over!");
}
}
我们保存代码,运行试一试。
这样我们就实现了,我们的栅栏也是一样的方法。
2. 栅栏
2.1 添加碰撞体
不过,要注意⚠️:我们青蛙身上的碰撞体是一直存在的。
那么,如果把栅栏也添加碰撞体的话,我可以如下操作:
分享一个小技巧,在这种 2D 游戏中,俯视角的项目中,碰撞体基本上跟它的影子是差不多的。
所以,青蛙碰到这个范围,就是 Game Over 了。
不过有一个情况,青蛙在跳的过程当中,它有一个移动,但是我们做了一个效果:是一个飞跃。
也就是在空中的时候,我不应该判断,青蛙是不是撞到了栅栏,而是在落地的那一下,开始判断,我是不是撞到了栅栏。所以,明白这个逻辑之后,我们来写这个代码。
为什么不使用 Border 呢?
想我刚刚提到的,我希望它是可以飞跃的,它跟 Border 是有一个小的区别。
所以,我们可以再起一个标签:Obstacle「障碍物」
接下来,为我们的栅栏绑定标签:
2.2 编写代码
private void OnTriggerStay2D(Collider2D other) // other:帮助我们更好理解,除了当前的青蛙以外,对方的 Collider2D,对方的碰撞器就是 other。
// 我们来判断
{
if (other.CompareTag("Border")) // 比较标签
{
// 我们暂时没有其他处理,直接输出调试信息即可
Debug.Log("Game Over!");
}
// 我们是怎么判断青蛙是否跳跃?——isJump,
// 那是什么时候改变 isJump 的状态那?——我们触发跳跃动画的时候,就是 isJump = true; 代表在天上
// 落地之后,我们在这个动画倒数第二帧,isJump = false; 也就是不再在空中跳跃了
// 所以,我们可以借助我们的布尔值的判断、标签的判断,来实现这个功能:看看我们是不是飞跃了障碍物。还是被障碍物撞到了。
// 开始写代码
if (!isJump && other.CompareTag("Obstacle")) // 如果我们的青蛙不是在跳跃的时候,并且碰到了 Obstacle
{
Debug.Log("Game Over!"); // 那么游戏就结束了
}
}
保存代码,我们去测试一下。
我们现在测试成功。
那么接下来,要实现的时候不停的测试,调整我们的栅栏,以便我们青蛙单独连跳的时候会碰到我们的栅栏。需要配合长跳和短跳才能越过这个位置。
把栅栏拖到 START:
现在栅栏实现了,但是我们以后会有很多类似栅栏的物品。甚至我们的栅栏是会在不同的场景被利用的,也就是反复被利用到的。
2.3 预制体
那这个时候,我们可以把栅栏保存为预制体,这样方便我频繁的调用和使用。
新建一个文件夹:
我们可以直接把栅栏角色拖进我们的文件夹 Prefabs 预制体文件夹中即可「直接拖拽即可」
变成蓝色了,代表成功了。
2.4 预制体的好处
如果我们在 Prefabs 中修改预制体,预制的体的修改,那么场景中所有预制的数值都会被同时修改。——所以,类似实现了模版的效果。
3. 设置墙
3.1 墙的锚点预制
3.2 放到我们的场景当中
3.3 添加碰撞体
做好这一切后,我们把坐标归零。
我们现在可以把草坪拖到 Prefabs 并删掉。
拖进去后,你就可以删掉我们的 Wall 了。
3.4 使用预制体
如果我需要在我们的场景中,使用我们的 Wall 我们就可以直接拖入到场景中,这样我们的 Wall 就应用了我们的预先设置的。
可以看见,它应用好了我们之前所有的设置,我们可以更改它的位置。
当然,也可以直接在里面进行复制,也是会一模一样的;
记得把我们的 Wall 的层级,改成 Middle。
那么,这里我会先把 Wall 去掉,我不需要在初始场景中显示我们的 Wall。
4. 建筑物添加碰撞体
这两个建筑都需要拖到 Prefabs:
两个预制体坐标都归零,即可。
5. 设置我们的块
我们需要设置一块,作为我们的一种草地,我们先把我们的 START 隐藏掉:
树我们也可以添加碰撞体:
顺便把树也保存成 Prefabs:
记得把草地花朵的图层都设置为 Back,不然会和我们的背景冲突,出现显示 bug。
接下来,我们可以把我们的 GrassLand01 向前拖,然后显示 START,即可。
这样看起来,我们整体还不错吧。
这样两个块就连接到一起了。
所以,我们就用这样的方法,把我们的场景,提前做好。然后不断的循环到我们的场景中,这样就好像实现了跑酷的无线模式一样。
6. 添加多个模拟场景
7. 作业
设置至少三个模块,以便后续使用。
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】
AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web全栈」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
- 0
- 0
- 0
- 0
- 0
- 0