iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用Unity怎么实现地面检测
  • 189
分享到

使用Unity怎么实现地面检测

2023-06-15 07:06:05 189人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关使用Unity怎么实现地面检测,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.普通射线在角色坐标(一般是脚底),发射一根向下的射线(长度约0.2)但是简单射线只

这篇文章将为大家详细讲解有关使用Unity怎么实现地面检测,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1.普通射线

在角色坐标(一般是脚底),发射一根向下的射线(长度约0.2)

但是简单射线只适用于简单地形,实际使用中常常遇到以下问题

用collider去碰撞地面,某些时候会有一定的穿插,于是角色的最低点就可能穿透地面,你发射射线的点可能就到了地面以下,射线一直检测不到真正的地面,于是角色就一直悬空

角色走斜坡时,角色中点可能会离开地面一小段距离,这一小段距离往往就足够让判断机制误以为角色已经离地,如果你增加射线的长度,那么一定程度上能缓解斜坡问题,但是会降低跳跃判断的精度,精度过低就有可能出现:角色跳起,会有那么一小段距离,其实已经离地了,但是仍然返回了isGround = true;

using System.Collections;using System.Collections.Generic;using UnityEngine; public class RaycastTest : MonoBehaviour {    private bool isGround = false;    private Rigidbody2D myRigidbody2D;    void Awake () {        myAnimator = GetComponent<Animator>();        myRigidbody2D = GetComponent<Rigidbody2D>();    }void FixedUpdate () {        Debug.DrawRay(transfORM.position, Vector2.down * 0.11f, Color.red);        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 0.15f, 1 << 8);        if (hit.collider != null)            isGround = true;        else            isGround = false;}

2.Unity官方的Character Controller

直接给角色加入Character Controller组件,在脚本中Get到Character Controller,调用.isGrounded即可,但是实际效果让人失望

因为.isGrounded是当角色移动的时候才会检测是否着地的,也就是说它只能在调用simplemove(和move等移动函数)时,判断isGrounded(是否着地)

这时播放一些动画会导致判断在true和false状态来回切换,并且Skinwidth也会导致这种问题,再加上一些角色控制器的限制,逻辑上不是那么自由,例如需要自己实现物理模拟,比如重力,个人觉得非常麻烦,不推荐

using System.Collections;using System.Collections.Generic;using UnityEngine;public class OnGroundSensor : MonoBehaviour{    public CapsuleCollider capcol;    public float offset = 0.1f;    private Vector3 point1;    private Vector3 point2;    private float radius;    void Awake()    {        radius = capcol.radius - 0.05f;    }    void FixedUpdate()    {        point1 = transform.position + transform.up * (radius - offset);        point2 = transform.position + transform.up * (capcol.height - offset) - transform.up * radius;        Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground"));        if (outputCols.Length != 0)        {            //foreach (var col in outputCols)            //    print("collision:" + col.name);            SendMessageUpwards("IsGround");        }        else            SendMessageUpwards("IsNotGround");    }}

3.三射线

这个方法是社团内的Aery同志传授的,他应用到了一个2d卷轴游戏上https://GitHub.com/KillerAery/DarkAdventrue

写法和简单射线没有什么不同,区别在于给角色加上三条射线:左脚,右脚,裆
三条射线有一条返回true则isGround为true

在我们的这个2d游戏上表现不错

我们看看他的代码

float dt = Time.deltaTime;//累计时间vida.chargeTimer += dt;vida.jumpTimer += dt;//TODO 待优化代码//是否到地面 用三个groundCheck来检测 //public Transform[] groundChecks = new Transform[3];for (int i = 0; i < 3; ++i){    checkResult = Physics2D.Linecast(transform.position,                     groundChecks[i].position,                     1 << LayerMask.NameToLayer("Ground"));    vida.grounded = checkResult;    if (vida.grounded) break;}if (vida.grounded){    //火箭蛋(硬件蛋特殊技能)    if (vida.playerType == Tags.YingjianDan)    {        vida.jumpable = 1;    }}//跳跃//按下K时if (Input.GeTKEyDown(KeyCode.K) && vida.jumpTimer >= 0.03f){    if (vida.grounded)    {        //允许跳跃        vida.jumpTimer = 0.0f;        vida.jump = true;    }    else if (vida.jumpable > 0)    {        vida.jumpable--;        //允许跳跃        vida.jumpTimer = 0.0f;        vida.jump = true;    }}

4.OverlapCapsule 投射胶囊碰撞体

这个方法是看傅老师的黑魂复刻系列视频学的

使用Unity怎么实现地面检测

使用Unity怎么实现地面检测

point0,point1,radius 分别为胶囊体起点球心,胶囊体终点球心,胶囊体半径

我们这里只要用到这一重载方法 Physics.OverlapCapsule(pointBottom, pointTop, radius, LayerMask)

private CapsuleCollider capsuleCollider;private Vector3 pointBottom, pointTop;private float radius; void Awake () {    capsuleCollider = GetComponent<CapsuleCollider>();    radius = capsuleCollider.radius;}

5.LayerMask设置方法

最后提下这个LayerMask

假设ground层为10,指定碰撞第10层Layer,写法为:Layermask mask=1<<10

但是,投射的胶囊体也会检测自己本身,如果你希望游戏中基本上任何能碰撞物体都能够用来站脚,那么应设置为:碰撞除了角色所在的Layer以外的所有层(假设Player层为8

写法为:~(1<<8)

bool OnGround() {        pointBottom = transform.position + transform.up * radius-transform.up*overLapCapsuleOffset;        pointTop = transform.position + transform.up * capsuleCollider.height - transform.up * radius;        LayerMask ignoreMask = ~(1 << 8);         colliders = Physics.OverlapCapsule(pointBottom, pointTop, radius, ignoreMask);        Debug.DrawLine(pointBottom, pointTop,Color.green);        if (colliders.Length!=0)        {            isOnGround = true;            return true;        }        else        {             isOnGround = false;            return false;        }}

关于使用Unity怎么实现地面检测就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 使用Unity怎么实现地面检测

本文链接: https://www.lsjlt.com/news/278660.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Unity怎么实现地面检测
    这篇文章将为大家详细讲解有关使用Unity怎么实现地面检测,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.普通射线在角色坐标(一般是脚底),发射一根向下的射线(长度约0.2)但是简单射线只...
    99+
    2023-06-15
  • 详解Unity地面检测方案
    目录1.普通射线2.Unity官方的Character Controller3.三射线4.OverlapCapsule 投射胶囊碰撞体5.LayerMask设置方法1.普通射线 在角...
    99+
    2024-04-02
  • 基于Unity怎么实现2D边缘检测
    今天小编给大家分享一下基于Unity怎么实现2D边缘检测的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、ShaderLab...
    99+
    2023-06-30
  • 基于Unity实现2D边缘检测
    目录一、ShaderLab1.Alpha值边缘检测2.卷积边缘检测二、ShaderGraph一、ShaderLab 1.Alpha值边缘检测 根据图片的Alpha值边缘判定,向内扩...
    99+
    2024-04-02
  • 怎么使用opencv实现车道线检测
    这篇“怎么使用opencv实现车道线检测”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用opencv实现车道线检测”文...
    99+
    2023-06-29
  • 使用OpenCV怎么实现Canny边缘检测
    今天就跟大家聊聊有关使用OpenCV怎么实现Canny边缘检测,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. Canny 边缘检测理论Canny 是一种常用的边缘检测算法. 其是...
    99+
    2023-06-20
  • Python+OpenCV实现表面缺陷检测
    对于现在很多工业检测,特别是对一些精密的器件进行筛选,往往都是像素级别的,十分的精确。 主要思想 将图像转化为二值图像在对图像进行腐蚀/膨胀处理在进行轮廓检测筛选目标大小符合的轮廓...
    99+
    2024-04-02
  • thinkphp登录检测怎么实现
    这篇文章主要介绍“thinkphp登录检测怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkphp登录检测怎么实现”文章能帮助大家解决问题。一:ThinkPHP登录检测是什么Think...
    99+
    2023-07-06
  • C#中怎么使用Unity实现IOC
    这篇文章主要介绍“C#中怎么使用Unity实现IOC”,在日常操作中,相信很多人在C#中怎么使用Unity实现IOC问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中怎么使用Unity实现IOC”的疑惑有所...
    99+
    2023-06-29
  • 怎么用Python+OpenCV实现猫脸检测
    这篇文章主要介绍了怎么用Python+OpenCV实现猫脸检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Python+OpenCV实现猫脸检测文章都会有所收获,下面我们一起来看看吧。开发工具Pytho...
    99+
    2023-06-27
  • Golang怎么使用http协议实现心跳检测程序
    本文小编为大家详细介绍“Golang怎么使用http协议实现心跳检测程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用http协议实现心跳检测程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-05
  • Python中怎么实现异常检测
    Python中怎么实现异常检测,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。公式和过程与我之前解释过的其他机器学习算法相比,这要简单得多。该算法将使用均值和方差来计算每个训...
    99+
    2023-06-16
  • Python中怎么实现人脸检测
    Python中怎么实现人脸检测,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先需要安装这些包,以Ubuntu为例:$ sudo apt-g...
    99+
    2023-06-17
  • 使用Canvas怎么实现文字碰撞检测并抽稀
    使用Canvas怎么实现文字碰撞检测并抽稀?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。计算文字在 canvas 中所占据的范围// 计算文字所需的宽度var&n...
    99+
    2023-06-09
  • 使用opencv怎么实现一个车道线检测功能
    这篇文章给大家介绍使用opencv怎么实现一个车道线检测功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。原理:算法基本思想说明:传统的车道线检测,多数是基于霍夫直线检测,其实这个里面有个很大的误区,霍夫直线拟合容易受...
    99+
    2023-06-06
  • python逻辑值检测怎么实现
    本篇内容介绍了“python逻辑值检测怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概念在python中,任何物体都可以检测逻辑值。...
    99+
    2023-06-30
  • 怎么使用mhdd检测硬盘
    本篇内容介绍了“怎么使用mhdd检测硬盘”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mhdd4.6使用方法图解:首先重启电脑,然后在开机的...
    99+
    2023-07-02
  • 怎么用Python+MediaPipe实现检测人脸功能
    这篇文章主要介绍“怎么用Python+MediaPipe实现检测人脸功能”,在日常操作中,相信很多人在怎么用Python+MediaPipe实现检测人脸功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用...
    99+
    2023-06-29
  • Python中怎么实现实时目标检测
    今天就跟大家聊聊有关Python中怎么实现实时目标检测,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 设置要求:TensorFlow版本在1.15.0或以上执行pip insta...
    99+
    2023-06-16
  • 微信域名检测该怎么实现
    这篇文章主要讲解了“微信域名检测该怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信域名检测该怎么实现”吧!什么是微信域名防封跳转系统啊?微信域名防封跳转系统是一个针对微信域名、微信...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作