注:该文为学习笔记,具体请看b站upMichael-Studio的unity教程2D入门:13敌人Enemy!
环境:unity2020.3
Update与Time.deltaTime匹配
FixedUpdate与Time.fixedDeltaTime匹配
本文知识点:
蹲下按哪个按钮,unity里面是没有预制的,所以我们要自己设置
第一步,打开Edit——Project Setting——Input Manager,随便选一个右键——DUplicate
这样你就得到了一个复制版
我们修改这个复制的Jump,把他改成蹲下就可以
void Crouch()
{
if(Input.GetButton("Crouch"))
{
Anim.SetBool("crouching",true);
Anim.SetBool("idle",false);
}else
{
Anim.SetBool("crouching",false);
Anim.SetBool("idle",true);
}
}
if和else语句中是响应蹲下或站起的内容,可以根据自己需要写,我这里就是切换一下动画状态
另外要说一下,这里用到的是GetBotton而不是GetBottonDown
这个函数在update中调用(或者在update调用的函数中调用
很多游戏里面都有一些很窄的地形,需要下蹲穿过,这部分就是实现这个内容
“通过”实质上是Player身上的Collider大小可以通过
“不能通过”实质上是Player身上的Collider太大不足以通过
这就说明趴下和站着这两种状态下的Collider是不同的,本着任何状态下Player最好只有一个碰撞体的原则,我们就需要切换碰撞体,在哪里切换呢?就在上面那个函数里面就可以了
首先先给Player添加好两个碰撞体,我这里站立用胶囊,下蹲用了圆
(最好别用方形的,会卡在tilemap里,当然如果你不是用tile做的地形,随意)
说下我的思路,我在写代码的时候,所有的碰撞体都默认的是Coll,然后根据当前状态需要,决定这个Coll到底是StandColl还是CrouchColl
public Collider2D StandColl;//player's colliderBox
public Collider2D CrouchColl;
private Collider2D Coll;//当前正在使用的Collider
状态切换主要在三个地方,首先是Start函数里面,默认Coll为站立coll
void Start()
{
rb=GetComponent();
Anim=GetComponent();
Coll=StandColl;
StandColl.enabled=true;
}
然后是按下趴下键和松开的时候
void Crouch()
{
if(Input.GetButton("Crouch"))
{
Anim.SetBool("crouching",true);
Anim.SetBool("idle",false);
//StandColl被禁用 CrouchColl被启用
StandColl.enabled=false;
Coll=CrouchColl;
Coll.enabled=true;
}else
{
Anim.SetBool("crouching",false);
Anim.SetBool("idle",true);
//StandColl被启用 CrouchColl被禁用
CrouchColl.enabled=false;
Coll=StandColl;
Coll.enabled=true;
}
}
这样就可以了
当我们按下趴下键正在过隧道,此时你松开了,如果站起来了岂不是要卡墙里了,所以应该设置在通过隧道的时候不可以站立起来
实质为,判断头顶上是不是有碰撞体,有的话就不站起来,这里要用到Physics2D(用于 2D 物理的全局设置和 Helper 方法。)——Physics2D详情见官网Unity
要用到它的一个函数
OverLapCircle:Check If a Collider falls within a circle area ——检查碰撞体是否位于一个圆形区域内。圆形由其在世界空间中的中心坐标及其半径定义
函数原型如下(仅仅其中一个重载)
public static Collider2D OverlapCircle (Vector2 point, float radius, int layerMask= DefaultRaycastLayers, ); 中心点、半径、碰撞图层
首先我们设置一个Point,这里我用一个空的gameObject来定义位置
然后代码中的函数即为Physics2D.OverlapCircle(CellingCheck.position,02f,Groud),意思是以CellingCheck为中心,0.2f为半径,检测是否碰到了Ground
这里CellingCheck的值就是Point节点
所以整个总结一下就是这样
public Transform CellingCheck;//将Point赋值给他
void Crouch()
{
if(!Physics2D.OverlapCircle(CellingCheck.position,02f,Groud))
{
if(Input.GetButton("Crouch"))
{
Anim.SetBool("crouching",true);
Anim.SetBool("idle",false);
//StandColl被禁用 CrouchColl被启用
StandColl.enabled=false;
Coll=CrouchColl;
Coll.enabled=true;
}else
{
Anim.SetBool("crouching",false);
Anim.SetBool("idle",true);
//StandColl被启用 CrouchColl被禁用
CrouchColl.enabled=false;
Coll=StandColl;
Coll.enabled=true;
}
}
}
可以了,呼,好累