Unity-Physics.Raycast
2014-11-21 12:42
211 查看
关于API看一下链接
http://game.ceeger.com/Script/Physics/Physics.Raycast.html
• static function Raycast (origin : Vector3, direction : Vector3, out
hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask :
int = kDefaultRaycastLayers) : bool
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层内的碰撞器,其它层内碰撞器忽略。
今天, 我讨论两个问题
1.注意:如果从一个球型体的内部到外部用光线投射,返回为假
2.layerMask层的选择和屏蔽
首先 看第一个 如果一个点在碰撞体内部,向外部射,
先写一个脚本
建一个cube1,绑定脚本,设置startPos在cube内endPos在cube外,运行结果表明 false
再建一个cube2,startPos依然在cube1内,但endPos在cube2内,运行结果表明 yes cube2
也就是说 射线由内部向外部射 是不识别自己的碰撞体,但是识别其他的碰撞体。
第二个问题关于射线层的选择和屏蔽
修改一下脚本
自行比对
只与cube1层碰撞
与cube2 cube3层碰撞
与除cube2 cube3层碰撞
http://game.ceeger.com/Script/Physics/Physics.Raycast.html
• static function Raycast (origin : Vector3, direction : Vector3, out
hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask :
int = kDefaultRaycastLayers) : bool
Parameters参数
originThe 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层内的碰撞器,其它层内碰撞器忽略。
今天, 我讨论两个问题
1.注意:如果从一个球型体的内部到外部用光线投射,返回为假
2.layerMask层的选择和屏蔽
首先 看第一个 如果一个点在碰撞体内部,向外部射,
先写一个脚本
using UnityEngine; using System.Collections; public class Demo2 : MonoBehaviour { public float XStartPos = 0f; public float YStartPos = 0f; public float ZStartPos = 0f; public float XEndPos = 0f; public float YEndPos = 0f; public float ZEndPos = 0f; private Vector3 startPos; private Vector3 endPos; private Vector3 direction; private float distance; // Use this for initialization void Start () { startPos = new Vector3 (XStartPos, YStartPos, ZStartPos); endPos = new Vector3 (XEndPos, YEndPos, ZEndPos); direction = (endPos - startPos).normalized; distance = Vector3.Distance (startPos, endPos); } // Update is called once per frame void Update () { Debug.DrawLine (startPos, endPos, Color.red); RaycastHit hit; if (!Physics.Raycast (startPos, direction, out hit, distance)) { Debug.Log ("false"); } else { Debug.Log ("yes " + hit.collider.name); } } }
建一个cube1,绑定脚本,设置startPos在cube内endPos在cube外,运行结果表明 false
再建一个cube2,startPos依然在cube1内,但endPos在cube2内,运行结果表明 yes cube2
也就是说 射线由内部向外部射 是不识别自己的碰撞体,但是识别其他的碰撞体。
第二个问题关于射线层的选择和屏蔽
修改一下脚本
using UnityEngine; using System.Collections; public class Demo3 : MonoBehaviour { public float XStartPos = 0f; public float YStartPos = 0f; public float ZStartPos = 0f; public float XEndPos = 0f; public float YEndPos = 0f; public float ZEndPos = 0f; private Vector3 startPos; private Vector3 endPos; private Vector3 direction; private float distance; // Use this for initialization void Start () { startPos = new Vector3 (XStartPos, YStartPos, ZStartPos); endPos = new Vector3 (XEndPos, YEndPos, ZEndPos); direction = (endPos - startPos).normalized; distance = Vector3.Distance (startPos, endPos); } // Update is called once per frame void Update () { Debug.DrawLine (startPos, endPos, Color.red); RaycastHit hit; LayerMask l = 1 << LayerMask.NameToLayer("cube1"); if (Physics.Raycast (startPos, direction, out hit, distance, l)) { Debug.Log ("yes " + hit.collider.name); } else { Debug.Log ("false"); } } }
自行比对
只与cube1层碰撞
Physics.Raycast (startPos, direction, out hit, distance, l)与除cube1层以外的层碰撞
Physics.Raycast (startPos, direction, out hit, distance, ~l)
与cube2 cube3层碰撞
Physics.Raycast (startPos, direction, out hit, distance, 1 << LayerMask.NameToLayer("cube2") | 1 << LayerMask.NameToLayer("cube3"))
与除cube2 cube3层碰撞
Physics.Raycast (startPos, direction, out hit, distance,~(1 << LayerMask.NameToLayer("cube2") | 1 << LayerMask.NameToLayer("cube3")))
相关文章推荐
- Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法
- Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法
- Unity--光线投射碰撞Physics.Raycast和Physics.RaycastAll
- Unity Physics.Raycast 深入理解
- Unity Physics.Raycast 之 layerMask
- Unity Physics.Raycast的参数layermask不起作用
- unity中htc vive物理射线检测碰撞的方法—Phsics.Raycast()
- Unity中射线Ray和RaycastHit的简单介绍
- Unity Raycast 光线投射
- Physics.Raycast和Ray(射线)的理解
- 关于如何在 Unity 的 UI 菜单中默认创建出的控件 Raycast Target 属性默认为 false
- unity之Ray、RaycastHit 、Raycast
- unity3d问题集 <3> 对Physics.Raycast和Ray(射线)的理解
- Unity3D的射线检测Physics.Raycast
- Unity 鼠标拾取检测 (Mouse Raycast ) UGUi面板随鼠标指针显隐
- Unity3D Physics.Raycast 射线检测
- 使用Unity3d的Physics.Raycast()的用法做子弹射击
- Unity 人物如何跟随鼠标转向 ScreenPointToRay RaycastHit Raycast transform.LookAt
- unity中htc vive射线与UI碰撞检测-graphcs.Raycast()
- 对Physics.Raycast和Ray(射线)的理解 和 分层layer的使用