unity2D:角色下蹲移动
注:该文为学习笔记,具体请看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 colliderBoxpublic 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;}}}
可以了,呼,好累
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
