Unity开发日记【第四天】——镜头跟随、物品收集与角色下蹲

目录

一、镜头跟随

二、物品收集系统

三、角色下蹲

四、解决一些问题:


一、镜头跟随

在大多数游戏和游戏场景下我们都需要镜头跟随玩家移动,这里我们就尝试实现这一功能。首先我们给主相机添加一个脚本。

public Transform player; //用以获取玩家位置的变量

首先定义一个变量,保存后从层级选项卡中把player拖动进来

然后继续修改代码,核心思路就是把玩家的position设置成相机的position

void Update()
{
    transform.position = new Vector3(player.position.x, player.position.y, -10f);
}

但是需要注意的是2D游戏相机Z的默认值为-10我们也这样设置就好否则会出现一些bug。 

但是这样设置完之后我们会发现我们可以看见背景图的边界。

所以我们采用另一种办法,打开包管理器,在Unity注册表中寻找Cinemachine,然后安装,安装之后我们可以在游戏对象(GameObject)中找到它 

找到后点击添加一个2D摄像头(在定义后原本的主相机会被替代) 然后在新的镜头的Follow地方把Player拖进来,然后就实现了镜头的跟踪,多插入几个图片使得地图背景变长让玩家看不见边界(将几个背景图层放在一个新建的对象下面)

在2D镜头中选择一个额外的组件Confiner,我们可以看见它这里需要一个2D碰撞器,所以我们为背景添加一个Polygon Collider(这是多边形的碰撞器如果你不需要某个点可以按住ctrl后点击即可删除)然后在这里把这个碰撞器加进来。【注意要把碰撞器的设置勾选触发器否则会把角色挤走】

 

二、物品收集系统

接下来为了让我们的游戏变得更加的丰富,所以我想在我的游戏中实现物品收集的功能,我下载了两个想要收集的物品的素材(宝石和樱桃),那么首先第一步是实体化这两个物体

过程非常简单就是把素材拖拽到层次选项卡就可以,这里不再过多赘述,可以翻看我之前的博客。

然后我发现这个素材是有樱桃的动画的,那么按照之前博客上的方法,给樱桃添加上动画,这样我们就成功把一个有动画的樱桃添加进游戏里了,宝石重复之前的步骤。

【注意:需要调整图层让樱桃可以正常显示】

之后我们发现虽然加入后但是角色会直接穿过去,我们需要实现交互的过程和之前的思路一样我们需要给收集物品添加一个碰撞体,然后通过碰撞响应来处理,那么我们给两个物品分别添加圆形碰撞体

和之前的实现一样为了让角色不会撞上去,所以我们把碰撞体改成触发器。我们试图在角色控制的脚本中使用private void OnTriggerEnter2D(Collider2D collision)这样一个函数实现物品收集的功能,但是如何让脚本知道它碰撞的是哪个物体呢?(下面是这个函数的具体情况,其中collision表示碰到的触发器)

我们在之前实现跳跃的时候使用了图层这一概念来判断角色是否回到了地面,具体实现可以看我之前的博客,那么我们这里使用图层旁边的标签的功能来实现对不同物体的识别,我这里为樱桃和宝石创建一个新标签,然后把两个收集品的标签更改(两个收集品可以分别用不同的标签)

接下来我们回到角色控制的脚本编写代码,如下所示:

public int CollectioncCount = 0; //收集品计数器

private void OnTriggerEnter2D(Collider2D collision)
{
    if(collision.tag == "collection") //如果碰到了收集品
    {
        Destroy(collision.gameObject); //销毁游戏体
        CollectioncCount++; //收集品数量加一
    }
}

这里会出现一个小bug就是因为我们的人物有两个碰撞体所以当这两个碰撞体都和物品碰撞时,计数就会加2,所以这里我把两个碰撞体都定义了出来,当判断是否碰到地面的时候使用footColl但判断是否碰到收集品的时候使用bodyColl

public Collider2D footColl; //脚部碰撞体
public Collider2D bodyColl; //身体碰撞体

 所以对判断条件也加以修改,这样就没有了bug

if(bodyColl.IsTouching(collision) && collision.tag == "collection") //如果身体碰到了收集品

然后我修改了之前的一些代码,实现了对两个不同的收集品分开计数的功能,过程和上面没用什么区别,这里不再赘述

接下来为了开发方便我们想要实现多个樱桃,如果每次我们都制作一遍十分麻烦,我们在根目录下建立一个名为Prefabs(预制)的文件夹,我们把之前做好的两个收集品和玩家移下来,这样我们下次使用的时候就可以直接使用无需再制作

三、角色下蹲

地图制作后角色有些地方过不去所以我为其增添了一个下蹲的能力

首先按照之前的方法实现下蹲的动画,然后我们去设置一下下蹲的按键

然后我们进入动画器设置一下动画切换的逻辑

 这里我新建了一个bool类型的变量但这个变量为true且玩家在run或者idle状态的情况下就可以变成下蹲状态,当crouching为false时恢复站立状态

 然后添加如下代码在Update()中,这里在判断按键按下的时候没有采用跳跃的函数GetButtonDown,而是用了GetButton,区别在与GetButton在按键一直按住的时候一直返回true,然后为了实现可以下蹲通过某些本来不能通过的地方(本质上碰撞体发生碰撞),我这里让身体部分的碰撞体不可以使用,恢复姿态后重新使用实现了这个功能。然后在这个过程中通过对速度的控制来实现下蹲速度变慢的效果

if (Input.GetButton("Crouch")) //实现角色下蹲
{
    anim.SetBool("crouching", true);
    bodyColl.enabled = false;
    speed = 5;
}
else //恢复姿态
{
    anim.SetBool("crouching", false);
    bodyColl.enabled = true;
    speed = 10;
}

 保存代码后测试,发现可以正常运行,但是出现了一个bug就是在通过狭窄路径的时候如果松开了下蹲按键人物就会卡在地图上,我们需要添加一个“起身限制”。我这里使用Physics2D来实现,它的本质就是检查碰撞体是否位于一个圆形区域内。

函数原型如下(仅仅是其中一个重载)

OverlapCircle (Vector point, float radius, int layerMask= DefaultRaycastLayers); 三个参数分别为检测园的中心点、半径、碰撞图层 

我使用角色刚体的位置作为第一个变量重新书写下蹲函数

if (!Physics2D.OverlapCircle(rb.position, 0.1f, ground))
{
    if (Input.GetButton("Crouch")) //实现角色下蹲
    {
        anim.SetBool("crouching", true);
        bodyColl.enabled = false;
        speed = 5;
    }
    else //恢复姿态
    {
        anim.SetBool("crouching", false);
        bodyColl.enabled = true;
        speed = 10;
    }

四、解决一些问题:

1、在跑动中产生一些蓝线,把瓦片地图添加一个组件Grid然后把x和y改为0.99和0.99

2、在斜坡会滑落的问题

之前为了解决跳跃的时候蹭墙的问题我给角色的刚体加上了摩擦力等于0的材质,但是这导致了角色站在斜坡上会下滑的bug,所以我将刚体的材质取消,把这个材质加到了身体的碰撞器上,这样就解决了这个bug

3、无限跳的问题,这里重新修改了角色控制代码主要的思路是但玩家按下空格的同时要判断角色是否在地面,只有两个条件同时成立才允许跳跃完整代码如下:

if (Input.GetButtonDown("Jump") && footColl.IsTouchingLayers(ground))
{
    rb.velocity = new Vector2(rb.velocity.x, jumpforce);
    anim.SetBool("jumping", true);
}

猜你喜欢

转载自blog.csdn.net/qq_50688324/article/details/126984530