Unity2D角色跳上天花板的方法

写在前面:

​ 自学Unity2D中,本文所用方法是我作为初学者自己设想出来的方法,在实际生产中可能存在更好,更优的解决办法,欢迎大佬们指出。
​ 本内容基于B站Unity官方讲师M_Studio的视频:Unity教程 Your First Game|入门Tutorial:07 跳跃动画 LayerMask(视频跳转地址)和其之前内容所做,本文直接从其已提及知识点开始讲,相关知识点可以去看该UP主的视频进行学习。其后继视频可能有提及相关解决办法,此处仅为我个人在当时的设想和实际解决测试。

1.具体问题

​ 视频中UP主采用对地图地形添加Tilemap Collider 2D组件,和向玩家对象的脚部区域添加Circle Collider 2D组件并将原本的Box Collider 2D移至头部作为将来的头部碰撞检测来实现玩家脚部对地图地形的碰撞检测,但是在实际游玩中,容易发生玩家脚碰到墙壁地形会导致角色卡住在墙上的问题,同时也玩家角色也不能像冒险岛一样实现从下面的地形跳上上面的地形的问题(会因为碰撞到地形的底部,即“天花板”)。

2.需求分析

​ 1.当前游戏地形主要分类两类:地面地形和墙壁地形。
​ 2.玩家可以通过直接跳跃的方式从低处的地面地形中跳上高处的地面地形(穿过“天花板”)
​ 3.玩家碰撞到墙壁的时候X轴方向的运动会停下来,但是Y轴的运动不变。

3.解决思路

​ 在Collider中存在一个属性:is trigger,该属性在未被勾选时,如果对象的Collider与其他的Collider之间发生碰撞时,会对该对象进行碰撞的计算。该项目中玩家与地形的碰撞如同显示中人与地形的碰撞,玩家(人)因为与墙壁发送碰撞,导致在x轴方向上的速度被减为0。

​ 但如果将is trigger属性勾选上,虽然项目中Collider.IsTouchingLayers(ground)的判断结果依然为true,但是对象却不会因此而对当前的运动状态进行重新的计算,即实现穿墙的效果。

4.实际解决

4.1修改地图的tilemap collider

打开地图资源的spride editor,进入"Custom Physics Shape",选择要修改碰撞器的资源,点击"Generate",此时界面会重置并展示当前资源的碰撞器范围,根据自己需求修改碰撞器范围。修改后记得重新添加如Tile Palette中。

4.2绘制地形和墙壁的Tilemap

​ 绘制两个瓦片地图,此时我们可以看到我们的地形地图中,地形的tilemap collider只剩下了我们在spride editor中修改的那顶部的部分了,另外记得添加Layer Tag


4.3实现向上的跳跃

​ 按照思路分析,我们可以让角色在跳跃的时候将is trigger属性设置为true,此时角色不会因为在向上跳跃的时候因为撞天花板而停下。

if (Input.GetKey(KeyCode.Space) && onFloor == true)
{rigidBody.velocity = new Vector2(rigidBody.velocity.x, jumpForce*Time.deltaTime);animator.SetBool("jumping", true);onFloor = false;footCollider.isTrigger = true;
}

​ 同时,当角色因为下落而触碰到地面是,角色才会因此停下来,此时我们的is trigger就可以修改回来了。

if (footCollider.IsTouchingLayers(ground) && animator.GetBool("falling"))//当向下掉落到地面上时
{footCollider.isTrigger = false;animator.SetBool("falling", false);onFloor = true;rigidBody.velocity = new Vector2(rigidBody.velocity.x, 0f);
}

4.4实现撞墙的效果

​ 当角色撞墙的时候,X轴方向运动停止,但是Y轴方向运动继续,当角色在地面上的时候,is trigger为真,此时系统会自己让角色的X轴方向运动停止,因此我们只需要在角色处于空中的时候进行修改即可。

void HitWall()
{if(footCollider.isTrigger == true && footCollider.IsTouchingLayers(wall)){rigidBody.velocity = new Vector2(0f, rigidBody.velocity.y);}
}
//也可以写成
void HitWall()
{if((animator.GetBool("falling") || animator.GetBool("jumping")) == true && footCollider.IsTouchingLayers(wall)){rigidBody.velocity = new Vector2(0f, rigidBody.velocity.y);}
}

5.代码总和

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerController : MonoBehaviour
{private Animator animator;//玩家的动画private Rigidbody2D rigidBody;//玩家的刚体public Collider2D footCollider;//脚的碰撞体public LayerMask ground;//地面public LayerMask wall;//墙壁public float speed;//移动速度public float jumpForce;//跳跃力度 public Boolean onFloor;void Start(){rigidBody = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();onFloor = false;}void FixedUpdate(){Move();SwitchAnimation();HitWall();}void Move(){if (onFloor == true){if (Input.GetKey(KeyCode.A)){rigidBody.velocity = new Vector2(-speed * Time.deltaTime, rigidBody.velocity.y);transform.localScale = new Vector3(-1, 1, 1);animator.SetBool("running", true);}else if (Input.GetKey(KeyCode.D)){rigidBody.velocity = new Vector2(speed * Time.deltaTime, rigidBody.velocity.y);transform.localScale = new Vector3(1, 1, 1);animator.SetBool("running", true);}else{animator.SetBool("running", false);}}if (Input.GetKey(KeyCode.Space) && onFloor == true){rigidBody.velocity = new Vector2(rigidBody.velocity.x, jumpForce*Time.deltaTime);animator.SetBool("jumping", true);onFloor = false;footCollider.isTrigger = true;}}void SwitchAnimation(){if (rigidBody.velocity.y < 0 && !animator.GetBool("falling"))//当角色向下掉落时{animator.SetBool("jumping", false);animator.SetBool("falling",true);footCollider.isTrigger = true;}if (footCollider.IsTouchingLayers(ground) && animator.GetBool("falling"))//当向下掉落到地面上时{footCollider.isTrigger = false;animator.SetBool("falling", false);onFloor = true;rigidBody.velocity = new Vector2(rigidBody.velocity.x, 0f);}}void HitWall(){if((animator.GetBool("falling") || animator.GetBool("jumping")) && footCollider.IsTouchingLayers(wall)){rigidBody.velocity = new Vector2(0f, rigidBody.velocity.y);}}
}

6.运行结果

Unity2D 角色实现跳跃上地面的方法(类冒险岛的跳跃方式)相关推荐

  1. Unity2D游戏使游戏角色跳跃的脚本(包括长按跳跃加成)

    首先实现跳跃是在已经实现游戏角色左右移动的基础上 实现游戏角色移动的脚本 在脚本完成后需要将图层设置为Ground,使代码知道地面是哪一个图层. using System.Collections; u ...

  2. Unity2D角色跳跃

    Unity2D角色跳跃 文章目录 Unity2D角色跳跃 思路 事前准备 通过速度判断状态 通过位置判断状态 思路来自B站麦扣的第一期教程:https://www.bilibili.com/video ...

  3. VTK从分割好的体数据获取等值面的方法(MarchingCube)

    vtk里面从分割好的体数据获取等值面的方法基本上都是基于MarchingCube的方法,有很多相关函数,一般从标记图像中获取等值面的方法为vtkDiscreteMarchingCubes.图像经过等值 ...

  4. arcgis多面体要素转面_【干货】ArcGIS 9.3线转面的方法

    原标题:[干货]ArcGIS 9.3线转面的方法 ArcGIS作为GIS软件中的常用软件,其功能是非常强大的,但是如果作为一个初学者,其部分常用的重要功能不容易掌握,今天就讲一讲在矢量化时非常重要的功 ...

  5. ArcGIS线转面的方法-收藏(转)

    ArcGIS 9.3线转面的方法 ArcGIS作为GIS软件中的龙头老大,其功能是非常强大的,但是如果作为一个初学者,其部分常用的重要功能不容易掌握,今天就讲一讲在矢量化时非常重要的功能:线转面. A ...

  6. unity2d角色防止二段跳解决方案

    unity2d角色防止二段跳解决方案 问题 在制作游戏过程中,对于2d人物角色的二段跳困惑了一段时间,二段跳的关键在于判断人物是否离开地面的条件. 解决方案 通过查找资料终于解决了该问题,主要的解决思 ...

  7. iOS方法类:CGAffineTransform

    iOS方法类:CGAffineTransform的使用大概 CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平 ...

  8. 魔术方法 类 序列化_Java序列化魔术方法及其示例使用

    魔术方法 类 序列化 在上一篇文章中, 您需要了解有关Java序列化的所有知识 ,我们讨论了如何通过实现Java序列化来启用类的可序列化性. Serializable接口. 如果我们的类未实现Seri ...

  9. 深入好文:数字经济技能:基于角色的数字技能培养方法、行业趋势、未来及未来的关键角色、这些角色的学习路径

    我们正处于新的工业革命之中,蒸汽推动了第一次工业革命,电力推动了第二次工业革命,数字计算推动了第三次工业革命.根据世界经济论坛的说法,"定义第四次工业革命 (Fourth Industria ...

最新文章

  1. 第十五课.马尔科夫链蒙特卡洛方法
  2. FastDFS工具类的使用
  3. idea 编译显示source1.3不支持泛型(请使用source5或更高版本)
  4. UEFI+GPT与BIOS+MBR各自有什么优缺点?
  5. 连连看外挂消去算法分析
  6. jQuery、Ajax,DataTable数据如何转换成Json格式
  7. python如何高效办公_用 Python 高效办公|一次写好100个word通知,还有谁?
  8. 中国生物医药产业集群产业战略布局及运营管理模式分析报告2021-2027年
  9. ObjectARX_AutoCAD创建矩形功能实现
  10. python如何退出while循环_python如何跳出while循环
  11. 365抽奖软件 v6.1.7
  12. 电脑W ndoWs未能启动怎么办,Win7系统电脑开机显示“Windows未能启动”的解决方法...
  13. C的编译链接及Makefile学习
  14. 第7章第22节:双图排版:两张图片并列靠边对齐 [PowerPoint精美幻灯片实战教程]
  15. Nginx 基本理论和安装
  16. 树莓派3B+实现TM1637驱动数码管
  17. 支付宝iOS版9.2上架:适配iPhone 6s、生活圈、阅后即焚
  18. 【C++复习总结回顾】—— 【五】数组与指针
  19. python将一组数zscore归一化
  20. 原神 android 手柄,如何在手机上流畅体验《原神》,推荐机型和手柄缺一不可

热门文章

  1. WinRAR智能备份
  2. 编写ruby脚本批量下载《老友记》全集(mp3文件)
  3. 照片墙背景html图片,创意照片墙背景 给你一个不一样的家
  4. 18 非理性:如何管住你的“动物精神”
  5. Linux命令——history及其优化
  6. RepositoryService
  7. 物联网网关常见问题解答(一)
  8. 前以色列国防军安全技术成员教你做好 Serverless 追踪
  9. Steinberg Cubase Elements 10.5 Mac(音频处理软件)
  10. 系统架构敏感点,权衡点