【unity】用代码实现“碰到障碍后 运动对象的运动方向如何改变(反弹/滑行)”

想要实现的效果:

例1:飞出的弹丸,碰到墙壁后,反弹。【↘️| 】——>【↙️| 】

例2:向右下方【↘️】移动的对象,碰到右侧的墙壁 【↘️| 】 后,继续沿着着墙壁向下方移动【↓ | 】

 

为什么要用代码实现?

确实,一般来说使用刚体和碰撞器(Dynamic模式)的话Unity会负责物理碰撞的部分。 

但我的实现是用Kinematic X Static。敌人使用Kinematic 是因为需要控制他们各自不同的运动方式,所以碰到障碍物要绕行/滑行/反弹的话需要自己手动实现。

一、计算反射向量

无论要实现哪个效果都需要一个很重要的函数:根据入射向量,计算反射向量。(见下图)

原本的运动方向是inDirection,再提供一个碰撞法线inNormal,就可以得到反射向量啦。

 

用法很简单:

Vector3 reflectDir = Vector3.Reflect(OrgDir, normal);//OrgDir是原本的运动方向向量,normal是碰撞表面的法线

那么,碰撞表面的法线inNormal要怎样得到?

我只记录我有在使用的两种方式,应该可以满足大部分需求。

1.有发生实际碰撞:

在脚本中使用碰撞检测,可以得到碰撞点信息:

protected ContactPoint2D contactPoint;//用这个变量保存碰撞点信息protected void OnCollisionEnter2D(Collision2D collision)
{contactPoint = collision.GetContact(0); //这个函数用来获取发生碰撞的点。因为它可能会是一个点的集合,我只需要一个就可以了,所以取第一个。
}

contackPoint.normal 就是法线。

reflectDir = Vector2.Reflect(orgDir, contactPoint.normal);

 2.未发生实际碰撞

有一些情况需要在发生实际碰撞之前,先去检测会不会发生碰撞(未雨绸缪)。

比如对象看到运动方向前面有障碍物,它会提前绕行,而不是撞到以后再改变运动方向。

这种情况可以使用Cast函数,unity提供了多种Cast函数。比如:

  • Collider2D.Cast (将碰撞体形状投射到从该碰撞体位置开始的场景中,忽略该碰撞体本身)
  • Rigidbody2D.Cast (附加到 Rigidbody2D 的所有 Collider2D 形状都将投射到场景中 - 忽略附加到同一个 Rigidbody2D 的碰撞体。)
  • Physics2D.RaycastAll (射线投射)

关于射线的更多内容可以参考这个⬇️,不再这篇多做赘述。【Unity2D】射线·碰撞投射·方法总结_unity raycasthit2d-CSDN博客文章浏览阅读4.8k次,点赞6次,收藏24次。射线:Physics2D.Raycast( )必须参数:起点、方向可选参数:距离、Z轴深度、过滤条件(检测哪些层、是否检测触发碰撞器等)out 参数:RaycastHit2D[ ] (存放碰撞返回的结果)返回值:int (表示碰撞结果的个数)/ RaycastHit2D(射线碰撞的结果)备注:如果射线从碰撞体内部发出,可以使用collider2d.Raycast( )方法手册链接:Physics2D-Raycast - Unity 脚本 API与碰撞体相关的射线/投射:._unity raycasthit2dhttps://blog.csdn.net/yjy99yjy999/article/details/124551072?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171535726816800213068639%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171535726816800213068639&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-124551072-null-null.nonecase&utm_term=cast&spm=1018.2226.3001.4450这里我使用了 Rigidbody2D.Cast 函数。

    //用一个数组保存投射的结果,这里我设定数组长度为10个    RaycastHit2D[] hits = new RaycastHit2D[10];//检测对象运动方向上有没有障碍物,检测距离为dist,n表示检测到的碰撞数量//contactFilter_obstacle 是提前设定好的过滤条件,如何设置要根据需求而定public bool HasObstacle(Vector2 orgDir, float dist){int n = m_rigidbody.Cast(orgDir, contactFilter_obstacle, hits, dist);return n != 0;}

Cast函数将碰撞结果保存在 hits 数组中,hits[0].normal 就是我们需要的法线。

二、对象碰撞后的运动方向

有了反射向量就很简单了。

要实现例1反弹效果的话,直接使用反射向量即可。

要实现例2贴墙继续走的话,用 OrgDir + ReflectDir 即可。注意实现时,要保持同之前运动相同的速度,就需要一些细节了,比如这样:

//入射与反射向量相加后,把向量归一化。再乘以原本要移动的距离。避免对象的运动速度骤减或突然翻倍
return (orgDir + reflectDir).normalized * moveLength;

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

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

相关文章

贪心算法----最大数

今日题目:leetcode179------点击跳转题目 分析: 要把这些数组组成最大的数,首先我们把数字转化为字符串,根据自定义的排序规则把这些字符串字数排列,再用一个字符串接受这些字符串数字拼接成最大的字符串数字 排序规则…

02c++模板部分讲解

1理解函数模板 #include<iostream> using namespace std;//函数模板 template<typename T> //定义一个模板参数列表 //模板类型参数 typename/class bool compare(T a, T b) {cout << "template compare: " << endl;return a > b; }temp…

Git详解之五:分布式Git

为了便于项目中的所有开发者分享代码&#xff0c;我们准备好了一台服务器存放远程 Git 仓库。经过前面几章的学习&#xff0c;我们已经学会了一些基本的本地工作流程中所需用到的命令。接下来&#xff0c;我们要学习下如何利用 Git 来组织和完成分布式工作流程。 特别是&#…

代码随想录算法训练营第36期DAY24

DAY24 235二叉搜索树的最近公共祖先 迭代法&#xff1a; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solutio…

大势所趋!企业网站HTTPS升级全面普及化

JoySSL官网 注册码230918 HTTPS加密协议的应用无疑是维护网络信息安全的重要一环。随着技术的不断进步与用户隐私意识的增强&#xff0c;HTTPS加密已不再仅仅是大型企业的专属&#xff0c;而是逐渐成为所有企业网站的标准配置&#xff0c;其普及化趋势显而易见&#xff0c;堪称…

Kivy UI界面

一、版本介绍 Ubuntu&#xff1a;18.04.6 LTS Conda&#xff1a;4.5.12 Python&#xff1a;3.6.15 Kivy&#xff1a;2.0.0 二、安装Kivy # 更新系统包列表 sudo apt-get update# 安装Kivy的依赖项 sudo apt-get install -y python-pip libsdl2-dev libsdl2-image-dev li…

数据结构之链表篇

今天我们讲我们数据结构的另一个重要的线性结-----链表&#xff0c; 什么是链表 链表是一种在 物理存储上不连续&#xff0c;但是在逻辑结构上通过指针链接下一个节点的形成一个连续的结构。 他和我们的火车相似&#xff0c;我们的元素是可以类比成车厢&#xff0c;需要将⽕…

ubuntu22.04服务器docker-compose方式部署ldap服务

一&#xff1a;系统版本 二&#xff1a;部署环境 节点名称 IP 部署组件及版本 配置文件路径 机器CPU 机器内存 机器存储 Ldap 10.10.10.111 self-service-password:latest phpldapadmin:latest openldap:latest openldap:/data/openldap/config phpldapadmin&#x…

回炉重造java----双列集合(HashMap,TreeMap)

体系结构 ①基本操作: ②遍历方式: 第一种: 键找值&#xff0c;通过map.keySet()获取Map的键集合&#xff0c;通过键去匹配Map中的值 Set<String> strings map.keySet();for (String string : strings) {System.out.println(map.get(string));} 第二种: 键值对&…

【多模态】30、GPT4V_OCR | GPT4V 在 OCR 数据集上效果测评

文章目录 一、背景二、测评2.1 场景文本识别2.2 首先文本识别2.3 手写数学公式识别2.4 图表结构识别&#xff08;不考虑单元格中的文本内容&#xff09;2.5 从内容丰富的文档中抽取信息 三、讨论 论文&#xff1a;EXPLORING OCR CAPABILITIES OF GPT-4V(ISION) : A QUANTITATIV…

Android动态布局framelayout

功能说明 最近碰到一个需求&#xff0c;要求在网页端拖控件&#xff0c;动态配置app控件的模块&#xff0c;大小和位置&#xff0c;显示不同的功能&#xff0c;然后在app大屏展示。 技术难点&#xff1a; 1.动态控件位置和大小难调&#xff0c;会出现布局混乱&#xff0c;位置错…

2024-05-10 C语言使用开源的JPEG解码库libjpeg 读取JPEG文件并将其解码为RGB24格式的数据

一、可以使用开源的JPEG解码库&#xff0c;例如libjpeg库&#xff0c;来读取JPEG文件并将其解码为RGB24格式的数据。 二、在ubuntu上面进行测试。 2.1安装了libjpeg-dev包 sudo apt-get install libjpeg-dev 2.2 测试c源码 #include <stdio.h> #include <stdlib.h&…

虚拟化技术 分离虚拟机数据流量与ESXi的流量管理

一、实验内容 为ESXi主机添加网卡通过vClient查看已添加的网卡信息为ESXi添加网络&#xff0c;创建标准交换机修改网络配置&#xff0c;实现虚拟机数据流量与ESXi的管理流量分离 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建…

Java入门基础学习笔记15——强制类型转换

大范围类型的变量是否可以赋值给小范围类型的变量呢&#xff1f; IDEA直接报错。直接报错&#xff0c;是提醒你有问题。但是我非常进行类型转换。 非要强行赋值呢&#xff1f; 强制类型转换&#xff0c;强行将类型范围大的变量&#xff0c;数据赋值给类型范围小的变量。 数据…

实用的Chrome命令 帮你打开Chrome浏览器的隐藏功能

前言 Chrome作为主力浏览器&#xff0c;支持相当丰富的第三方扩展&#xff0c;其实浏览器本身也内置了大量实用的命令。许多实用的功能并没有直接显示在Chrome的菜单上。在这篇文章中&#xff0c;我们将介绍几个实用的chrome:// commands。 通过下面整理的 Chrome 命令&#x…

霍金《时间简史 A Brief History of Time》书后索引(A--D)

图源&#xff1a;Wikipedia INDEX A Abacus Absolute position Absolute time Absolute zero Acceleration Age of the universe Air resistance Albrecht, Andreas Alpha Centauri Alpher, Ralph Anthropic principle Antigravity Antiparticles Aristotle Arrows of time …

权限束缚术--权限提升你需要知道这些

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要对渗透测试中权限提升的一些基础知识进行整理 并不包含权限提升的具体操作 适合要入门权限提升的朋友 提权的重要性 我们在渗透网站时&#xff0c;我们往往会拿到一些权限&#xff0c;但是我们的权限有…

全栈开发之路——前端篇(9)插槽、常用api和全局api

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

【Java代码审计】代码审计的方法及常用工具

【Java代码审计】代码审计的方法及常用工具 代码审计的常用思路代码审计辅助工具代码编辑器测试工具反编译工具Java 代码静态扫描工具 代码审计的常用思路 1、接口排查&#xff08;“正向追踪”&#xff09;&#xff1a;先找出从外部接口接收的参数&#xff0c;并跟踪其传递过…

鸿蒙OpenHarmony开发板解析:【系统能力配置规则】

如何按需配置部件的系统能力 SysCap&#xff08;SystemCapability&#xff0c;系统能力&#xff09;是部件向开发者提供的接口的集合。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 部件配置系统…