• Physics 物理
    • 示例:
      • Physics.Raycast 射线投射
      • Physics.CapsuleCast 胶囊投射

    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. }