Unity2D - 碰撞检测及边界检测

news2024/11/14 11:35:11

1. 地面检测

1.1 地面检测的逻辑及代码

一般情况下,对于手人物进行事件处理或动作处理时,我们需要判定人物是否在地面上,这个时候最好的方式是设定地面碰撞器,只有角色在地面时才可以进行跳跃; 我们可以想象物体的重心向地面延伸一条射线,射线到里面的距离就是地面监测的距离,如果物体离地面的距离长于射线距离,则判定为不在地面,为了方便编写相应程序,我们将射线可视化出来。

private float groundCheckDistance;
   
private void OnDrawGizmos()
   {
       //程序编写中可视化
       Gizmos.DrawLine(transform.position, new Vector3(transform.position.x,transform.position.y - groundCheckDistance));
       //可以理解为根据提供的两个点,连成一条直线
   }

可视化射线后我们了解物体中心点与地面之间的判定距离。

[SerialField] private LayerMask WhatisGround;
private bool isGrounded;

void Update()
{
    isGrounded = Physics2D.Raycast(transform.position,Vector2.down,groundCheckDistance,WhatisGround);
}

上述代码显示我们如何判定人物与地面间的距离,isGrounded是一个布尔类型的参数,调用Physics2D中的Raycast方法,可以理解为射线检测方法。输入有四个参数,目标位置,检测方向,检测距离,以及检测图层。

图层是我们需要手动拖拽赋给WhatisGround。

Raycast方法最后返回布尔类型参数判定物体是否与地面接触。

1.2 自定义化检测

在实际过程中,我们需要用到不同位置的物体中心点,特别是拥有一个父类之后,子类需要继承到父类的碰撞器。如果能自定义化碰撞器中心点将会大大提高创作效率。

[SerializeField] private Transform groundCheck; // 定义一个位置组件
 

之后的碰撞器以位置组件为基准衡量与地面是否接触,于是我们将之前的碰撞器代码修改为:

    private void OnDrawGizmos()
    {
        //程序编写中可视化
        Gizmos.DrawLine(groundCheck.position, new Vector3(groundCheck.position.x,groundCheck.position.y - groundCheckDistance));
        //可以理解为根据提供的两个点,连成一条直线
    }
}

void Update()
{
    isGrounded = Physics2D.Raycast(groundCheck.position,Vector2.down,groundCheckDistance,WhatisGround);
}

最后在父类对象中创建子类对象,父类对象中的groundCheck用来接收这个子类对象。

2. 障碍物碰撞检测

障碍物检测的实现逻辑与地面检测实现逻辑一样,将内部的参数修改即可。

[SerializeField] private Transform WallCheck;
[SerializeField] private float WallCheckDistance;
private bool isWall;
       
isWall = Physics2D.Raycast(WallCheck.position, Vector2.right * FacingDir, WallCheckDistance, WhatisGround);

Gizmos.DrawLine(WallCheck.position, new Vector3(WallCheck.position.x + WallCheckDistance * FacingDir, WallCheck.position.y ));

3. 玩家碰撞检测

根据上述的过程,对于物体间碰撞已经大差不大了。

在这里我想延伸一种其他物体针对于玩家的碰撞,在之后的创作中将会更加的方便灵活。

判断参数设定为RaycastHit2D类型。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    [SerializeField] private float playerCheckDistance;
    [SerializeField] private LayerMask whatIsPlayer;
    private RaycastHit2D isPlayerDetected;
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        isPlayerDetected = Physics2D.Raycast(transform.position, Vector2.right,playerCheckDistance,whatIsPlayer);
        if (isPlayerDetected)
        {
            Debug.Log("I have detected the Player!!!");
        }
    }
}

将玩家设置的图层设置为player,将whatIsPlayer设置为player图层即可。

本质就是图层的检验。 

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

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

相关文章

Java的gui开发-Swing如何一键打包exe、dmg等

java的gui开发其实很方便,性能也不错,知名的idea开发工具也是java-swing开发,只是用的人少,看了我的例子3分钟就能学会,分分钟写桌面端,下面教你如何一键打包windows端exe Java-Swing-Template java的gui开…

解决SD卡被写保护问题

存储卡在使用过程中,有时会遇到写保护问题,导致无法写入或删除数据。这可能会对用户的正常使用造成困扰。MK米客方德将为您介绍几种常见的解决方法,帮助用户解除存储卡的写保护。 一、检查物理写保护开关 许多存储卡,如SD卡&…

深入剖析Tomcat(十二) 详解StandardContext

StandardContext是Context容器的一个标准实现,一般情况下,Tomcat都是使用StandardContext类来创建Context容器。前面讲过,Context容器代表了一个Web应用,Tomcat本身支持部署多个应用,相应的每个应用都会有一个Standard…

解锁小红书新玩法:中小企业出海营销的集成策略

随着全球数字化浪潮的推进,小红书作为生活方式分享平台的崛起,为中小企业提供了一个全新的营销舞台。NetFarmer,作为专注于企业数字化出海的服务商,深谙小红书的营销策略,并致力于通过HubSpot产品销售与实施&#xff0…

spring boot jar 启动报错 Zip64 archives are not supported

spring boot jar 启动报错 Zip64 archives are not supported 原因、解决方案问题为什么 spring boot 不支持 zip64zip、zip64 功能上的区别zip 的文件格式spring-boot-loader 是如何判断是否是 zip64 的? 参考 spring boot 版本是 2.1.8.RELEASE,引入以…

Chrome开发者工具学习

打开开发者工具: 可以通过在网页上点击右键并选择“检查”来打开。 或者使用快捷键Ctrl Shift I(在Windows/Linux上)或Command Option I(在Mac上)。 界面概览: 熟悉DevTools的基本面板,如“…

Mongo Express 未授权访问漏洞

【产品&&漏洞简述】 Mongo Express 是一个基于 Node.js 和 express 的开源的 MongoDB Web管理界面。Mongo Express存在未授权访问漏洞,攻击者可通过该漏洞获取用户信息或修改系统数据。 【资产测绘Query】 title"Home - Mongo Express" 【产品界…

期货交易中的几种常见心态管理

期货交易通常涉及到风险和收益的权衡,因此参与者的心态可以显著影响他们的决策和最终结果。以下是一些炒期货的常见心态: 1. 利润最大化心态:持有这种心态的投资者不关心风险,只考虑高利润。他们可能会盲目追求高回报&#xff0…

【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理

译者注 上一节我们探讨了 D3.js 的适用场景——需要高度定制化、可以尽情释放想象力的复杂图表。这一节我们再跟随作者的视角,看看 D3.js 的工作原理究竟是怎样的。 1.1.3 D3.js 的工作原理 您可能已经体验过 D3 并且发现它不太容易上手。这也许是因为您把它当成了…

【Linux】使用信号进行进程间通信

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ ​ 实现原理&a…

互联网直播/点播技术与平台创新应用:视频推拉流EasyDSS案例分析

随着互联网技术的快速发展,直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域,互联网直播/点播平台与技术的应用,不仅为用户带来了全新的购物体验,也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

QT学习积累——在C++中,for循环中使用``与不使用``的区别和联系

目录 引出使用&与不使用&除法的一个坑 总结自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式返回值mutable修饰案例 引出 QT学习积累——在C中,for循环中使用&与不使用&的…

MATLAB算法实战应用案例精讲-【数模应用】线性判别分析(附MATLAB、python和R语言代码实现)

目录 前言 算法原理 什么是判别分析 线性判别分析(LDA) 数学模型 二分类 多分类LDA ​编辑 算法思想: 费歇(FISHER)判别思想 贝叶斯(BAYES)判别思想 LDA算法流程 LDA与PCA对比 SPSSPRO 1、作用 2、输入输出描述 3、案例示例 4、案例数据 5、案例操作 …

新手教学系列——“笑看”单元测试(pytest)

探索单元测试的必要性 你是否曾经思考过,当前的业务场景是否真的需要单元测试?我们每个人负责的模块是否也需要单元测试?什么阻碍了我们进行单元测试呢?时间紧,任务重,还要写测试?这些都是我们在开发过程中常见的问题。假设我们有一个计划开发一周的项目,让我们看看有…

rapidocr-onnxruntime库及在open-webui上传PDF 图像处理 (使用 OCR)应用

背景 rapidocr-onnxruntime是一个跨平台的OCR库,基于ONNXRuntime推理框架。 目前已知运行速度最快、支持最广,完全开源免费并支持离线快速部署的多平台多语言OCR。 缘起:百度paddle工程化不是太好,为了方便大家在各种端上进行oc…

计算机网络课程实训:局域网方案设计与实现(基于ensp)

文章目录 前言基本要求操作分公司1分公司2总部核心交换机配置实现内部服务器的搭建acl_deny部分用户与服务器出口出口防火墙配置 前言 本篇文章是小编实训部分内容,内容可能会有错误,另外ensp对电脑兼容性及其挑剔,在使用之前一定要安装好。…

第100+13步 ChatGPT学习:R实现决策树分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。 答曰:可!用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了,就帮各位搬运一下吧。 二、R代码实现决策树分类 (…

极客之夜 | XCTF国际网络攻防联赛十周年庆典圆满落幕

在数字化浪潮的推动下,网络安全已成为全球关注的焦点。十年磨一剑,XCTF国际网络攻防联赛以其卓越的赛事品质和深远的影响力,成为网络安全领域的一面旗帜。极客之夜,我们齐聚一堂,共同庆祝XCTF的十年辉煌,展…

andon系统及时通知对应处理人员,助力产线快速处理异常

在当今快节奏、高效率的制造业环境中,生产线的稳定运行和快速响应异常情况的能力对于企业的成功至关重要。Andon 系统作为一种先进的生产管理工具,凭借其及时通知对应处理人员的功能,为产线快速处理异常提供了强大的助力。 一、Andon系统组成…

基于springboot+Vue高校宿舍管理系统的设计与实现【附源码】

本科毕业设计(论文) 基于springbootVue高校宿舍管理系统的设计与实现 目录 摘要 2 第一章 绪论 2 1.1 开发背景 2 1.2 开发意义 2 第二章 系统分析 3 2.1 系统的需求分析 3 2.2 系统开发设计思想 3 2.3系统开发步骤 3 2.4 系统的主要技术 4 2.4.1 B/S系…