首页 > 编程知识 正文

unity控制角色移动,unity做的游戏有哪些

时间:2023-05-06 18:33:09 阅读:157218 作者:2849

Unity2D角色跳文章目录Unity2D角色跳构想用事前准备速度在判断状态的位置判断状态

构想来自B站麦扣第一期教程: https://www.bilibili.com/video/b v1z 4411 o 7w 4

想法

跳跃的动作可以分为上升动作和落下动作两种动作。

玩家可以在站着的时候起跳,也可以在移动中起跳。 因此,在动画控制器中,待机和移动跳跃转移到上升状态,落下状态只能转移到上升状态。 游戏角色掉落在地面上时,应该从掉落的状态转移到待机,当然也可以转移到移动。

事先publicrigidbody 2d Rb=getcomponentrigidbody 2d (); //物体的刚体publiccirclecollider2dcircoll=getcomponentcirclecollider 2d (; //获取圆形碰撞体publicanimatoranim=getcomponentanimator (); //获取动画控制器公共层掩码流; //获取图层,该建议自己在Inspector中选择public float jumpForce; //下定决心时的速度请在你的角色的Game Object中添加这些Component。

需要四个Anim文件。 我的名字是StandAnim、RunAnim、UpAnim和DownAnim。 分别支持待机视频、移动视频、上升视频、落下视频。

要通过速度判断状态,请先配置Animator。

使用velocity名称创建浮动类型参数

从标准和运行UpAnim到UpAnim的传输: velocity大于0UpAnim到DownAnim的传输: velocity从0DownAnim到标准UpAnim的传输要在0.1以下实现跳跃,首先判定角色的位置,在地面上就可以跳,不在地面上就不能跳。 关于二级跳远的设置在此不讨论。 Unity使用RigidBody检测碰撞,并使用IsTouchingLayers检测当前刚体是否与层碰撞。 此方法返回布尔值,如果发生冲突,则返回true;如果没有发生冲突,则返回false。 该方法的蚕食是层掩码,指向Inspector窗口右上角的层。 与Sorting Layers不同,Layers常用于碰撞检测,Sorting Layers控制摄影机中物体的渲染层次。 创建层遮罩后,可以使用GetMask方法赋值或在Inspector中选择一个值。

//checkswhetherthiscollideristouchinganycollidersonthespecifiedlayermaskornotboolcollider 2d.istouchinglayers 在2D游戏中,rb.velocity是Vector2对象,而在3D游戏中,rb.velocity是Vector3对象。 在跳跃过程中,保持x的速度恒定,使y轴随时间变化。

Rb.velocity=new vector2(Rb.velocity.x,jumpForce*Time.deltaTime ); 速度是刚体的速度,如果是正值,速度方向会向坐标轴的正方向延伸。 也就是说,如果velocity.y的值为正值,即y轴的速度大于0,则角色会向上移动。 角色起跳时速度上升时为正值,下降时速度下降时为负值。 在Animator中,可以在设置Animation之间的传递时通过这种方式进行判断。 如果y轴速度大于0,则动画将从等待转换为上升。 如果y轴的速度小于0,动画将从上升转换为下降。

由此,实现了从待机到上升、下降的视频转换。 但是,落地时角色会保持下降的动画,不会返回待机。 当角色在地面上等待时,y轴的速度为0。 当y轴速度为0时,可以将动画从坠落转换为等待。 但是,由于“animator condition”不提供等效判断,因此选择大于-0.1且小于0.1,以便在y轴速度位于此区间内时切换动画。 角色也达到最高点时瞬间速度变为0,但由于在Animator中上升无法转换为待机,所以没有在空中播放待机视频的场景。

实现跳跃的逻辑如下所示。

void Jump () anim.setfloat )、rb.velocity.y ); //角色的速度if (circo ll.istouchinglayers (floor ) ) /确定角色是否在地面上将确定角色与tilemap的碰撞) if (input.genge )

Jump") )// 监听跳跃按钮 { rb.velocity = new Vector2(rb.velocity.x, jumpForce*Time.deltaTime); } } }

以上方法就实现了角色跳跃和动画的切换。但是有一个严重的缺陷,我们是通过y轴的速度来判断运动状态的,如果角色在斜坡上运动,y轴的速度也会变化。就会出现虽然是在上坡,但是动画却是上升的动画。要想避免这个问题,建议不使用速度作为判断标准。

通过位置判断状态

在Animator中创建三个布尔型参数,命名为up,down和stand。

在StandAnim和RunAnim到UpAnim的Transition中添加条件:当up是True时转换。在UpAnim到DownAnim的Transition中添加条件:当down是True时转换。在DownAnim到StandAnim的Transition中添加条件:当stand是True时转换。

下面是在代码中实现的逻辑:

对角色位置进行判断,在地面则可以起跳,不在地面则不可以起跳。当角色起跳时,将up的值设置为True,将stand的值设为false。当y轴速度小于0时,将down的值设置为true,并把up值改为false。当角色落到地面时,将stand的值设置为True,将down的值设为false。

代码样例:

void Jump() { if (cirColl.IsTouchingLayers(floor)) { anim.SetBool("stand",true); anim.SetBool("down",false); if (Input.GetButtonDown("Jump") ) { rb.velocity = new Vector2(rb.velocity.x, jumpForce*Time.deltaTime); anim.SetBool("up",true); anim.SetBool("stand",false); } } else { if (rb.velocity.y<0) { anim.SetBool("down",true); anim.SetBool("up", false); } } }

因为从待机到上升,上升到下落,下落到待机,这三个过程都是单向的,所以可以通过三个bool类型的参数进行判断。这样就避免了由于y轴速度变化导致的动画转换出错。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。