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

    方法一:Physics.Raycast 光线投射

    1.static function Raycast (origin : Vector3direction : Vector3distance : float = Mathf.InfinitylayerMask : int = kDefaultRaycastLayers) : bool
    一个静态的发射射线的方法,在场景中投下可与全部碰撞器碰撞的一条光线。
    參数解释:
    origin:射线起始点
    direction:射线方向
       distance:射线长度
       layerMask:仅仅选定Layermask层内的碰撞器,其他层内碰撞器忽略。
    返回布尔类型,当光线投射与不论什么碰撞器交叉时为真。否则为假。
    (注意:假设从一个球型体的内部到外部用光线投射,返回为假。

    )这一点測试不成功!

    2.static function Raycast (origin : Vector3direction : Vector3out hitInfo : RaycastHitdistance : float = Mathf.InfinitylayerMask : 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#中outkeyword传入一个空的碰撞信息类,然后碰撞后赋值。能够得到碰撞物体的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 : Raydistance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]
    static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]

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

  • 相关阅读:
    linux-2.6.32在mini2440开发板上移植(1)之移植Nand驱动并修改分区信息
    编程错误
    汇编语言程序设计读书笔记(4)- 程序设计基础之一
    汇编语言程序设计读书笔记(3)- 程序范例
    汇编语言程序设计读书笔记(2)- 相关工具64位系统篇
    将博客搬至CSDN
    汇编语言程序设计读书笔记(1)- 相关工具
    CentOS v6.4 64位系统编译linux3.0.8内核错误的解决
    用J-LINK烧写Bootloader到ARM开发板的Nand Flash
    Keil MDK使用J-LINK分别在Sram,Nor Flash以及Sdram中调试代码的原理和方法
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6843776.html
Copyright © 2011-2022 走看看