2D 平台动作冒险游戏

news2024/11/15 17:49:16

本文实现比较流畅的跑和跳跃

跑的动画需要从idle经历到walk再到run的过程,这个过程可以用融合树实现

也可以让玩家在按下按键时先固定播放完一个walk的动画,然后再自动切换到run的状态。

 

只不过在任何状态时,只要玩家松开了按键,就让玩家回到idle状态。

这个状态机如下:

 

对于跳跃的这个状态,我们使用一个子状态机来做,将和跳跃有关的状态都放在里面而不是外面。

从任何状态都可以进入到跳跃状态,跳跃动画播放完毕则无条件进入坠落状态。

遇到地面时,则让坠落状态立马切换为着陆状态,着陆状态动画完整播放完毕则再次进入idle状态。

使得玩家移动起来的代码方式需要用刚体,那么就有两种方式。一个是给予刚体力,一个是直接赋予刚体速度。给力的方式类似物理效果,但是实际移动不需要那么真实。使用赋予速度的方法即可。

 代码很简单此处略。

判断着陆

判断着陆核心思想是使用OnCollisionEnter和OnCollisionExit,碰撞的时候并判断与玩家所接触的物体的Layer是否是特定的地面。是的话则判断玩家不在地面上了。

但是光这样还不够,如果玩家是从上往下接触地面,那么此时是正常落地。但是如果玩家从下往上接触地面,比如从下面的格子跳到上面的格子中,此时不能判断玩家落地了。我们可以通过函数来判断玩家和层接触是从下往上还是从上往下。

使用到了下面这个api

代码如下:

当被碰撞的物体满足下面这个代码条件时,我们则认为玩家是从上往下着陆的

col.contacts[0].normal == Vector2.up


    private void OnCollisionEnter2D(Collision2D collision)
    {
        Grouding(collision, false);
    }
    private void OnCollisionStay2D(Collision2D collision)
    {
        Grouding(collision, false);
    }
    private void OnCollisionExit2D(Collision2D collision)
    {
        Grouding(collision, true);
    }
    private void Grouding(Collision2D col, bool exitState)
    {
        if (exitState)//离开为真
        {
            if (col.gameObject.layer == LayerMask.NameToLayer("Terrain"))
                isOnGround = false;
        }
        else
        {
            if (col.gameObject.layer == LayerMask.NameToLayer("Terrain") && !isOnGround && col.contacts[0].normal == Vector2.up)//从上往下
            {
                characterEffect.DoEffect(CharacterEffect.EffectType.FallTrail, true);

                isOnGround = true;
                
                JumpCancle();
            }
            else if (col.gameObject.layer == LayerMask.NameToLayer("Terrain") && !isOnGround && col.contacts[0].normal == Vector2.down)
            {
                JumpCancle();
            }

        }
        animator.SetBool("isOnGround", isOnGround);

    }

然后还需要设定动画机中的触发跳跃动画的trigger取消防止其再次进入。

    private void JumpCancle()
    {
        animator.ResetTrigger("jump");
        jumpTimer = 0.25f;

    }

 

Cinemachine中的dead zone代表的是玩家在这个范围内移动,相机不会也跟着一起移动:

 

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

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

相关文章

钧瓷产业数字化,将促使禹州走向更高级的社会形态——钧共体

讲好钧瓷产业的故事 有深度的故事,有温度的内容 有态度的文字,有立场的思考 版权声明:钧瓷内参独家发布,侵权必究 第334期 钧瓷内参 2023年1月1日 这里的上市指沪深的主板,创业板和科创板,区域的挂牌不算。 这个数据是根据禹州钧瓷产业2022…

GPU服务器之Colab配置及使用教程

在进行深度学习过程中,不可避免需要进行炼丹的操作,而博主的电脑本身性能就很拉跨,一旦再运行其他的应用便是寸步难行,最好的办法便是再买一台,哈哈哈,当然也可以使用一些云服务器来进行,博主这…

MySQL调优-深入理解MySQL索引底层数据结构与算法

目录 索引的定义 B-Tree (1) 非叶子节点不存储data数据,只进行存储索引(这个索引是冗余的索引,多余的),可以放更多的索引 (2) 叶子节点包含所有的索引字段 (3) 叶子节点用指针相互连接,提高区间访问的性能 Hash (1) 对索引的…

基于pybind11的c++开发cuda算子用于python调用

一、环境 win10VS2022python39pybind11最新版git下载源码,后边会用:https://github.com/pybind/pybind11同时通过pip install pybind11,python环境下也要安装cuda环境配置参考:https://zhuanlan.zhihu.com/p/488518526二、cuda核函数动态库生成 步骤一:创建cuda项目 创…

VueElement

一、vue 1.1 概述 接下来我们学习一款前端的框架,就是VUE。 Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。 我们之前也学习过后端的框架 Mybatis , Mybatis 是用来简化 jdbc 代码编写的;而 VUE 是前…

绝对路径和相对路径

目录 1说明 2.相对路径的优势 3.注意 4./说明 1说明 绝对路径:文件真实的存放位置 例:D:\data\applogs\xxl-job\xxl-job-admin.log 不需要知道其他任何信息就可以根据绝对路径判断出文件的位置 相对路径:相对于当前位置的路径 前端开…

QT学 控件(四)步长调节框(QSpinBox + QDateTimeEdit)

文章目录QSpinBoxQDateTimeEditQSpinBox 允许用户通过单击向上/向下按钮或按键盘上的上/下来选择一个值来增加/减少当前显示的值。用户还可以手动键入值 常用于处理 选择 : 【1-99】 【星期1一 - 星期天】【1月-12月】 样式: 继承自: QAb…

网络协议(二):MAC地址、IP地址、子网掩码、子网和超网

网络协议系列文章 网络协议(一):基本概念、计算机之间的连接方式 网络协议(二):MAC地址、IP地址、子网掩码、子网和超网 目录一、MAC地址二、IP地址1、IP地址的组成2、IP地址的分类三、子网划分1、等长子网划分2、变长子网划分四、超网五、判断一个网段…

DIY NAS服务器之OMV 5.6入坑指南(四) -安装docker和Portainer

系列文章目录 DIY NAS服务器之OMV 5.6入坑指南(一)-openmediavalut 5.6安装DIY NAS服务器之OMV 5.6入坑指南(二)- 安装omv-extras插件DIY NAS服务器之OMV 5.6入坑指南(三)- 切换系统源​​​​​​​ ​​…

CentOS安装Vscode-yum+Vscode前端开发必安装的插件

CentOS安装Vscode-yum Visual Studio Code 是 Microsoft 产品和开源跨平台代码编辑器。 它提供内置调试支持、代码完成、集成终端语法高亮、嵌入式 Git 控制、代码重构和代码片段。 在本教程中,我们将介绍如何使用 CentOS 7 机器上的官方代码存储库安装最新版本的…

Python--你见过雪飘人间吗?

happy new year 突然想来一点雪花特效。 其实Python做前端效果还是很少的,也就大概记录一下画法啦 对了祝大家新的一年快乐,早点脱单吧!!! 附上一张女神的照片 Python-turtle 科赫曲线是一种分形。其形态似雪花&am…

地宫夺宝(三种方法)(第五届蓝桥杯省赛C++A/B/C组,第五届蓝桥杯省赛JAVAB/C组)

PS:方法一和方法看起来复杂,但其实较容易理解,大家不要跳过哦。至于方法三的动态规划则可能有点抽象,理解起来有点难度。 目录 题目描述: 三种方法: 方法一:暴力枚举(该方法只能获得30分&…

函数传参问题,桶排序去重,分治递归,摩尔投票求数组众数,数组中心下标求法

TIPS 1. 我们都知道,地址,指针这两者是完全等价的概念,但是有微小的差别。地址的话是不能够修改的(比如说数组名就是违法的),而指针的话可以与--。 2. 以后一旦在代码里面看到字符char类型的,…

安全回顾总结

xss反射型漏洞复现 观察源码&#xff0c;可以看出源码中通过get传参到变量xss&#xff0c;并将一些特殊符号过滤了&#xff0c;则后续需要考虑该规则的绕过 echo “<img src”{$xss}">"; img标签 <img src“aaa” οnerrοr“alert(1)” 如果img图片不存在…

自然语言处理-01神经网络

数学和PY 向量是同时拥有大小和方向的量。向量可以表示为排成一排的数字集合&#xff0c;在 Python 实现中可以处理为一维数组。 向量和矩阵可以分别用一维数组和二维数组表示。另外&#xff0c;在矩阵中&#xff0c;将水平方向上的排列称为行&#xff08;row&#xff09;&…

2.SpringBoot-Condition

一、 参考 04-SpringBoot自动配置-切换内置web服务器_哔哩哔哩_bilibili 二、 Condition 顾名思义&#xff1a;条件。有点类似于if语句&#xff0c;只不过是通过注解的形式来实现。 以一个实际需求来学习该原理&#xff1a;有一个实体类User&#xff0c;想要创建该实例化对象…

Retrift

文章目录一、Retrift简介二、Retrift使用介绍三、注解1、GET2、POST3、PUT4、DELETE一、Retrift简介 retrift官网 1、是一个基于okhttp的网络请求框架 2、通过注解配置网络请求参数 3、图片链接和图片上传 4、支持同步和异步网络请求 5、支持多种数据的解析,提供对Rxjava的支…

光环:软件工程环境堆栈建设思路——徐磊

摘要&#xff1a;文章内容主要来源于光环国际2022年第三届中国科创者大会徐磊老师的分享&#xff0c;原分享名称为"企业开发者平台建设思路&#xff0c;云原生技术如何赋能开发者"。简述当前软件工程中Devops平台还缺少一个软件调试环境环节&#xff0c;这个环境其实…

stacking方法,boosting算法,与bagging的区别,adboost算法权重固定,regionboost权重动态学习

stacking方法&#xff0c;boosting算法&#xff0c;与bagging的区别&#xff0c;adboost算法权重固定&#xff0c;regionboost权重动态学习 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#…

VBA之正则表达式(38)-- 提取规格数据(1/2)

实例需求&#xff1a;A列为某产品名称&#xff0c;现需要提取其中的规格数据&#xff0c;具体规则如下&#xff1a; 规格数据以如下关键字开头&#xff1a;RO、RE、SQ、SD、QD、OB、HX、ET、QR、D2规则数据可能有多段&#xff08;截图中红色部分&#xff09;提取规格数据之后&…