光线投射到 Unity 中的特定层
Raycast to specific layers in Unity
我正在使用 GVRTeleport 脚本来允许使用纸板应用进行传送。我希望传送的光线投射忽略除一层以外的所有层。通过 this 页面,我相应地修改了脚本(抱歉,找不到原始 link 给此代码的所有者),但现在传送脚本什么也看不到。有任何想法吗?我的地板层是第 8 层,这是我希望此光线投射与之交互的层。
using UnityEngine;
public class GVRTeleport : MonoBehaviour {
public float viewHeight = 7f;
Vector3 fwd;
public float maxDistance = 10f;
public LineRenderer line;
public GameObject parent;
public GameObject targetIndicator;
public StraightLineParam genLine;
int layerMask = 1 << 8;
void Start() {
}
void Update() {
RaycastHit hit;
Ray ray;
if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask)) {
Debug.Log ("The ray hit the floor");
if (debugWithMouse) {
Vector2 mousePos = new Vector2 (Input.mousePosition.x / Screen.width, Input.mousePosition.y / Screen.height);
ray = Camera.main.ViewportPointToRay (mousePos);
} else {
ray = new Ray (transform.position, transform.forward);
}
if (Physics.Raycast (ray, out hit)) {
Debug.DrawLine (transform.position, hit.point, Color.red);
}
if (Input.GetMouseButton (0)) {
if (Physics.Raycast (ray, out hit)) {
if (useViewHeight) {
targetIndicator.transform.position = new Vector3 (hit.point.x, hit.point.y + viewHeight, hit.point.z);
} else {
targetIndicator.transform.position = new Vector3 (hit.point.x, hit.point.y, hit.point.z);
}
targetIndicator.transform.LookAt (hit.point);
targetIndicator.GetComponent<Light> ().intensity = 8;
genLine.genLine (new Vector3 (ray.origin.x + 2, ray.origin.y - .5f, ray.origin.z), hit.point);
line.material.SetTextureOffset ("_MainTex", new Vector2 (Time.timeSinceLevelLoad * -4f, 0f));
line.material.SetTextureScale ("_MainTex", new Vector2 (hit.point.magnitude, 1f));
}
}
if (Input.GetMouseButtonUp (0)) {
if (Physics.Raycast (ray, out hit)) {
if (!debugNoJump) {
if (useViewHeight) { //better way?
parent.transform.position = new Vector3 (hit.point.x, hit.point.y + viewHeight, hit.point.z);
} else {
parent.transform.position = new Vector3 (hit.point.x, hit.point.y, hit.point.z);
}
}
if (!debugLine) {
line.SetVertexCount (0);
}
}
targetIndicator.GetComponent<Light> ().intensity = 0;
}
Debug.DrawRay (this.transform.position, ray.direction * 5, Color.blue);// .DrawLine(transform.position, hit.point, Color.red);
}
}
}
让我们开始吧,您不应该在 update()
的每一帧都投射光线。不知道引擎会如何反应。您应该首先设置投射光线的条件,例如,当您按下某个键或类似按钮时。
然后,试试这个,而不是掩码的 1 << 8
:
int layer_mask = LayerMask.GetMask("Floor");
//Actually you can add any layer name you want, for example:
//int layer_mask = LayerMask.GetMask("Ground","Enemy","Boxes");
//do the raycast specifying the mask
if (Physics.Raycast (ray, out hit, distance, layer_mask))
{
}
以防万一你不小心改变了层的顺序或者你以后修改它,直接传递名称,在我看来,这样更安全。
如果这不是问题,请检查您使用其变换投射光线的 GameObject 的前向。也许您只是将光线投射到什么都没有的方向,或者至少不是地面。
我正在使用 GVRTeleport 脚本来允许使用纸板应用进行传送。我希望传送的光线投射忽略除一层以外的所有层。通过 this 页面,我相应地修改了脚本(抱歉,找不到原始 link 给此代码的所有者),但现在传送脚本什么也看不到。有任何想法吗?我的地板层是第 8 层,这是我希望此光线投射与之交互的层。
using UnityEngine;
public class GVRTeleport : MonoBehaviour {
public float viewHeight = 7f;
Vector3 fwd;
public float maxDistance = 10f;
public LineRenderer line;
public GameObject parent;
public GameObject targetIndicator;
public StraightLineParam genLine;
int layerMask = 1 << 8;
void Start() {
}
void Update() {
RaycastHit hit;
Ray ray;
if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask)) {
Debug.Log ("The ray hit the floor");
if (debugWithMouse) {
Vector2 mousePos = new Vector2 (Input.mousePosition.x / Screen.width, Input.mousePosition.y / Screen.height);
ray = Camera.main.ViewportPointToRay (mousePos);
} else {
ray = new Ray (transform.position, transform.forward);
}
if (Physics.Raycast (ray, out hit)) {
Debug.DrawLine (transform.position, hit.point, Color.red);
}
if (Input.GetMouseButton (0)) {
if (Physics.Raycast (ray, out hit)) {
if (useViewHeight) {
targetIndicator.transform.position = new Vector3 (hit.point.x, hit.point.y + viewHeight, hit.point.z);
} else {
targetIndicator.transform.position = new Vector3 (hit.point.x, hit.point.y, hit.point.z);
}
targetIndicator.transform.LookAt (hit.point);
targetIndicator.GetComponent<Light> ().intensity = 8;
genLine.genLine (new Vector3 (ray.origin.x + 2, ray.origin.y - .5f, ray.origin.z), hit.point);
line.material.SetTextureOffset ("_MainTex", new Vector2 (Time.timeSinceLevelLoad * -4f, 0f));
line.material.SetTextureScale ("_MainTex", new Vector2 (hit.point.magnitude, 1f));
}
}
if (Input.GetMouseButtonUp (0)) {
if (Physics.Raycast (ray, out hit)) {
if (!debugNoJump) {
if (useViewHeight) { //better way?
parent.transform.position = new Vector3 (hit.point.x, hit.point.y + viewHeight, hit.point.z);
} else {
parent.transform.position = new Vector3 (hit.point.x, hit.point.y, hit.point.z);
}
}
if (!debugLine) {
line.SetVertexCount (0);
}
}
targetIndicator.GetComponent<Light> ().intensity = 0;
}
Debug.DrawRay (this.transform.position, ray.direction * 5, Color.blue);// .DrawLine(transform.position, hit.point, Color.red);
}
}
}
让我们开始吧,您不应该在 update()
的每一帧都投射光线。不知道引擎会如何反应。您应该首先设置投射光线的条件,例如,当您按下某个键或类似按钮时。
然后,试试这个,而不是掩码的 1 << 8
:
int layer_mask = LayerMask.GetMask("Floor");
//Actually you can add any layer name you want, for example:
//int layer_mask = LayerMask.GetMask("Ground","Enemy","Boxes");
//do the raycast specifying the mask
if (Physics.Raycast (ray, out hit, distance, layer_mask))
{
}
以防万一你不小心改变了层的顺序或者你以后修改它,直接传递名称,在我看来,这样更安全。
如果这不是问题,请检查您使用其变换投射光线的 GameObject 的前向。也许您只是将光线投射到什么都没有的方向,或者至少不是地面。