Unity记录2.1-动作-多段跳、蹬墙跳、墙体滑落

汇总:Unity 记录

摘要:实现跳跃、蹬墙跳与贴墙下落,重写了项目。

参考课程:超新Unity课程用Unity+C#制作2D游戏快速入门到实战课程2D实战课程

原型碰撞箱 2023/02/13

  • 碰撞箱有圆形的,设置后左右移动会令物体旋转,为刚体开启轴的旋转限制以解决。

跳跃 - 2023/02/13

  • 教程里面是加一个脚底的圆形判定点来实现,但是我的对象是圆的,我希望它下半身碰到任何可接触物块时都能跳跃,那这个圆形判断就不太好。
    • 比如卡在缝里,下半身肯定有接触才能卡,但是因为圆形碰撞太小,导致没判断接地,太大的话,腾空就能跳跃。
  • 今天改了几个小时的跳跃,其中一个版本效果很好,可以在被卡着的缝里跳出,且不会在墙壁上起跳。
    • 加三个碰撞体,中间 middle 一个扁的长方体,下方 lower 一个圆形,最底 foot 一个窄一点的长方体。
    • 所有跳跃都需要lower触碰时才能起跳。
    • middle有接触时表示碰到墙,不允许起跳,除非 foot 也有接触。
    • 使用圆形的 lower 避免太远就可起跳,违和。
    • 但还有一个问题,他可以卡在墙上,不是跳跃的问题,是摩擦力的问题。
  • 然后我把摩擦力关了,发现能直接从缝里移动出来,跳跃可以简略
    • 所以我把我几个小时的成果删了,把 foot 换成大约占 0.5 宽度的 edge,edge 由六个点组成,刚好不会离碰撞体太远,也不会因为速度太快导致撞墙可以跳跃。
    • 简化掉不必要的东西,避免性能浪费。

Unity_05_BetterJump.png

蹬墙跳与贴墙下落 - 2023/02/14 - 2023/02/15

  • 实现中途发现脚本太多不好找,于是对项目重写了,介绍下最终效果。
  • 贴墙下落比较简单,不多提。
  • 可以多段跳,多段蹬墙跳,在墙上只蹬墙跳,在地上只跳跃。
  • 不按移动键时可以在墙上使用无水平速度的蹬墙跳,可以在墙壁上获得最高跳跃,不会因为水平速度离开墙壁。
    • 换句话说算是个跨越高墙的小技巧。
  • 跳跃有冷却,用协程实现,涉及到下面更复杂的判定。

项目重写 - 2023/02/15

  • 这次又重写了下,第一次是把命名规范了下,第二次,也就是这次,是把行为归类,并且用了更复杂的判定。
  • 行为归类:
    • 之前是统一用 PlayerBase 来实现移动,动画,攻击。
    • 现在移动,攻击,动画是各自一个类。
    • PlayerBase 只存储角色信息,比如哪些技能可用,剩余次数。
  • 更复杂的判定:
    • 现在所有运动都有新的判定:可用、剩余次数、执行顺序。
  • 一点吐槽:
    • 这几天不务正业了,就早上搞学术,下午晚上都在搞 Unity,明天要注意一下。
    • 但是第三集就是动画切换了,看起来我能开始画动画了!
// 分享一下重写后的跳跃
    public void action_jump(bool keydown_jump, float input_x){
        // condiction
        if (!keydown_jump) return;
        // jump wall
        else if (check_jump_wall()){
            // action
            jump_wall(input_x);
            // animation
        }
        // jump
        if (check_jump()) {
            // action
            jump();
            // animation
        }
    }

    bool check_jump(){
        // skill enable?
        if (!player_base.enableSkill["jump"]) return false;
        // touch ground?
        bool isGrounded = check_touch(player_base.transform_dict["FootTouch"].GetComponent<EdgeCollider2D>());
        if (isGrounded) player_base.recoverSkill("jump", "jump_wall");
        // times enough?
        if (!player_base.consume_skill_times("jump")) return false;
        return true;
    }

    public void jump(){
        // cooldown
        IEnumerator coroutine = player_base.reverse_skill(0.25f, "jump_wall", "jump");
        StartCoroutine(coroutine);
        // action
        rb.velocity = new Vector2(rb.velocity.x, speed_jump_final);
    }

    bool check_jump_wall(){
        // skill enable?
        if (!player_base.enableSkill["jump_wall"]) return false;
        // touch ground?
        bool isGrounded = check_touch(player_base.transform_dict["FootTouch"].GetComponent<EdgeCollider2D>());
        if (isGrounded) {
            player_base.recoverSkill("jump", "jump_wall");
            return false;
        }
        // touch wall?
        bool isStickWall = check_touch(player_base.transform_dict["MiddleTouch"].GetComponent<EdgeCollider2D>());
        if (!isStickWall) return false;
        // times enough?
        if (!player_base.consume_skill_times("jump_wall")) return false;
        return true;
    }

    public void jump_wall(float input_x){
        // cooldown
        IEnumerator coroutine = player_base.reverse_skill(0.25f, "move", "jump_wall", "jump");
        StartCoroutine(coroutine);
        // action
        rb.velocity = new Vector2(rb.velocity.x, speed_jump_wall_final);
        move(-input_x);
    }

版权声明:
作者:MWHLS
链接:https://mwhls.top/4450.html
来源:无镣之涯
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>