• 大小: 0.71M
    文件类型: .pdf
    金币: 1
    下载: 0 次
    发布日期: 2021-03-27
  • 语言: 其他
  • 标签: 其他  

资源简介


Unity3d中的碰撞检测教程.最新最详细!!!!
其中绿色的中方体是 ,蓝色的是 ,黄灰色的是 至此,我们最初的测试场 景就搭建好了,下面,我们来编写脚本来验证我们的推断了。首先,我们验证一下碰撞检测。 代码如下: 将要碰撞到的 碰撞到的物体的名字是: 将 从 面板上拖拽到脚本中的选项中。 这段代码并不难理解,就是 一直向右移动时与 发生碰撞产生碰撞信息,打印碰 撞到的物体的名字 可现实总是那么的残酷,这个碰撞信息就一直没打印出来。哎,到底问题出在哪呢?这时 我们就需要完善的了解一下有关碰揎器方面的知识啊。我把我们还得了解的概念列举如下: 静态碰撞器 指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或很轻微的移动。这对 于环境模型十分好用,比如刚体和墙面碰撞时而不会移动 刚体碰撞器 指的是附加了刚体和碰撞器的游戏对象 运动学刚体碰撞器 在第点得基础上勾选了刚体组件中的 属性,如果要移动这类对象,就只能修改 它的 而不是用力。这类游戏对象还有许多其他的独特的使用情景。 这三种碰撞器如果勾选了 复选框,就变成了相应的触发器了。 这是我在文档上截下来的一个图,如果读者觉得英文看起来吃力的话,就可以到圣典上 去看翻译的文档。 Collision detection occurs and messages are sent upon collision Istatic Collide Rigidbody Colli derkinematic Static Rigidbody Rigidbody ColliderTrigger CollideTrigger Collide Static Collider Rigidbody Collider Kinematic Rigidbody Collider Y static T rigger collider Rigidbody Trigger Collider Kinematic Rigidbody Trigger Collider Trigger messages are sent upon collision Static ColliderRigidbody Colliderkinematic Static Rigidbod Rigidbody CollidefTrigger ColliderTrigger ColliderTri static Collider Rigidbody Collider Kinematic Rigidbody Collider Static Trigger collider Rigidbody Trigger Collider YYYYYY Kinematic Rigidbody Trigger Collide Y Y Y 这个表里面包含了检测到碰撞信息所必要的碰撞组合:从表中可以看出,两个碰撞器要想检测 到碰撞信息,至少有一个是 。这个就是我们刚才失败的关键。我们回到 编辑器中,验证一下我们的猜想。我们先给 添加刚体组件。没想到控制台打印了 如下语句: 目 Console Clear Collapse Clear on play Error pause Open Editor Lo g 碰撞到的物体的名字是:Pane Unity Engine, Debug: Log(object) ①到的物体的名宰是Cu曰 Ity Engi ogO 不过,这也是必须的,那么,我们将刚体组件附加在 而不是 上呢?我们发现, 控制台上没有打印任何语句,此时,我们可以得出如卜结论:两个物体发生碰撞,如果要检测 到碰撞信息,那么其中必有一个物体既带有碰撞器,又带有刚体,且检测碰撞信息的脚本必须 附着在带有刚体的碰撞器上。 到此我们就可以结束碰撞信息的检测了,剩下的个函数就由读者自行验证一下。下面我们来 验证触发信息检测。我们新建一个脚本,代码如下 碰撞到的物体的名字是 我们设置为刚体碰撞器注意,此时得将刚体组件中的 复选框的勾选去掉 然后勾选碰撞器组件中的 复选框。然后我们将此胭本拖拽到 上:面,然后将 从 面板上拖拽到脚本中的选项中。运行…下,果然有成功了: 目 Console Clear Collapse Clear on play Error pause 碰撞到的物体的名字是:cube2 Unity Engine Debug: Log(object) 此时,我们将脚木拖给 而不拖给 时,我们的结果和上次一样,没有检测到触发 信息。因此,我们可以得出这样一个结论:两个 发生碰撞,要想检测到触发信息 最少要有一个刚体碰撞器并且勾选了 复选框,另一个最少要有一个碰撞器组件,此 时检测碰撞的脚本必须附加在那个带有刚体的触发器上。 至此,触发信息的检测我们也实现了。剩下的两个函数留给读者自行验证。但是,由于两组函 数中的参数的类型不同,我们可以通过这些参数得到一些信息。比如 里面的 参数类型是: 根据这个参数,我们可以求得一些东西,比如接触点,具体可以看 文档关于 这一章,里面有一个变量 又比如 这个函数,参数类型为 我们可以取得这个对象的 这 个属性,也就是物理材质。 现在我们可以打开刚才那个官方的场景,可以在那些个刚体上绑定一个碰撞检测的脚本, 然后就可以用鼠标让它与其他物体进行碰撞,可以从控制台上打印碰撞到的物体的名字。好了 点了,困了,下一篇,我会介绍 方面的碰撞,这里面包含摄像头的碰撞检测, 并且会以这个官方的工程作为试验平台,敬请期待。 上一篇我们了解了 里面的碰撞检测的两种方式,都能够很好的解决特定情形下的相关问 题。这一话我紧接着介绍 (层蒙版)的应用,主要用在镜头穿墙上面。但是前提是 读者对里面的射线的应用有一个清楚的认识。 !射线,这并不是里面独有的工具,其应用非常之广,而且此工具及其易用。 利用它,你能极其快速的解决·些棘手的问题,比方说:鼠标点击屏幕,主角朝向鼠标点击的 世界方向运动。此时,如果不利用射线的话,实现方式不会简单,特别是主角的运动方向的确 定。好了,不费话了,看: 我来用我自己理解的方式翻译一下 个射线是无限长的。它靠个原点 类型和个方向 类型 决定。这是当然的,只需这两点,就能在一个三维空间确定一条射线。我们来看一下它的构造 方法 Ray. Ray static function Ray (origin: Vector, direction: Vector): Ray 官方给出的实例化一条射线的代码 using Unityengine: using System. Collections public class example i Mono Behaviour i public Ray ray new Ray(transform position transform forw ard) 看了这个之后,我们实例化一条射线就没问题了吧,注意:上面代码中的: 指的是该脚木绑定的 自身坐标系下的轴在世界坐标系下的单位方向向量。 我们来看一下它的两个变量 Variables orIgIn The origin point of the ray direction The direction of the ray 这两个东西我们从名字上面就能看出是什么,单词不认识的可以开有道。但是作为一个文化人 这种基本的单词应该记下来,我说的对吧! 好了,该看看函数了 RaySetPoint function Getpoint (distance float); vector Description Returns a point at distance units along the ray 这个函数的功能是取得该射线从原点到距离为 的个点的坐标。 Ray ToString function To string (: String function To string (format String): string Description Returns a nicely formatted string for this ray Ray Tostring function To String (: String fuNction ToString (format String]: string Description Returns a nicely formatted string for this ray 这个函数用的不多,功能比较简单:打印一条射线的基本信息,读者可以试着打印一下,就像 里面直接用 打印一个对象得出一个哈希码一样。 接下来我们该看看一个非常重要的类了 ,这个类里面的方法很多说实话,我只用过 个,求们重点看下面一个 Physics. Raycast 由于这个函数有好几个重载方法,我们今天仅介绍下面这个重载方法: static function Raycast (origin: Vector3, direction: Vector3, out hitlnfo RaycastHit, distance: float= Mathf Infinity, la Parameters ongin The starting point of the ray in world coordinates direction The direction of the ray. distance The length of the ray fitinto If true is returned hitinfo will contain more information about whe laver Mask A Layer mask that is used to selectively ignore colliders when ci 我们可以清楚地看出 这个方法里面的前两个和里的构造函数一模一样,这两者之间好像有着某种联系。这是必 然的,因为还有下面这个重载函数 static function Raycast (ray: Ray, distance: float= Mathf nfinity, layerMask: int=kDefaultRaycastLayers): boolean 看到没,很坑吧。不过,这也是的一个亮点,多样化。两个方法的底层实现是一样的 下面我来着重介绍这几个参数的意义 就不用介绍了吧,一个是原点,一个是方向。第三个从字面上理解是距离, 第四个是射线的碰撞信息类,里面包含很多我们可以得到的信息,第五个就是我们今天必须理 解的一个很实用的工具 层蒙版 这个函数的功能按我的理解是这样的:以点为原点, 为方向,在世界空间中发 射射线,如果在 距离内与其他在 层级之中的 发 生碰撞,那么此函数就返回,并且记录碰撞信息。 那么什么是 呢?我们打开 随便找一个 ,哪怕是空的 ,你都会发现这样一个显示图标: B Inspecto CameraTarget static w Tag Untagged Layer Default 看到没?有个 我们试着单击一下这个下拉框: Transform y rivet TtwhiparwhL Igor+ Eaea Estreat 414 不好意思,我截图的技术真的很烂,但是我们还是可以隐隐约约看到有好几个选项可供选择 如: 尊,那么这到底有什么用呢 原来, 再设计 时,对 的做了一种分层的处理。举个例子吧: 我们选中任意一个摄像机:可以在 面板中找到这样一项: Background Culling mask verything Projection Perspective ,又出现了一个,这和 又有什么联系呢?算了,我直接说吧:默 认情况下摄像机可以渲染任何层级中的 ,但当我们在 中有层没选 那么摄像机在渲染时,就不会渲染这一层的物休, 视图也就不会出现处在这一层的

资源截图

代码片段和文件信息

评论

共有 条评论