12-创建场景:马路
你好,我是悦创。
到这里,你的三个场景块,做好了吗?做好了,我要继续开始做我们的马路了。
![image-20230808194848386](/assets/image-20230808194848386-NTK696NT.png)
1. 进入场景编辑界面
双击我们的预制体就可以进入我们的场景编辑页面,进入之后就可以进行修改了。我们所有的修改,都会影响我们的所有用到这个预制体的场景。
![](/assets/image-20230808194955356-Dx4GOD5c.png)
2. 所存在的问题
我们要点击场景中的小花,但是经常不能一次性点击到,反而会点到我们的 Panel:「因为,有一层 UI 挡在我的画面上,我会经常不小心点到它」
![](/assets/image-20230808195547927-CPOI3Nj2.png)
当我把鼠标移到我们 Hierarchy 窗口时,在我们的 Panel 时,它会显示两个标记:
![](/assets/image-20230808195819688-zCPFtItL.png)
- 眼睛:代表物体是否在我们的场景中,可以看得见;
- 手:手的意思,代表我们的物体,是否可以在我们的场景中被点按;
所以,我们可以把整个 Canvas 设置为不能点按:
![](/assets/image-20230808200140420-CuK46PoM.png)
现在,我们就可以在我们的场景中随意点击我们的物体了,这样是不是很方便呢~
那接下来,我们要做游戏中最重要的部分了:公路。
3. 制作马路
这里我将带你做一个小汽车和公路的搭建。
3.1 修改锚点
![](/assets/image-20230808201052613-CGz79Att.png)
![](/assets/image-20230808201129143-DHI5fKhM.png)
![](/assets/image-20230808201204256-DeRsiIX6.png)
接下来,找到公路的素材:
![](/assets/image-20230808201500488-DFJaAW-O.png)
![](/assets/image-20230808201526820-DbNkYRr9.png)
![](/assets/image-20230808201613162-ClxesN3Z.png)
添加路边:
![](/assets/image-20230808202222902-C1Pj3Zos.png)
![](/assets/image-20230808202422034-DbLhy_zG.png)
![](/assets/image-20230808202540157-CQ1zo7lJ.png)
那么,在我们的公路上是不需要碰撞体的,所以我们也可以把公路变成一个模块。
![](/assets/image-20230808202748242-DwGW1Xu9.png)
![](/assets/image-20230808202821009-k1VZHt4i.png)
![](/assets/image-20230808202837894-3wQMUupH.png)
![](/assets/image-20230808202921199-CLQPWPRB.png)
接下来,要做我们的小汽车了。
3.2 制作小汽车
![](/assets/image-20230808203322042-CJe4TIw2.png)
![](/assets/image-20230808203455064-DhnDxjnS.png)
![](/assets/image-20230808203542994-BsoII3y3.png)
![](/assets/image-20230808203822521-BL1BeKpe.png)
我们是双向车道,汽车是双方向移动,我们先做第一种情况:怎么让汽车🚗自然的移动起来。
![](/assets/image-20230808204012136-BmMrDjM6.png)
还记得么,调整到和影子差不多大小即可:
- 设置 Trigger
![](/assets/image-20230808204328699-CVWmlKpa.png)
所以,小青蛙跳到这个汽车位置的话,就判断它失误了。
因为,我们觉得,汽车是你青蛙跳不过去的。所以,青蛙在空中就被车撞了,因为车比较高。
我们也为它创建一个单独的标签:Car
![](/assets/image-20230808204656751-BqkROP1B.png)
![](/assets/image-20230808204720977-D8Of29Ea.png)
![](/assets/image-20230808204803280-Cc2W_sds.png)
![](/assets/image-20230808204823811-DvfGuN0M.png)
![](/assets/image-20230808204914932-BRh7IpIG.png)
我们还有动画,我们就要添加 Animator:
![](/assets/image-20230808205201447-B1UFKEkA.png)
![](/assets/image-20230808205336832-DrF4hNus.png)
![](/assets/image-20230808205405948-B5l5udU5.png)
![](/assets/image-20230808205448694-CVsSZY4a.png)
![](/assets/image-20230808205510898-CSHMchlt.png)
![](/assets/image-20230808205715462-BF4maYp7.png)
![](/assets/image-20230808210034967-BLYN8KKy.png)
![](/assets/image-20230808210118707-Cc9Tfoud.png)
为什么要把采样率设为 20?
![](/assets/image-20230808210301793-CRJO6bFc.png)
因为,我们一共有 20 张图片,所以希望一秒 20 帧。
![](/assets/image-20230808210735470-D5mU-CiB.png)
点击运行我们看看:
![unity](/assets/unity-CtuO9wUp.gif)
可以看见小汽车🚗轮子在运行。
接下来,我们要实现小汽车的真实移动。
不过,我们想象一下:我们车要移动,我们在水上的木板也是会移动的。而且,它们的方式是一样的,我希望在左侧,会在一些固定的间隔里面,生成不同的汽车。「因为,我们有三种汽车」
所以,汽车需要有随机性。每次生成起来之后,小汽车只要向前跑就行,不用追着我们青蛙跑。木板也是,每次生成向前移动。
接下来,我们写一个通用的方法,来是我们的角色向前移动。「目前来看,向前移动就是向右移动」
4. 编写移动代码
4.1 新建代码文件夹
![](/assets/image-20230815212634746-CWQbVX0c.png)
![](/assets/image-20230815212905701-Pygy3Ddi.png)
4.1 初步代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveForward : MonoBehaviour
{
// 首先我们需要三种小汽车有不同的速度
public float speed; // 方便我们在界面操作设置速度
// void Start()
// {
// }
// Update is called once per frame
void Update()
{
// 在这里我们调用函数
Move();
}
// 我希望我的小汽车不断的运行移动,我们来写一个方法
private void Move() {
// 我们想想,小汽车要怎么移动呢?
// 所谓的速度,它需要不断的在 update 里面去调用,使每一帧都向前前进一些,那前进的就是 speed
// 也就是我在我当前坐标的基础之上,让它 x 的方向,不断的添加的 speed
// 我们使用 transform,transform.position = transform.position + transform.right 和下面等价
transform.position += transform.right * speed * Time.deltaTime; // transform.right 当前角色的纵坐标的向右方向,我们要在这个基础之上乘以 speed,
// 接着我们乘以我们的时间修正,因为,我们之前说过 Update 是每帧执行,但是在不同设备上有不同的帧数,所以在这里我们会乘以一个时间修正。这个是固定写法 Time.deltaTime
// 相当于我们角色的方向,向右的意思
}
}
4.3 设置小汽车速度
![](/assets/image-20230815221634499-BBpwqOrg.png)
![](/assets/image-20230815223759663-CnyOylvR.png)
![和我的青蛙一样,设置为 2.1](/assets/image-20230815223950152-BJRS1qC8.png)
保存项目,运行:
![unity](/assets/unity-2112044-B1bitNn1.gif)
4.4 添加游戏失败条件
我们小青蛙碰除了碰到 Border 以外,或者你碰到了我们的小汽车,也应该会 Game Over。
所以,我们需要在代码文件 PlayerController.cs 中添加判断条件:
private void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Border") || other.CompareTag("Car")) // 比较标签// 这样我们就实现了,只要碰到其中一个游戏就 GameOver
{
Debug.Log("Game Over!");
}
if (!isJump && other.CompareTag("Obstacle"))
{
Debug.Log("Game Over! Obstacle");
}
}
5. 把我们的小汽车做成预制体
![](/assets/image-20230818180348549-KtgyMgD0.png)
- 记得新建文件夹 Cars
- 拖拽进去即可
- 删掉现在汽车角色
我们到时候会怎么使用呢?
我们会在马路的两条车道上,放置生成汽车的点,它们会在这两个点生成出来。生成出来之后就直接开始移动了。
我们来测试一下:
- 先运行游戏
- 拖拽小汽车
![unity](/assets/unity-2353341-BjGQkevs.gif)
不用管我们左侧界面是怎么样的,我们将小汽车拖拽到场景中,然后汽车会一直走。
我们思考一下:如果我们每隔一段时间生成小汽车,它都不断的这么走,那游戏玩了一段时间后,我们的场景中就会生成非常多的汽车。
所以,我希望我们的汽车移动出去一段距离之后,就把汽车销毁掉,不让它继续出现。其实木板也是同样的原理,所以我们来编写代码。
6. 连续的小汽车
void Update() // 持续每帧在运行的,在运行的过程当中我要判断它的坐标
// 就是在小汽车移动的初始坐标基础上,小汽车移动的 x 的差值超过了我们的范围,比如我们指定了一个宽度。
// 那么我们就销毁,所以我需要知道我们小汽车初始位置。
// 因为随着我们的场景不断的更新,不断的添加,它生成的坐标 x 和 y 不是固定的。
{
// 在这里我们调用函数
Move();
}
private Vector2 startPos; // 用于记录我们初始坐标的位置
// 在什么时候开始记录呢?
// 在我们 Start 的时候记录
private void Start()
{
startPos = transform.position; // 这样我们就拥有了初始坐标了
}
void Update()
{
// 接下来,我们需要在 Update 中判断一下:
if (Mathf.Abs(transform.position.x - startPos.x) > 25)
{
Destroy(this.gameObject); // 把当前的 gameObject 进行销毁 // Destroy 固定函数,移除场景中的 gameObject
}
// 在这里我们调用函数
Move();
}
进行测试:
![](/assets/unity-2354713-COrchKpN.gif)
这个 25,具体大小按你自己的需要来修改即可。
设为比较大的数值也是比较稳妥的方法。
7. 作业
三个汽车都做好。
- 修改锚点位置 Custom 0.5、0.2
- 创建动画
- 添加碰撞体
- 设置标签
- 绑定 MoveForward 的方法
- 每个小汽车可以设置不同的速度,比如2.1、2.5、2.8都可以,根据自己的想象设置速度
- 最后测试自己的小汽车
8. 寻找生成点
下一节,我们来学习如何随机生成我们的小汽车。
先拖拽一个小汽车到我们的 Road 当中
![](/assets/image-20230818183803335-Cpj6z-J2.png)
键盘的 F 键可以帮助我们快速锁定它的位置。
![按下 F 键盘](/assets/unity-2355222-Bg8el8pb.gif)
如果觉得小汽车的高度没有问题的话,我们就适当的向左移动。
![](/assets/unity-2355316-DvWRyAn9.gif)
比如说通常在下面那个位置,不会穿帮:
![](/assets/image-20230818184228337-BtJ3isve.png)
如果你往前生成就有可能会出现闪现的小汽车,所以至少要在场景之外。
所以我们要记住这个位置:
![](/assets/image-20230818184402055-DHivhKpb.png)
我希望在这个位置创建一个空的 GameObject,我可以鼠标右键创建 GameObject:
![](/assets/image-20230818184629396-nPNzRYqE.png)
把我们创建的 GameObject 拖到和小汽车同级,你会发现和我们的小汽车的坐标依然是在同一个位置。
![](/assets/image-20230818184741259-CTG_RYgj.png)
![](/assets/image-20230818184806171-Rn5RtFrw.png)
SpawnPoint A
第一个生成点
![](/assets/image-20230818185048060-GMTMS_OQ.png)
![](/assets/image-20230818185600211-7kIywYAB.png)
![](/assets/image-20230818185624589-B6SYlg0l.png)
![](/assets/image-20230818185731484-D2i91FOh.png)
不管它有什么物体在上面都会有颜色。
9. 测试
清空小汽车预制体的坐标:
![](/assets/image-20230818185839158-Bwh0dXcu.png)
这样,在我们后面拖拽的时候就会到我们提前定好的生成点。
![](/assets/unity-2356506-vkc8ajrg.gif)
欢迎关注我公众号: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