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学习笔记,如有错误,欢迎指正。
本节进行碰撞检测的实现。
对应视频:
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);
}
效果如下: