Unity教程(四)碰撞检测

Unity开发2D类银河恶魔城游戏学习笔记

Unity教程(零)Unity和VS的使用相关内容
Unity教程(一)开始学习状态机
Unity教程(二)角色移动的实现
Unity教程(三)角色跳跃的实现
Unity教程(四)碰撞检测
Unity教程(五)角色冲刺的实现
Unity教程(六)角色滑墙的实现
Unity教程(七)角色蹬墙跳的实现
Unity教程(八)角色攻击的基本实现
Unity教程(九)角色攻击的改进

Unity教程(十)Tile Palette搭建平台关卡
Unity教程(十一)相机
Unity教程(十二)视差背景

Unity教程(十三)敌人状态机
Unity教程(十四)敌人空闲和移动的实现
Unity教程(十五)敌人战斗状态的实现
Unity教程(十六)敌人攻击状态的实现
Unity教程(十七)敌人战斗状态的完善


如果你更习惯用知乎
Unity开发2D类银河恶魔城游戏学习笔记目录



前言

本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记,如有错误,欢迎指正。

本节进行碰撞检测的实现。

Udemy课程地址

对应视频:
Collision Check


一、概述

我们在本节中添加地面和墙体的碰撞检测。

需要调用Gizmos.DrawLine绘制碰撞线条,调用Physics2D.Raycast进行碰撞检测。

最后还要改变上一节的跳跃条件。
在这里插入图片描述


二、地面和墙体碰撞检测

Gizmos是辅助图标用于协助在 Scene 视图中进行视觉调试或设置。DrawLine (Vector3 from, Vector3 to)可以绘制一条从from开始到to的直线。
参考Unity官方手册 Gizmos

Physics2D.Raycast向场景中的碰撞体投射射线,在该过程中,可以检测并报告与光束接触的任何对象。
Raycast (Vector2 origin, Vector2 direction, float distance, int layerMask, float minDepth, float maxDepth);
参数表如下

参数介绍
origin射线在 2D 空间中的起点。
direction表示射线方向的矢量。
distance射线的最大投射距离。
layerMask过滤器,用于仅在特定层上检测碰撞体。
minDepth仅包括 Z 坐标(深度)大于或等于该值的对象。
maxDepth仅包括 Z 坐标(深度)小于或等于该值的对象。

(一)在Player中添加碰撞变量并绘制碰撞检测

添加碰撞面板和变量。

  [Header("Collision Info")]
  [SerializeField] private Transform groundCheck;
  [SerializeField] private float groundCheckDistance;
  [SerializeField] private Transform wallCheck;
  [SerializeField] private float wallCheckDistance;

地面的碰撞线条绘制:起点为groundCheck的位置,向下groundCheckDistance找到终点。
墙体的碰撞线条绘制:起点为wallCheck的位置,向右wallCheckDistance找到终点。

    private void OnDrawGizmos()
    {
        Gizmos.DrawLine(groundCheck.position, new Vector3(groundCheck.position.x, groundCheck.position.y - groundCheckDistance));
        Gizmos.DrawLine(wallCheck.position, new Vector3(wallCheck.position.x+ wallCheckDistance, wallCheck.position.y));
    }

(二)添加groundCheck

在Player下添加两个空物体并更名为GroundCheck和wallCheck
在这里插入图片描述
在这里插入图片描述
将GroundCheck拖入,并增大GroundCheckDistance
在这里插入图片描述
如图:
在这里插入图片描述
调整GroundCheck的位置到角色脚下
在这里插入图片描述
调整GroundCheckDistance使GroundCheck大小合适
在这里插入图片描述

在这里插入图片描述
同样的操作设置好wallCheck
在这里插入图片描述
在这里插入图片描述

(三)调用rayCast实现碰撞检测

添加layerMask过滤器,仅在Ground层上检测碰撞体。

    [SerializeField] private LayerMask whatIsGround;

选择平台添加Ground层
Layer->Add Layer->定义Ground层
在这里插入图片描述
在这里插入图片描述
点击平台,在Layer选项中就可以看到Ground了,选择它
在这里插入图片描述
点击Player,WhatIsGround选择Ground
在这里插入图片描述

在Player的Update函数中添加碰撞检测

 //碰撞检测
 public bool isGroundDetected() => Physics2D.Raycast(groundCheck.position, Vector2.down, groundCheckDistance, whatIsGround);

注:=>是C#6的用法,Expression-bodied 成员,表达式
member => expression;
详细讲解


三、更改跳跃的条件

在这里插入图片描述

PlayerGroundedState里切换跳跃的条件更改为

    public override void Update()
    {
        base.Update();

        if (Input.GetKeyDown(KeyCode.Space)&& player.isGroundDetected())
            stateMachine.ChangeState(player.jumpState);
    }

PlayerAirState里空中状态切换为闲置状态的条件更改为

    //更新
    public override void Update()
    {
        base.Update();

        if(player.isGroundDetected())
            stateMachine.ChangeState(player.idleState);
    }

效果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值