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

news2024/11/18 13:59:47

文章首发及后续更新:https://mwhls.top/4450.html,无图/无目录/格式错误/更多相关请至首发页查看。
新的更新内容请到mwhls.top查看。
欢迎提出任何疑问及批评,非常感谢!

汇总:Unity 记录

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

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

目录
原型碰撞箱 2023/02/13
跳跃 – 2023/02/13
蹬墙跳与贴墙下落 – 2023/02/14 – 2023/02/15
项目重写 – 2023/02/15

原型碰撞箱 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);
}</code></pre>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依学习(前后端分离版)——自定义注解@Log(如何自定义注解,实现aop)

如何自定义注解 aop的基本知识与应用 若依对用户的一些更新删除等敏感操作操作进行了日志记录 注解定义和切面处理的项目位置 第一步&#xff1a;自定义注解log 定义了注解的相关信息。这里定义的属性可以在使用时加以定义 注解Target和Retention的作用 第二步切面逻辑…

动手实现一遍Transformer

最近乘着ChatGpt的东风&#xff0c;关于NLP的研究又一次被推上了风口浪尖。在现阶段的NLP的里程碑中&#xff0c;无论如何无法绕过Transformer。《Attention is all you need》成了每个NLP入门者的必读论文。惭愧的是&#xff0c;我虽然使用过很多基于Transformer的模型&#x…

synchronized从入门到踹门

synchronized是什么synchronized是Java关键字&#xff0c;为了维护高并发是出现的原子性问题。技术是把双刃剑&#xff0c;多线程并发给我带来了前所未有的速率&#xff0c;然而在享受快速编程的过程&#xff0c;也给我们带来了原子性问题。如下&#xff1a;public class Main …

【微服务】认识微服务

目录 1.1 单体、分布式、集群 单体 分布式 集群 1.2 系统架构演变 1.2.1 单体应⽤架构 1.2.2 垂直应⽤架构 1.2.3 分布式架构 1.2.4 SOA架构 1.2.5 微服务架构 1.3 微服务架构介绍 微服务架构的常⻅问题 1.4 SpringCloud介绍 1.4.1 SpringBoot和SpringCloud有啥关…

[1.3_2]计算机系统概述——中断和异常

文章目录第一章 计算机系统概述中断和异常&#xff08;一&#xff09;中断的作用&#xff08;二&#xff09;中断的类型&#xff08;三&#xff09;中断机制的基本原理小结第一章 计算机系统概述 中断和异常 中断的作用中断的类型 内中断&#xff08;也称“异常”&#xff09;…

ES之DSL查询文档基础查询

分类 query查询分类 总体规律就是逻辑性的&#xff0c;从外层的你干嘛&#xff0c;到下一层的查询类型&#xff0c;再到下一层的查询字段&#xff08;如果需要的话&#xff09;和然后是查询内容 查询所有 语法 get /索引库名/_serarch {"query":{"查询条件…

【Linux】配置动态IP

动态IP 服务器重启完成之后&#xff0c;我们可以通过linux的指令 ip addr 来查询Linux系统的IP地址&#xff0c;具体信息如 下: 从图中我们可以看到&#xff0c;并没有获取到linux系统的IP地址&#xff0c;这是为什么呢&#xff1f;这是由于启动服务器时未 加载网卡&#x…

2D图像处理:Qt + Opencv使用光度立体法检测Halcon中提供的缺陷图像

文章目录 不需知道光源方向一、光度立体法(后续有时间在查资料研究)1.1 问题1:Slants和Tilts的理解(暂时是理解的)1.2 问题1:Gradient通道数为1,为何像素点对应的值会有两个?1.3 问题2:F(r,c)=(u(r,c),v(r,c)) 关于高斯曲率和平均曲率如何计算的?二、非标定光源实现光…

C++经典20题型,满满知识,看这一篇就够了(含答案)

今天找了20道c的经典题型&#xff0c;看这一篇就够了&#xff0c;全是干货 目录 1、题目&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总…

【蓝桥杯集训11】BFS(4 / 4)

目录 844. 走迷宫 - BFS求最短路 1233. 全球变暖 - BFS 845. 八数码 - 最短路BFS 状态表示 一二维坐标转换 为什么BFS保证走的是最短路&#xff1f; 一二维坐标转换&#xff08;nn矩阵&#xff09; 1562.微博转发 - BFS按层遍历 有向图 844. 走迷宫 - BFS求最短路 活…

Centos7安装中文字体

一、背景 最近一直在重写2021年毕设的前端页面&#xff0c;用vue3vite实现的响应式布局&#xff0c;目前完成10%。但在部署到Linux上时&#xff0c;遇到了服务端生成的中文验证码混乱的问题&#xff0c;通过远程断点&#xff0c;排除编码的问题&#xff0c;原来是由于Linux没有…

Linux网络编程 第六天

目录 学习目标 libevent介绍 libevent的安装 libevent库的使用 libevent的使用 libevent的地基-event_base 等待事件产生-循环等待event_loop 使用libevent库的步骤&#xff1a; 事件驱动-event 编写一个基于event实现的tcp服务器&#xff1a; 自带buffer的事件-buff…

深圳大学计软《面向对象的程序设计》实验14 运算符重载2和函数模板

A. 日期比较&#xff08;运算符重载之类型转换&#xff09; 题目描述 定义一个日期类CDate&#xff0c;包含属性&#xff1a;年、月、日&#xff0c;都是整数。 构造函数含单个参数&#xff0c;参数是八位整数&#xff0c;默认值为0&#xff0c;实现整数转为日期类型&#x…

【基于感知损失的无监督泛锐化】

PercepPan: Towards Unsupervised Pan-Sharpening Based on Perceptual Loss &#xff08;PercepPan&#xff1a;基于感知损失的无监督泛锐化&#xff09; 在基于神经网络的全色锐化文献中&#xff0c;作为地面实况标签的高分辨率多光谱图像通常是不可用的。为了解决这个问题…

C++初学笔记整理

目录 1. C关键字 2. 命名空间 1&#xff09;命名空间的引入和概述 2&#xff09;命名空间的定义 3&#xff09;std与命名空间的使用 4).相关特性 3. C输入&输出 4. 缺省参数 1 &#xff09;缺省参数概念 2&#xff09;使用及分类 a.全缺省 b.部分缺省 5. 函数…

力扣-337打家劫舍III(dp)

力扣-337打家劫舍III 1、题目 337. 打家劫舍 III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有…

【FMCW 01】中频IF信号

FMCW信号 调频连续波(frequency modulated continuous wave&#xff0c;FMCW)顾名思义&#xff0c;就是对信号的频率进行线性调制的信号。 从时域上看&#xff0c;对频率的调制&#xff0c;就像一把连续的锯齿波。其中每一个锯齿叫做一个chirp&#xff0c;其持续的时间叫做ch…

Android仿微信选择图片

效果展示首先先添加用到的权限<uses-permission android:name"android.permission.INTERNET" /><!--获取手机存储卡权限--><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:nam…

java 包装类 万字详解(通俗易懂)

前言简介和溯源拆装箱String类和基本类型的相互转化String类和包装类型的相互转化八大包装类的常用方法汇总&#xff08;含代码演示&#xff09;一、前言 : 本节内容是我们《API-常用类》专题的最后一节了。本节内容主要讲包装类&#xff0c;内容包括但不限于包装类的诞生&…

Linux磁盘占满,如何清理磁盘空间

目录解决思路&#xff1a;先查linux磁盘为什么占满了&#xff0c;是什么导致的&#xff0c;这样才好去定位目录&#xff0c;清楚空间写者的问题是测试环境磁盘占满&#xff0c;原因是测试环境tomcat的日志都会保留&#xff0c;日志空间占用太大把linux磁盘占满&#xff0c;导致…