Unity:编辑器模式下的 Raycast 不起作用
Unity: Raycast in Editor Mode does not work
我正在尝试在我的游戏中渲染球的运动轨迹,全部在编辑器模式下。
我相信这将有助于我的团队创建关卡,因为它在制作原型时需要更少的测试。
这是我的代码:
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("bounce");出现在控制台中。
换句话说,光线投射从未检测到任何东西。
我为此阅读了数十篇文章,其中许多指出在编辑器模式下无法进行碰撞检测。
这是真的吗?或者我有我没有检测到的错误。
如果您需要更多信息,请告诉我,但我相信就是这些了。
提前致谢,
图层蒙版与图层索引不同。 Layer mask 是一个由 0 和 1 组成的二进制数,其中每个 1
代表一个包含的图层索引。换句话说,图层蒙版中的 i
th 1
告诉统一包含图层索引 #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:右侧
例如当我写 1 << 3
时,它意味着取 1
并将其向左移动 3
位。这给出 00001 << 3
= 01000
图层蒙版按位工作,您必须通过简单地设置 (1) 或重置 (0) 图层蒙版中相应的二进制数字来指定应屏蔽哪些图层以及应忽略哪些图层。
如果我将图层蒙版设置为 7,unity 会将其转换为二进制 (00000111) 并屏蔽前三层并忽略所有其他层。
如果我将图层蒙版设置为 8,unity 会将其转换为二进制 (00001000) 并屏蔽第 4 层并忽略所有其他图层。
我正在尝试在我的游戏中渲染球的运动轨迹,全部在编辑器模式下。
我相信这将有助于我的团队创建关卡,因为它在制作原型时需要更少的测试。
这是我的代码:
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("bounce");出现在控制台中。
换句话说,光线投射从未检测到任何东西。
我为此阅读了数十篇文章,其中许多指出在编辑器模式下无法进行碰撞检测。
这是真的吗?或者我有我没有检测到的错误。
如果您需要更多信息,请告诉我,但我相信就是这些了。
提前致谢,
图层蒙版与图层索引不同。 Layer mask 是一个由 0 和 1 组成的二进制数,其中每个 1
代表一个包含的图层索引。换句话说,图层蒙版中的 i
th 1
告诉统一包含图层索引 #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:右侧
例如当我写 1 << 3
时,它意味着取 1
并将其向左移动 3
位。这给出 00001 << 3
= 01000
图层蒙版按位工作,您必须通过简单地设置 (1) 或重置 (0) 图层蒙版中相应的二进制数字来指定应屏蔽哪些图层以及应忽略哪些图层。
如果我将图层蒙版设置为 7,unity 会将其转换为二进制 (00000111) 并屏蔽前三层并忽略所有其他层。
如果我将图层蒙版设置为 8,unity 会将其转换为二进制 (00001000) 并屏蔽第 4 层并忽略所有其他图层。