Unity记录2.1-动作-多段跳、蹬墙跳、墙体滑落
汇总:Unity 记录
摘要:实现跳跃、蹬墙跳与贴墙下落,重写了项目。
原型碰撞箱 2023/02/13
- 碰撞箱有圆形的,设置后左右移动会令物体旋转,为刚体开启轴的旋转限制以解决。
跳跃 - 2023/02/13
- 教程里面是加一个脚底的圆形判定点来实现,但是我的对象是圆的,我希望它下半身碰到任何可接触物块时都能跳跃,那这个圆形判断就不太好。
- 比如卡在缝里,下半身肯定有接触才能卡,但是因为圆形碰撞太小,导致没判断接地,太大的话,腾空就能跳跃。
- 今天改了几个小时的跳跃,其中一个版本效果很好,可以在被卡着的缝里跳出,且不会在墙壁上起跳。
- 加三个碰撞体,中间 middle 一个扁的长方体,下方 lower 一个圆形,最底 foot 一个窄一点的长方体。
- 所有跳跃都需要lower触碰时才能起跳。
- middle有接触时表示碰到墙,不允许起跳,除非 foot 也有接触。
- 使用圆形的 lower 避免太远就可起跳,违和。
- 但还有一个问题,他可以卡在墙上,不是跳跃的问题,是摩擦力的问题。
- 然后我把摩擦力关了,发现能直接从缝里移动出来,跳跃可以简略
- 所以我把我几个小时的成果删了,把 foot 换成大约占 0.5 宽度的 edge,edge 由六个点组成,刚好不会离碰撞体太远,也不会因为速度太快导致撞墙可以跳跃。
- 简化掉不必要的东西,避免性能浪费。
蹬墙跳与贴墙下落 - 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);
}
共有 0 条评论