zoukankan      html  css  js  c++  java
  • Unity3D总结:关于射线碰撞

    方法一:Physics.Raycast 光线投射

    1.static function Raycast (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

    一个静态的发射射线的方法,在场景中投下可与所有碰撞器碰撞的一条光线。

    参数解释:

    origin:射线起始点

    direction:射线方向

       distance:射线长度

       layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。

    返回布尔类型,当光线投射与任何碰撞器交叉时为真,否则为假。

    (注意:如果从一个球型体的内部到外部用光线投射,返回为假。 )这一点测试不成功!

    2.static function Raycast (origin : Vector3, direction : Vector3, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

    在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息。

    Parameters参数
    • origin

      The starting point of the ray in world coordinates.
      在世界坐标,射线的起始点。

    • direction

      The direction of the ray.
      射线的方向。

    • distance

      The length of the ray
      射线的长度。

    • hitInfo

      If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
      如果返回true,hitInfo将包含碰到器碰撞的更多信息。

    • layerMask

      A Layer mask that is used to selectively ignore colliders when casting a ray. 
      只选定Layermask层内的碰撞器,其它层内碰撞器忽略。

    Returns

    当光线投射与任何碰撞器交叉时为真,否则为假。

    使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。

    详细解释一下:

    LayerMask 层蒙版


    如图所示,每一个物体都有一个Tag和Layer标签,tag就是一个简单的标签,可以用来区分不同的物体,LayerMask的作用是可以选择性地过滤物体,例如当投射射线时,比如camera.cullingmask和光线投射时候。


    如图,可以在TagManager中编辑tag和Layer

    然后设置物体的Layer层级,在摄像机中设置camera.cullingmask,可以控制摄像机的渲染层级,用在射线上,可以控制射线碰撞什么,不碰撞什么。

    //Raycast hit

    RaycastHit hit;

    LayerMask mask = 1 << 8;

    void testRay(){

    if(Physics.Raycast(transform.position,Vector3.right,out hit,100, mask.value)){

    Debug.DrawLine(transform.position,hit.point,Color.red,1);

    }

    }

    上面的例子是从当前脚本所绑定的物体做标点向右发射长度100的射线,射线碰撞层级为8,其他层级忽略。

    为了测试,我们在碰撞到物体后画一条红色线条,表示射线,停留一秒钟。

    上面这些是射线的一些基本操作。


    方法二:Physics.RaycastAll 光线投射

    static function RaycastAll (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]
    static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]

    投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

    本文转自:http://blog.csdn.net/dyc333236081818/article/details/8228618

  • 相关阅读:
    js元素remove
    sql里将重复行数据合并为一行,数据用逗号分隔
    treegrid 折叠全部节点
    T-sql 遍历结果集
    批量插入实体类转化DataTable
    easyui 自己写的一些小东西
    lua 笔记
    为eclipse添加tomcat插件(eclipse tomcat plugin)
    netstat指令
    转 vim常用命令总结
  • 原文地址:https://www.cnblogs.com/dacheng/p/2964361.html
Copyright © 2011-2022 走看看