赞
踩
碰撞是游戏开发无法回避的一个话题,当我们的利刃划过敌人的躯体,子弹击中目标的头部,这些都是游戏物体和游戏物体之间的碰撞。那么我们怎么为我们想要的碰撞附加我们想要执行的事件函数呢?下面就为大家揭晓。
碰撞器(Collider)是组件,加了碰撞器的游戏物体才可能实现碰撞效果。在Unity内部提供了许多碰撞器,通过Add Component -> Physics可以添加3D碰撞器组件1。Unity提供的组件有:BoxCollider(盒碰撞器), SphereCollider(球碰撞器), CapsuleCollider(胶囊碰撞器), MeshCollider(网格碰撞器), WheelCollider(轮子碰撞器,用来创建交通工具), TerrainCollider(地形碰撞器), CharacterController(角色控制器)。
其中前三种为基元碰撞器,MeshCollider为常用碰撞器(后几种碰撞器有着特殊作用)。其中BoxCollider结构最简单,消耗最小,而MeshCollider最为复杂,消耗很高,且需要提供网格模型。
当两个碰撞体(Collider)发生了碰撞(Collision),且其中至少一个附加了刚体(Rigibody),会向它们附加的对象发射三条碰撞信息,可以在脚本里处理这些信息。
//其中collision为本次碰撞信息集合,从中可以读取与之发生碰撞的碰撞体,碰撞的冲击力等信息
private void OnCollisionEnter(Collision collision) { } //当两个碰撞体刚互相接触时
private void OnCollisionStay(Collision collision) { } //当两个碰撞体持续保持接触状态时
private void OnCollisionExit(Collision collision) { } //当两个碰撞体停止互相接触时
这里要详细介绍一下网格碰撞体(MeshCollider),其采用网格资源并基于该网格构建其碰撞体:
碰撞网格使用背面剔除,如果对象与图形方式背面剔除的网格碰撞,则不会以物理方式与它碰撞(故两个网格碰撞体无法碰撞)。但若是该网格碰撞体标记为凸体(Convex),则可以和其它网格碰撞体发生碰撞,标记为凸体的网格碰撞体网格限制为255个三角形。
当我们需要检测游戏角色进入到某个房间里,这个时候你可能就会需要用到触发器了。触发器和碰撞器类似,碰撞器只需要将勾选上IsTrigger属性框就成了触发器。触发器发生碰撞时,同样会向它们附加的对象发射三条触发信息,不同的是其并不会发生物理碰撞效果。通过以下函数处理触发信息:
//其中collider为发生碰撞的碰撞体
private void OnTriggerEnter(Collider collider) { } //当碰撞体进入到触发器时
private void OnTriggerStay(Collider collider) { } //当碰撞体和触发器有重叠区域时
private void OnTriggerExit(Collider collider) { } //当碰撞体离开触发器时
刚体(Rigibody),为游戏对象赋予物理属性,使游戏对象实现现实世界中的运动效果的组件。刚体2是物理引擎中最基本的组件,通过刚体组件,可以为游戏物体添加一些常见的物理属性,如质量,摩擦力,碰撞参数等。
刚体的插值(Interpolate):物体运动插值模式,当发现刚体运动时抖动,可以尝试变换下面选项:
刚体的三种碰撞检测模式(CollisionDetection):
不是随随便便两个物体附加了碰撞体都可以发生碰撞,无论是发生碰撞还是触发都有一定的条件的。一般发生碰撞(触发),至少一方身上挂有刚体(Rigibody)。在了解发生条件之前,我们先要了解这几种碰撞体状态:
则几种碰撞体相互之间碰撞触发的条件为:
触发器的触发发生条件:
默认情况下,碰撞体会和所有满足条件的碰撞体发生碰撞。但有些时候,我们希望某个碰撞体只和特定的碰撞体发生碰撞,这可以通过在Edit->ProjectSettings->Physics中设置。各个版本的Unity该选项的内容可能不同,建议根据Unity用户手册->Working in Unity->Editor Features->Project Settings->Physics中详细了解各个属性的作用。
这里以Unity2017的Physics为例:
其中的各个属性为:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。