Physics 物理

全局物理属性和辅助方法。

静态变量说明
AllLayers选择所有层的层蒙版常量。
bounceThreshold两个碰撞物体的相对速度如果在这个设定值之下,不会反弹。默认值2.。取值范围0到无穷大。必须为正数。
defaultContactOffset新创建碰撞器的默认接触偏移值。
DefaultRaycastLayers选择默认投射层的层蒙版常数。
gravity场景中应用到所有刚体的重力。
IgnoreRaycastLayer选择忽略层的层蒙版常量。
queriesHitTriggers指定查询(raycasts, spherecasts, overlap tests, etc.)是否碰到触发器。
sleepThreshold质量归一化的能量阈值,低于这个阈值的对象开始休眠。
solverIterationCount任意刚体默认允许使用的求解迭代次数(默认为7)。必须为正数。
静态方法说明
BoxCast沿射线投射立方体,并返回碰到的信息。
BoxCastAll就像Physics.BoxCast,但返回的是所有碰到的对象信息。
BoxCastNonAlloc沿方向投射立方体,并储存到提供的缓冲器(RaycastHit)。返回碰到的储存在results缓冲器中的数量。
CapsuleCast在场景中针对所有碰撞器投射一个胶囊,并返回碰到的细节信息。
CapsuleCastAll像Physics.CapsuleCast,但这个函数将返回所有胶囊扫描交叉碰到的对象。
CapsuleCastNonAlloc针对场景中所有的碰撞器投射一个胶囊,并返回缓冲器中碰到什么的信息。
CheckBox检测给定盒是否与其他碰撞器重叠。
CheckCapsule在世界坐标空间,检查胶囊体是否与任意碰撞器重叠。
CheckSphere在世界坐标空间,由位置和半径定义的球与任意碰撞器重叠,如果返回true。
GetIgnoreLayerCollisionlayer1和layer2的层的碰撞时否忽略?
IgnoreCollision使碰撞检测系统忽略所有collider1和collider2碰撞。
IgnoreLayerCollision使碰撞检测系统忽略layer1和layer2中的任意碰撞器的所有碰撞。
Linecast在线的开始和结束位置之间,如果与任何碰撞器相交返回真。
OverlapBox查找给定立方体内或与之接触的所有碰撞器。
OverlapBoxNonAlloc查找给定立方体内或与之接触的所有碰撞器,并储存在缓冲器中。
OverlapSphere返回球内或与之接触的所有碰撞器。
OverlapSphereNonAlloc计算并储存该球内或与之接触的所有碰撞器到提供的缓冲器中。
Raycast在场景中投下可与所有碰撞器碰撞的一条光线。注意:如果射线从碰撞体的内部或者背面打,Raycast不检测碰撞。
RaycastAll在场景投射一条射线并返回所有碰撞。注意不保证顺序。
RaycastNonAlloc在场景投射射线并储存碰到的对象到缓冲器中。
SphereCast沿着射线方向投射一个球形,并返回更多的碰到的信息。
SphereCastAll类似Physics.SphereCast,但是这个函数返回所有球形扫描到的碰撞信息。
SphereCastNonAlloc沿direction方向投射球体,并储存在results缓冲器中。

示例:

Physics.Raycast 射线投射

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. void Update() {
  5. Vector3 fwd = transform.TransformDirection(Vector3.forward);
  6. if (Physics.Raycast(transform.position, fwd, 10))
  7. print("There is something in front of the object!");
  8. }
  9. }

注意:如果射线从碰撞体的内部或者背面打,Raycast不检测碰撞。如果你用脚本或动画移动碰撞器,需要至少一个在FixedUpdate执行,因为物理库能更新它的数据结构,因此一条射线在它的新位置之前打到碰撞器。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. void Update() {
  5. RaycastHit hit;
  6. if (Physics.Raycast(transform.position, -Vector3.up, out hit))
  7. float distanceToGround = hit.distance;
  8. }
  9. }
  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. void Update() {
  5. RaycastHit hit;
  6. if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0F))
  7. float distanceToGround = hit.distance;
  8. }
  9. }
  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. void Update() {
  5. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  6. if (Physics.Raycast(ray, 100))
  7. print("Hit something");
  8. }
  9. }
  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. void Update() {
  5. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  6. RaycastHit hit;
  7. if (Physics.Raycast(ray, out hit, 100))
  8. Debug.DrawLine(ray.origin, hit.point);
  9. }
  10. }

Physics.CapsuleCast 胶囊投射

public static bool CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

参数说明
point1球体开始中心点。
point2球体结束的中心点。
radius胶囊的半径。
direction胶囊扫描的方向。
maxDistance扫描的最大长度。
hitInfohitInfo包含更多的碰到碰撞器的信息。
layerMask选择投射的层蒙版。
queryTriggerInteraction指定是否查询碰到触发器。

返回值:胶囊扫描到任意交叉碰撞器返回true,否则返回false。

胶囊是由radius半径与point1和point2位置的两个球形成胶囊的两端定义。返回胶囊沿direction方向碰到的第一个碰撞器。这通常用于投射不需足够的精度,因为你要找出一个特定大小的物体,如人物,能移动到某处而不在途中碰撞到任何东西。

注意,胶囊投射不检测胶囊重叠的碰撞器。如果从脚本或动画移动碰撞器,需要有至少一个在FixedUpdate中执行,使得物理库可以更新它的数据结构,在CapsuleCast碰到碰撞器之前是在它的新位置。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. void Update() {
  5. RaycastHit hit;
  6. CharacterController charContr = GetComponent<CharacterController>();
  7. Vector3 p1 = transform.position + charContr.center + Vector3.up * -charContr.height * 0.5F;
  8. Vector3 p2 = p1 + Vector3.up * charContr.height;
  9. float distanceToObstacle = 0;
  10. // Cast character controller shape 10 meters forward to see if it is about to hit anything.
  11. if (Physics.CapsuleCast(p1, p2, charContr.radius, transform.forward, out hit, 10))
  12. distanceToObstacle = hit.distance;
  13. }
  14. }