【Unity】Unity中获得碰撞体碰撞的位置

2023-11-09

有时间的直接看sprite slicer这个插件的代码,原理也是发射线检测,代码逻辑什么的比下面的文章来的好的多,如果有空我也可以整理一下。

在纯物理环境中,为了获得碰撞体碰撞的位置,我们可以使用Collider2D.OnCollisionEnter2D(Collision2D)来接受碰撞,Collision2D中存有碰撞信息Collision2D.contacts(The specific points of contact with the incoming Collider2D), contacts的类型是ContactPoint2D[],Contacts2D有如下属性,通过ContactPoint2D,我们可以获得世界坐标系中两个碰撞体碰撞的位置。

当然,出发Collider2D.OnCollisionEnter2D(Collision2D)是有条件的,且较触发器更为苛刻,官网文档给出的条件(Unity ManualPhysicsPhysics OverviewColliders)如下:
这里写图片描述

我现在有特殊的需求,一个静态碰撞体和一个鼠标拖动的超小碰撞体(近似认为是一个点),要求他们碰撞的位置。当然,我设置碰撞体为IsKinematic的时候,OnCollisionEnter2D就会失效,所以无法用上面的方法获得碰撞点,那么来思考一下使用OnTriggerEnter2D是否好使?查看文档可以知道,OnTriggerEnter触发的时候,并不会记录点信息,故我们需要自己思考如何获得碰撞点。为了使用触发器来获得碰撞点,我也试了很多方法,试过将刚体的Collision Detection置为Continuous,试过修改差值方式等,均不好使。。。每次OnTriggerEnter2D触发的时候,一个触发器已经嵌入到另一个触发器之中,ORZ, 所以能得到的信息就是在触发的这一帧的位置。不过上一帧的位置我们也能得到,自己测试了一下,想在LateUpdate中记录上一帧的位置,不过这个位置也就是触发时候的位置,所以还需要一个变量记录真正的上一帧的位置。现在得到了两个有用的变量:触发器触发时候的位置 currentPos以及上移帧的位置 lastPos,静态碰撞体的边缘就在这两个位置之间,我从lastPos像currentPos发射一条射线:

        Vector3 origin = m_LastLastPos;//上一帧的位置
        Vector3 end = GameContext.MouseFollowPosition;//触发时的位置
        Vector3 direction = end - origin;//射线方向
        float distance = Vector3.Distance(origin, end);//射线检测距离
        RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, 1 << LayerMask.NameToLayer("Target"));//发射射线,只检测与"Target"层的碰撞
        Debug.DrawRay(origin, direction, Color.red, 2);//绘制射线
        Debug.Assert(hit.collider != null, "未检测到起点");
        if (hit.collider != null)
        {
            m_StartPoint = hit.point;//获得该碰撞点
        }

这就得到了我所需要的碰撞点,就是这样,Oh la la!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity】Unity中获得碰撞体碰撞的位置 的相关文章

  • halfShader 模型切割

    Shader Unlit halfShader Properties Diffuse Diffuse Color 1 1 1 1 MainTex Texture 2D white StartCutoff StartCutoff Range
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • Unity 安卓打包

    Unity打包的方式有很多种 自动打包和手动打包 今天小弟就鼓捣鼓捣unity手动打包 如果想动态打包的话 可以去看其他大佬的帖帖哈 unity打包先配置环境 下载unity的时候可以顺道把unity的安卓包下载下来 如果忘了也没事 可以从
  • c#获取cpu序列号

  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • 力扣第45天----第392题、第115题

    力扣第45天 第392题 第115题 文章目录 一 第392题 判断子序列 二 第115题 不同的子序列 一 第392题 判断子序列 挺简单的 思路跟以前的都差不多 class Solution public bool isSubseque
  • Go解析yaml和yml文件

    Go解析yaml和yml文件 文章目录 Go解析yaml和yml文件 1 yaml概述 2 功能 3 示例 4 语言的构成元素 1 清单 数组 2 关系数组 3 区块的字符 4 保留换行 Newlines preserved 5 折叠换行
  • 英文期刊催稿信模板_SCI投稿委婉催稿信模板

    SCI投稿委婉催稿信模板1 Dear editor I m not sure if it is the right time to contact you to inquire about the status of my submitte
  • 34种ArcGIS常用操作技巧大汇总

    概述 ArcGIS产品线为用户提供一个可伸缩的 全面的GIS平台 ArcObjects包含了许多的可编程组件 从细粒度的对象 例如单个的几何对象 到粗粒度的对象 例如与现有ArcMap文档交互的地图对象 涉及面极广 这些对象为开发者集成了全
  • Burpsuite2022.1详细安装步骤包含证书安装

    burpsuite安装 burpsuite2022 1 https pan baidu com s 1k46tVXOKfdSwxOha UNeyQ 提取码 6954 将 burp suite 压缩包解压到英文目录下 这里我解压到了 E Bu
  • matlab图像滤波

    转自 http hi baidu com wang 5Fpw blog item 36354a637ac87b48eaf8f879 html clc clear all I imread eight tif 用中值滤波 多维滤波 使用中心为
  • zipkin学习--01--理论

    一 介绍 是分布式跟踪系统 Distributed Tracking System 监控微服务各个服务的调用情况 举例 一个请求A 需要先后调用f1 f2 f3等微服务单元的接口 我们可以通过链路追踪查看f1 f2 f3对应接口的耗时 主要
  • CLIP:Contrastive Language-Image Pre-Training

    参考博客 CLIP论文阅读 Learning Transferable Visual Models From Natural Language Supervision CLIP Connecting Text and Images 引言 在
  • Imageview 图片的自动适配 Togglebutton 点击事件

    Imageview 图片控件 主要属性src background 图片的自动适配 Android开发图片https www easyicon net iconsearch android 素材网址 Togglebutton 开合关的两种状
  • STL-常用算法(一.遍历 查找 排序)

    目录 常用遍历算法 for each和transform函数示例 常用查找算法 find函数示例 find if函数示例 adjacent find示例 binary search函数示例 count函数示例 count if函数示例 常用
  • DataGuard(一主一备一级联之failover)

    fail over 1 failover介绍 failover转换 主要考虑的是如何减少数据量的丢失 如果可以允许数据丢失 可以直接切换备库为主库 不必在进行下面的讨论 减少数据的丢失 实际就是弥补日志数据没有传递的问题 在11g中 推出了
  • vite.config.js 配置全局src别名“@“

    编辑vite config js文件 import defineConfig from vite import vue from vitejs plugin vue import path from path 关键代码 https vite
  • ChatGPT助力代码编辑

    如今 在软件开发领域 人工智能和机器学习的运用已越来越普遍 于是 开发者转向利用类似OpenAI的ChatGPT之类的工具 以使工作更简便 效率更高 ChatGPT是OpenAI培训的一款庞大语言模型 本文将向您演示如何借助ChatGPT协
  • 小米miui adb删除自带软件

    小米miui adb删除自带软件 1 下载安装ADB软件驱动 2 配置环境变量 3 连接手机 4 使用ADB命令删除系统应用 1 下载安装ADB软件驱动 2 配置环境变量 打开 我的电脑一属性一系统高级设置 环境变量 编辑Path变量 将a
  • 盛大云业务重点转向自服务

    原文地址 http www csdn net article 2013 04 01 2814731 Grandcloud focus self services CSDN报道 今天上午 盛大旗下视频网站酷6网宣布 任命盛大云计算CEO刘文博
  • CP2102修改设备serial、PID、VID的值

    在实际的应用场景中我们总希望串口设备的serial PID和VID值是唯一的这样才会方便设置设备别名 下面就介绍一下怎么修改设备的serial和PID VID还有驱动的方法 推荐使用修改设备serial的方式 修改PID VID有一定的风险
  • 一篇文章带你搞定Spring的面试题

    目录 一 SpringAOC 二 SpringIOC篇 三 SpringMVC 四 Spring和SpringMVC的常用注解 一 SpringAOP 1 什么是AOPAOP Aspect Oriented Programming 是一种面
  • ssh怎么修改了文件然后保存起来呢?

    用vi ssh之后命令流程如下 之中代表你要输入的命令 cd 你要修改的文件所在目录 比如 cd usr local etc trafficserver vi 你需要修改的文件名 这之后你就会进入vi编辑界面 vi records conf
  • 使用CocoaPod导入Swift第三方库报错

    在使用cocoapod导入swift第三方时出现这样的错误 Pods written in Swift can only be integrated as frameworks add use frameworks to your Podf
  • 【Unity】Unity中获得碰撞体碰撞的位置

    有时间的直接看sprite slicer这个插件的代码 原理也是发射线检测 代码逻辑什么的比下面的文章来的好的多 如果有空我也可以整理一下 在纯物理环境中 为了获得碰撞体碰撞的位置 我们可以使用Collider2D OnCollisionE