11-创建场景:草坪
你好,我是悦创。
接下来,我们要实现一些游戏当作的玩法。
所谓,玩法就是游戏的一些机制。
我们,现在可以让青蛙朝三个方向不断的跳跃,不过我们也不希望青蛙在跳跃的过程中,毫无阻碍。
比如说:我们撞到了栅栏,撞到了小汽车,掉到河里的话,那么游戏都应该结束。所以,接下来我们要学习的就是如何触发这样的判断。
例如:在我们的游戏中,我们不希望我们的希望青蛙在我们的左侧的边界和右侧的边界,继续跳跃。——也就是我们的摄像头,只覆盖中间的范围。如果超越这个范围,游戏就失败了。
那其实就可以理解为:我希望左右两边有一个空气墙,青蛙碰到空气墙,也就判定游戏失败。
1. 空气墙
1.1 创建空气墙
![](/assets/image-20230711213916775-DMg1oCvr.png)
![](/assets/image-20230711214015698-CE0drOMM.png)
然后养成习惯,将它的 Transform 归零:
![](/assets/image-20230711214439365-SiRr19zY.png)
![](/assets/image-20230711214550912-DLzpxNqb.png)
![](/assets/image-20230711214612740-1kagflyU.png)
1.2 调整空气墙
接下来就可以开始调整空气墙:
![](/assets/image-20230711214813151-D8RRxU1x.png)
![](/assets/image-20230711215032248-twBc3Xew.png)
![](/assets/image-20230711215106436-C_SZhIms.png)
![](/assets/image-20230711215223317-Bt0DI1Hh.png)
启动 Trigger ,这样青蛙和它就能碰撞了。
![](/assets/image-20230711215415051-HYcDeXvm.png)
![](/assets/image-20230711215530008-BcLmnFhY.png)
Command + D,快速复制。
![](/assets/image-20230711215652178-VkB1-8Xk.png)
再拖拽空气墙到右边。
![](/assets/image-20230711215811022-DVNcx4zl.png)
1.3 空气墙跟随
这样就搞定了?
但是运行之后你会发现,青蛙跳着跳着就离开空气墙了。
![](/assets/image-20230711220105908-C_wp_BxM.png)
我希望,这个空气墙可以不断的跟着我们的青蛙不断的移动。——所以,有什么好的方法呢?
我们之前讲过子物体跟随父类,父物体移动子物体也会跟随。
如果,你选择拖拽到青蛙的低下,成为青蛙的子物体也可以。我们试一试:
![](/assets/image-20230711222425773-DgKIIjjE.png)
运行试一试,我们会发现向前没问题,左右跳跃就有问题了。
![](/assets/image-20230711222551421-CoS4grOT.png)
这样就无法实现碰撞边界的效果,所以怎么解决?——我们父类选择 Main Camera 即可,因为我们主摄像机就是如此。
![](/assets/image-20230711222915623-DwVtAP4f.png)
那么,我们怎么判断触发上去了呢?
我需要给空白墙添加一个标签,方便我们来查找。
之前,我们讲过,摄像机有属于自己的标签:
![](/assets/image-20230711223242581-C7XAms66.png)
1.4 空气墙设置标签
我们也可以给我们的空白墙设置标签。
![](/assets/image-20230711223750927-XS_aoh6Q.png)
![](/assets/image-20230711223823505-p2yjw3Fy.png)
![](/assets/image-20230711223849302-CmPThXG4.png)
![](/assets/image-20230711223947351-DTmSs325.png)
![](/assets/image-20230711224101917-QcAth0Ys.png)
![](/assets/image-20230711224123975-ZYIX-hwW.png)
![](/assets/image-20230711224200428-NXQCAgGg.png)
![](/assets/image-20230711224214187-v2Nyd1Mm.png)
![](/assets/image-20230711224229106-B4j0eTwY.png)
1.5 编写代码
![FixedUpdate 后面写代码](/assets/image-20230711224648808-BtU_1Avc.png)
private void OnTriggerStay2D(Collider2D other) // other:帮助我们更好理解,除了当前的青蛙以外,对方的 Collider2D,对方的碰撞器就是 other。
// 我们来判断
{
if (other.CompareTag("Border")) // 比较标签
{
// 我们暂时没有其他处理,直接输出调试信息即可
Debug.Log("Game Over!");
}
}
我们保存代码,运行试一试。
![](/assets/image-20230711225820783-jQ2aMfVT.png)
这样我们就实现了,我们的栅栏也是一样的方法。
2. 栅栏
2.1 添加碰撞体
不过,要注意⚠️:我们青蛙身上的碰撞体是一直存在的。
那么,如果把栅栏也添加碰撞体的话,我可以如下操作:
![](/assets/image-20230714200456527-D5J2yCND.png)
![](/assets/image-20230714200526478-BHVP13NG.png)
![](/assets/image-20230714200547501-CkR0oZRL.png)
分享一个小技巧,在这种 2D 游戏中,俯视角的项目中,碰撞体基本上跟它的影子是差不多的。
![](/assets/image-20230714200927896-j42L-ROy.png)
所以,青蛙碰到这个范围,就是 Game Over 了。
![](/assets/image-20230714205917532-BiPHCJGs.png)
不过有一个情况,青蛙在跳的过程当中,它有一个移动,但是我们做了一个效果:是一个飞跃。
也就是在空中的时候,我不应该判断,青蛙是不是撞到了栅栏,而是在落地的那一下,开始判断,我是不是撞到了栅栏。所以,明白这个逻辑之后,我们来写这个代码。
为什么不使用 Border 呢?
![](/assets/image-20230714201538720-8n8ekp0S.png)
想我刚刚提到的,我希望它是可以飞跃的,它跟 Border 是有一个小的区别。
所以,我们可以再起一个标签:Obstacle「障碍物」
![](/assets/image-20230714201740597-ChxH-HKh.png)
![](/assets/image-20230714201801440-Be0VnDgc.png)
![](/assets/image-20230714201827721-BeOeYeGW.png)
![](/assets/image-20230714201848439-B3UiQG-A.png)
接下来,为我们的栅栏绑定标签:
![](/assets/image-20230714202008987-CDAYFfRL.png)
![](/assets/image-20230714202022956-BYdWgdOr.png)
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!"); // 那么游戏就结束了
}
}
保存代码,我们去测试一下。
![](/assets/image-20230714203529069-Bwm9vBt8.png)
我们现在测试成功。
那么接下来,要实现的时候不停的测试,调整我们的栅栏,以便我们青蛙单独连跳的时候会碰到我们的栅栏。需要配合长跳和短跳才能越过这个位置。
![我设置成 8.36](/assets/image-20230714204303462-CuLCzjJV.png)
把栅栏拖到 START:
![](/assets/image-20230714204448064-CkC3Ekmj.png)
现在栅栏实现了,但是我们以后会有很多类似栅栏的物品。甚至我们的栅栏是会在不同的场景被利用的,也就是反复被利用到的。
2.3 预制体
那这个时候,我们可以把栅栏保存为预制体,这样方便我频繁的调用和使用。
![](/assets/image-20230714204746836-DTIt4pwa.png)
![](/assets/image-20230714204809466-2f9ATtB5.png)
新建一个文件夹:
![](/assets/image-20230714204902959-Cca3SWfs.png)
我们可以直接把栅栏角色拖进我们的文件夹 Prefabs 预制体文件夹中即可「直接拖拽即可」
![](/assets/image-20230714205018971-D1cAkvCu.png)
![](/assets/image-20230714205047829-CpBvT4dV.png)
变成蓝色了,代表成功了。
2.4 预制体的好处
如果我们在 Prefabs 中修改预制体,预制的体的修改,那么场景中所有预制的数值都会被同时修改。——所以,类似实现了模版的效果。
![](/assets/image-20230714205434938-BK_sX6cr.png)
3. 设置墙
3.1 墙的锚点预制
![](/assets/image-20230714205548471-55RKiJ8m.png)
![](/assets/image-20230714205628120-j08uqWe6.png)
3.2 放到我们的场景当中
![](/assets/image-20230714205737625-vFDE0WNN.png)
3.3 添加碰撞体
![](/assets/image-20230714210602050-CJpfu2vg.png)
![](/assets/image-20230714210639667-CWJsQj_R.png)
做好这一切后,我们把坐标归零。
![](/assets/image-20230714211805014-ByhFNrL7.png)
我们现在可以把草坪拖到 Prefabs 并删掉。
![](/assets/image-20230714211942208-DoOOd6Fy.png)
拖进去后,你就可以删掉我们的 Wall 了。
3.4 使用预制体
如果我需要在我们的场景中,使用我们的 Wall 我们就可以直接拖入到场景中,这样我们的 Wall 就应用了我们的预先设置的。
![](/assets/image-20230714212520515-BHJkJugk.png)
可以看见,它应用好了我们之前所有的设置,我们可以更改它的位置。
当然,也可以直接在里面进行复制,也是会一模一样的;
记得把我们的 Wall 的层级,改成 Middle。
那么,这里我会先把 Wall 去掉,我不需要在初始场景中显示我们的 Wall。
4. 建筑物添加碰撞体
![](/assets/image-20230714215230548-C_iD8EKq.png)
![](/assets/image-20230714215535311-DyF9TtdU.png)
这两个建筑都需要拖到 Prefabs:
![](/assets/image-20230714215620418-DbDedJiB.png)
两个预制体坐标都归零,即可。
5. 设置我们的块
我们需要设置一块,作为我们的一种草地,我们先把我们的 START 隐藏掉:
![](/assets/image-20230714220203076-BeBzpqf0.png)
![](/assets/image-20230714220246044-DgJ0zK4u.png)
![](/assets/image-20230714220336174-B3awYKdD.png)
![](/assets/image-20230714220747848-ZF_OPDgK.png)
树我们也可以添加碰撞体:
![](/assets/image-20230714220940776-DDcUtY10.png)
顺便把树也保存成 Prefabs:
![](/assets/image-20230714221039379-gSZcg_gS.png)
![](/assets/image-20230714221105408-DcdgjrUG.png)
记得把草地花朵的图层都设置为 Back,不然会和我们的背景冲突,出现显示 bug。
![](/assets/image-20230714221629192-lrCXVvu2.png)
接下来,我们可以把我们的 GrassLand01 向前拖,然后显示 START,即可。
![](/assets/image-20230714221916393-PqUqCPEj.png)
这样看起来,我们整体还不错吧。
这样两个块就连接到一起了。
所以,我们就用这样的方法,把我们的场景,提前做好。然后不断的循环到我们的场景中,这样就好像实现了跑酷的无线模式一样。
![](/assets/image-20230714222441837-BKd1gdDb.png)
6. 添加多个模拟场景
![](/assets/image-20230714222805880-DgJbN06z.png)
7. 作业
设置至少三个模块,以便后续使用。
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】
![](/gzh.jpg)
AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web全栈」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
![](/zsxq.jpg)
- 0
- 0
- 0
- 0
- 0
- 0