首页 > 其他分享 >Unity引擎2D游戏开发,滑墙及蹬墙跳的实现总结

Unity引擎2D游戏开发,滑墙及蹬墙跳的实现总结

时间:2024-01-31 16:14:08浏览次数:35  
标签:动画 && 滑墙 2D Unity rb velocity onWall

一、滑墙动画的实现

执行动画的逻辑

// 在墙壁上
onWall = (touchLeftWall || touchRightWall) && !isGround;

基本逻辑:紧贴墙壁并且不在地面上的时候执行滑墙动画

但是实际上,紧贴墙壁原地跳起也会执行滑墙动画

所以,需要额外添加一个条件。跳起离开地面,并施加与面朝X轴方向的力时,才执行滑墙动画
需要调用PlayerController中的Input Direction,不过需要做是否为玩家人物的判断
image

最终代码:

// 在墙壁上
if(isPlayer)
{
    onWall = (touchLeftWall && playerController.inputDirection.x < 0f || touchRightWall && playerController.inputDirection.x > 0f) && !isGround;
}

动画抽搐

究其原因,是因为跳跃后跳跃动画和滑墙动画的反复执行导致的,所以需要给跳跃动画加一个条件
即,不在onWall状态时执行跳跃动画
image

优化动画执行逻辑

目前动画有两个问题:
1.跳跃前按住方向键,再进行贴墙跳跃,是不会执行任何动画的
2.跳跃瞬间按住方向键,能够在执行贴墙动画的时候进行上升

以上两个问题都是不符合正常情况的,因此需要进行优化
优化逻辑是:
在跳跃时,刚体是会有一个y轴方向的瞬时力,因为当此瞬时力为负数时,即跳跃到最高点下落时,进行贴墙动画

因此,最终代码为

// 在墙壁上
if(isPlayer)
{
    onWall = (touchLeftWall && playerController.inputDirection.x < 0f || touchRightWall && playerController.inputDirection.x > 0f) && rigidbody2D.velocity.y < 0f;
}

改变滑墙速度

如果是在墙上,刚体竖直方向的力减半

if(physicsCheck.onWall)
{
    rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y / 2);
} else
{
    rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y);
}

二、蹬墙跳

实现逻辑

按住方向的反方向施加一个瞬时力

if(physicsCheck.onWall)
{
    rb.AddForce(new Vector2(-inputDirection.x, 2f) * wallJumpForce, ForceMode2D.Impulse);
}

蹬墙跳出后立即回墙的问题

由于跳出后依旧再按住方向键,因此,跳出后会立即回来

新建一个wallJump状态,修改人物移动逻辑

// 人物移动
if (isCrouch)
{
    rb.velocity = new Vector2(0.0f, 0.0f);
} else if(!isCrouch && !wallJump)
{
    rb.velocity = new Vector2(xDirection * speed * Time.fixedDeltaTime, rb.velocity.y);
}

即,wallJump状态为true的时候,不允许进行方向上的移动

if(physicsCheck.onWall)
{
    rb.AddForce(new Vector2(-inputDirection.x, 2f) * wallJumpForce, ForceMode2D.Impulse);
    wallJump = true;
}

然后,当跳跃下落过程中,再设置为false,即可进行移动

if(wallJump && rb.velocity.y < 0)
{
    wallJump = false;
}

标签:动画,&&,滑墙,2D,Unity,rb,velocity,onWall
From: https://www.cnblogs.com/xinlindeyu/p/17999288

相关文章

  • CF282D Yet Another Number Game
    题意简述有\(n\)堆石子,第\(i\)堆包含\(a_i\)个,每次可以选择任意一堆取出任意数量石子,也可以选择对于所有石子堆都拿走任意数量化石子。问先手必胜还是后手必胜。\(n\le3,a_i\le300\)。解法一:动态规划发现\(a_i^3=2.7\times10^7\),完全能压到状态里,直接做dp即可。但......
  • Unity架构师进阶:红点系统的架构与设计
     面试的时候经常被问道如何来设计一个红点系统,本文将详细地介绍如何设计一个红点系统,有哪些接口,并完整地给出实现。红点系统的需求分析首先我们来分析一下红点系统的设计需求: 红点系统严格意义上来说不属于框架,而是游戏逻辑,所以代码不要放到通用的框架里面,并不属于基础服务......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    前言Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交......
  • Unity5.x shader打包AssetBundle总结
    unity5.x  shader打包AssetBundle总结最近比较忙,好久没有更新博客了,新项目切换到unity5.x后使用了新的打包机制,在打包shader的时候遇到了一些问题,这里来记录一下吧。 在上一个项目中,我们使用unity4.7,对于shader并没有进行依赖打包,而是由unity打包到了每个用到的AssetBundle......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础......
  • Unity_物体对象跟随鼠标移动360°旋转
    ///<summary>///对象旋转跟随鼠标移动///</summary>publicvoidObjectRotateFollowMouseMove(){if(Input.GetMouseButtonDown(0)){lastMousePoint=Input.mousePosition;}elseif(Input.Get......
  • 百川终入海 ,一站式海量数据迁移工具 X2Doris 正式发布
    在大数据分析领域,ApacheDoris作为广受认可的开源实时数据仓库,已经在越来越多行业用户的真实业务场景中得到广泛应用,成为许多企业数据分析基础设施的重要基座。尤其在过去一年多的时间里,越来越多企业选择基于ApacheDoris进行升级,将过去基于Hadoop体系的离线数据仓库进行实时......
  • Unity-GC优化相关笔记
    Unity官网GC定义如下创建对象、字符串或数组时,用于存储它的内存是从称为堆的中央池分配的。当此项不再使用时,其先前占用的内存可被回收并用于其他目的。在过去,通常由程序员通过适当的函数调用显式地分配和释放这些堆内存块。如今,Unity的Mono引擎等运行时系统会自动为您管理内......
  • 最新Unity DOTS Instancing合批:如何针对单个渲染实体修改材质参数
    最近在做DOTS的教程,由于DOTS(版本1.0.16)目前不支持角色的骨骼动画,我们是将角色的所有动画数据Baker到一个纹理里面,通过修改材质中的参数AnimBegin,AnimEnd来决定动画播放的起点和终点,材质参数AnimTime记录当前过去的动画时间。但是在做大规模战斗控制的时候,有10000+的小兵在战斗......
  • Unity架构师进阶:红点系统的架构与设计
    面试的时候经常被问道如何来设计一个红点系统,本文将详细地介绍如何设计一个红点系统,有哪些接口,并完整地给出实现。红点系统的需求分析首先我们来分析一下红点系统的设计需求:红点系统严格意义上来说不属于框架,而是游戏逻辑,所以代码不要放到通用的框架里面,并不属于基础服务。它......