赞
踩
Physics.Raycast 官方文档中提供的参数如下
Physics.Raycast 从指定的位置发射一条射线,如果射线与物体发生碰撞返回true否则返回false
其中射线的起点,方向是不可以省略的,其他参数可以省略
案例▼
- RaycastHit hit;
- void Update()
- {
- //如果检测到物体
- if (Physics.Raycast(transform.position, transform.forward, out hit))
- {
- Debug.Log(hit.collider);//命中的 Collider。
- //打印一条从物体到碰撞点的红色射线,hit.point世界空间中射线命中碰撞体的撞击点
- Debug.DrawLine(transform.position, hit.point, Color.red);
- }
- else //没有检测到物体
- {
- //打印一条从物体出发的黄色射线
- Debug.DrawRay(transform.position, transform.position + transform.forward * 100, Color.yellow);
- }
- }
运行效果如下 可以看到射线与其他物体碰撞变成红色 ▼
也可以直接定义一条射线ray替换1,2条参数。下面的代码与上面的代码功能相同
- Ray ray;
- RaycastHit hit;
- void Update()
- {
- ray = new Ray(transform.position, transform.forward);
- //如果检测到物体
- if (Physics.Raycast(ray, out hit))
- {
- Debug.Log(hit.collider);//输出命中的 Collider。
- //打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
- Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
- }
- else //没有检测到物体
- {
- Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
- }
- }
Physics.Raycast(ray, out hit,3)(可以看到射线碰撞到第一个方块之后变为红色,碰撞到第二个方块后没有改变,这是因为第二个方块超出了射线检测范围)▼
(Physics.Raycast(ray, out hit, 10, mask)
这里我们给正方体Layer设置为Default,球形Layer设置为Sphere。之后选定Mask为Sphere
- Ray ray;
- RaycastHit hit;
- public LayerMask mask;
- void Update()
- {
- ray = new Ray(transform.position, transform.forward);
- //如果检测到物体
- if (Physics.Raycast(ray, out hit, 10, mask))
- {
- Debug.Log(hit.collider);//输出命中的 Collider。
- //打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
- Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
- }
- else //没有检测到物体
- {Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
- }
- }
运行效果如下,射线在接触到正方体是没有发生改变,接触到球形时变为红色▼
▼操作如下▼
为红色方块选择Is Triggr属性。蓝色方块不选。
- Ray ray;
- RaycastHit hit;
- public LayerMask mask;
- void Update()
- {
- ray = new Ray(transform.position, transform.forward);
- //如果检测到物体
- //QueryTriggerInteraction.Collide 检测触发器
- //QueryTriggerInteraction.Ignore 不检测触发器
- if (Physics.Raycast(ray, out hit, 10, mask, QueryTriggerInteraction.Ignore))
- {
- Debug.Log(hit.collider);//输出命中的 Collider。
- //打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
- Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
- }
- else //没有检测到物体
- {
- Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
- }
- }
运行效果如下▼ (射线碰撞到红色方块时没有发生改变,碰撞到蓝色方块变为红色)
- using UnityEngine;
- using UnityEngine.AI;
-
- public class MoveToClickPoint : MonoBehaviour {
- NavMeshAgent agent;
-
- void Start() {
- agent = GetComponent<NavMeshAgent>();
- }
-
- void Update() {
- if (Input.GetMouseButtonDown(0)) {
- RaycastHit hit;
-
- if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) {
- agent.destination = hit.point;
- }
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。