Unity:编辑模式下的Raycast不起作用

时间:2016-12-29 12:38:41

标签: c# unity3d collision-detection raycasting collider

我正在尝试在编辑模式中渲染球在我的游戏中移动的轨迹路径。

我相信这将有助于我的团队创建关卡,因为在原型设计时需要更少的测试。

这是我的代码:

using UnityEngine;
using UnityEditor;
using System.Collections;

namespace smthng {
    [ExecuteInEditMode]
    public class TrajectoryGenerator : MonoBehaviour
    {

        public int distance; //max distance for beam to travel.
        public LineRenderer lineRenderer; //the linerenderer that acts as trajectory path
        int limit = 100; // max reflections
        Vector2 curRot, curPos;


        void OnEnable()
        {

            StartCoroutine(drawLine());
        }

        IEnumerator drawLine()
        {
            int vertex = 1; //How many line segments are there
            bool isActive = true; //Is the reflecting loop active?

            Transform _transform = gameObject.transform;

            curPos = _transform.position; //starting position of the Ray
            curRot = _transform.right; //starting direction of the Ray


            lineRenderer.SetVertexCount(1);
            lineRenderer.SetPosition(0, curPos);

            while (isActive)
            {
                vertex++;
                //add ne vertex so the line can go in other direction
                lineRenderer.SetVertexCount(vertex); 

                //raycast to check for colliders
                RaycastHit2D hit = Physics2D.Raycast(curPos, curRot, Mathf.Infinity, LayerMask.NameToLayer(Constants.LayerHited));
                Debug.DrawRay(curPos, curRot, Color.black, 20);
                if (hit.collider != null)
                {
                    Debug.Log("bounce");
                    //position the last vertex where the hit occured
                    lineRenderer.SetPosition(vertex - 1, hit.point);
                    //update current position and direction;
                    curPos = hit.point;
                    curRot = Vector2.Reflect(curRot, hit.normal);
                }
                else
                {
                    Debug.Log("no bounce");
                    isActive = false;
                    lineRenderer.SetPosition(vertex - 1, curPos + 100 * curRot);

                }
                if (vertex > limit)
                {
                    isActive = false;
                }
                yield return null;
            }
        }
    }
}

问题是,我从未见过Debug.Log("反弹");出现在控制台中。

换句话说,光线投射从未检测到任何内容。

我为此阅读了十几篇文章,许多人指出在编辑器模式下无法进行对撞机检测。

这是真的吗?或者我有一些我没有发现的错误。

如果您需要更多信息,请告诉我,但我相信就是这样。

提前致谢,

1 个答案:

答案 0 :(得分:3)

图层蒙版与图层索引不同。层掩码是由零和1组成的二进制数,其中每个1表示一个包含的层索引。换句话说,图层掩码中的i 1告诉unity包含图层索引#i

例如,如果图层蒙版应包含图层#0和图层#2,则它将等于...000000101 = 5

所以你必须改变行

RaycastHit2D hit = Physics2D.Raycast(curPos, curRot, Mathf.Infinity, LayerMask.NameToLayer(Constants.LayerHited));

RaycastHit2D hit = Physics2D.Raycast(curPos, curRot, Mathf.Infinity, 1 << LayerMask.NameToLayer(Constants.LayerHited));

其他数学信息

<<运算符将LHS的RHS位向左移动。

LHS:左手边

RHS:右手边

e.g。当我写1 << 3时,它意味着取1并将其3位向左移动。这提供了00001 << 3 = 01000

图层蒙版按位工作,您必须通过简单地设置(1)或重置(0)图层蒙版中相应的二进制数字来指定应该屏蔽哪些图层以及应忽略哪些图层。

如果我将图层蒙版设置为7,则unity将其转换为二进制(00000111)并屏蔽前三层并忽略所有其他图层。

如果我将图层蒙版设置为8,则unity将其转换为二进制(00001000)并屏蔽第4层并忽略所有其他图层。

您可以详细了解herehere