跳至主要內容

11-创建场景:草坪

AI悦创原创Unity休闲手机游戏开发UnityUnity休闲手机游戏开发Unity大约 10 分钟...约 3032 字

你好,我是悦创。

接下来,我们要实现一些游戏当作的玩法。

所谓,玩法就是游戏的一些机制。

我们,现在可以让青蛙朝三个方向不断的跳跃,不过我们也不希望青蛙在跳跃的过程中,毫无阻碍。

比如说:我们撞到了栅栏,撞到了小汽车,掉到河里的话,那么游戏都应该结束。所以,接下来我们要学习的就是如何触发这样的判断。

例如:在我们的游戏中,我们不希望我们的希望青蛙在我们的左侧的边界和右侧的边界,继续跳跃。——也就是我们的摄像头,只覆盖中间的范围。如果超越这个范围,游戏就失败了。

那其实就可以理解为:我希望左右两边有一个空气墙,青蛙碰到空气墙,也就判定游戏失败。

1. 空气墙

1.1 创建空气墙

1

1.2 调整空气墙

接下来就可以开始调整空气墙:

1

1.3 空气墙跟随

这样就搞定了?

但是运行之后你会发现,青蛙跳着跳着就离开空气墙了。

我希望,这个空气墙可以不断的跟着我们的青蛙不断的移动。——所以,有什么好的方法呢?

我们之前讲过子物体跟随父类,父物体移动子物体也会跟随。

如果,你选择拖拽到青蛙的低下,成为青蛙的子物体也可以。我们试一试:

运行试一试,我们会发现向前没问题,左右跳跃就有问题了。

这样就无法实现碰撞边界的效果,所以怎么解决?——我们父类选择 Main Camera 即可,因为我们主摄像机就是如此。

那么,我们怎么判断触发上去了呢?

我需要给空白墙添加一个标签,方便我们来查找。

之前,我们讲过,摄像机有属于自己的标签:

1.4 空气墙设置标签

我们也可以给我们的空白墙设置标签。

1

1.5 编写代码

FixedUpdate 后面写代码
FixedUpdate 后面写代码
private void OnTriggerStay2D(Collider2D other)  // other:帮助我们更好理解,除了当前的青蛙以外,对方的 Collider2D,对方的碰撞器就是 other。
    // 我们来判断
    {
        if (other.CompareTag("Border"))  // 比较标签
        {
            // 我们暂时没有其他处理,直接输出调试信息即可
            Debug.Log("Game Over!");
        }

    }

我们保存代码,运行试一试。

这样我们就实现了,我们的栅栏也是一样的方法。

2. 栅栏

2.1 添加碰撞体

不过,要注意⚠️:我们青蛙身上的碰撞体是一直存在的。

那么,如果把栅栏也添加碰撞体的话,我可以如下操作:

1

不过有一个情况,青蛙在跳的过程当中,它有一个移动,但是我们做了一个效果:是一个飞跃。

也就是在空中的时候,我不应该判断,青蛙是不是撞到了栅栏,而是在落地的那一下,开始判断,我是不是撞到了栅栏。所以,明白这个逻辑之后,我们来写这个代码。

为什么不使用 Border 呢?

想我刚刚提到的,我希望它是可以飞跃的,它跟 Border 是有一个小的区别。

所以,我们可以再起一个标签:Obstacle「障碍物」

1

接下来,为我们的栅栏绑定标签:

1

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!");  // 那么游戏就结束了
        }
    }








 
 
 
 
 
 
 
 
 

保存代码,我们去测试一下。

我们现在测试成功。

那么接下来,要实现的时候不停的测试,调整我们的栅栏,以便我们青蛙单独连跳的时候会碰到我们的栅栏。需要配合长跳和短跳才能越过这个位置。

我设置成 8.36
我设置成 8.36

把栅栏拖到 START:

现在栅栏实现了,但是我们以后会有很多类似栅栏的物品。甚至我们的栅栏是会在不同的场景被利用的,也就是反复被利用到的。

2.3 预制体

那这个时候,我们可以把栅栏保存为预制体,这样方便我频繁的调用和使用。

1

我们可以直接把栅栏角色拖进我们的文件夹 Prefabs 预制体文件夹中即可「直接拖拽即可」

1

变成蓝色了,代表成功了。

2.4 预制体的好处

如果我们在 Prefabs 中修改预制体,预制的体的修改,那么场景中所有预制的数值都会被同时修改。——所以,类似实现了模版的效果。

3. 设置墙

3.1 墙的锚点预制

1

3.2 放到我们的场景当中

3.3 添加碰撞体

1

我们现在可以把草坪拖到 Prefabs 并删掉。

拖进去后,你就可以删掉我们的 Wall 了。

3.4 使用预制体

如果我需要在我们的场景中,使用我们的 Wall 我们就可以直接拖入到场景中,这样我们的 Wall 就应用了我们的预先设置的。

可以看见,它应用好了我们之前所有的设置,我们可以更改它的位置。

当然,也可以直接在里面进行复制,也是会一模一样的;

记得把我们的 Wall 的层级,改成 Middle。

那么,这里我会先把 Wall 去掉,我不需要在初始场景中显示我们的 Wall。

4. 建筑物添加碰撞体

这两个建筑都需要拖到 Prefabs:

两个预制体坐标都归零,即可。

5. 设置我们的块

我们需要设置一块,作为我们的一种草地,我们先把我们的 START 隐藏掉:

1

接下来,我们可以把我们的 GrassLand01 向前拖,然后显示 START,即可。

这样看起来,我们整体还不错吧。

这样两个块就连接到一起了。

所以,我们就用这样的方法,把我们的场景,提前做好。然后不断的循环到我们的场景中,这样就好像实现了跑酷的无线模式一样。

6. 添加多个模拟场景

7. 作业

设置至少三个模块,以便后续使用。

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web全栈」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度