二维线渲染器反射问题 - Unity
2D line renderer reflection issue - Unity
我在一个特定的对象标签上制作了一个二维线渲染器反射,它在工作,但只在左侧工作,而在右侧没有显示反射,我不知道为什么,因为当我的脚本是在 3d 上它工作正常。
这是我从 3D 转换成 2D 的脚本。
public int reflections;
public float maxLength;
private LineRenderer lineRenderer;
public LayerMask layerMask;
private Ray2D ray;
private RaycastHit2D hit;
private void Awake()
{
lineRenderer = GetComponent<LineRenderer>();
}
private void Update()
{
ray = new Ray2D(transform.position, transform.up);
lineRenderer.positionCount = 1;
lineRenderer.SetPosition(0, transform.position);
float remainingLength = maxLength;
for (int i = 0; i < reflections; i++)
{
hit = Physics2D.Raycast(ray.origin, ray.direction, remainingLength, layerMask);
if (hit)
{
lineRenderer.positionCount += 1;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, hit.point);
remainingLength -= Vector2.Distance(ray.origin, hit.point);
ray = new Ray2D(hit.point, Vector2.Reflect(ray.direction, hit.normal));
if (hit.collider.tag != "Reflect")
break;
}
else
{
lineRenderer.positionCount += 1;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, ray.origin + ray.direction * remainingLength);
}
}
}
预览
向右走时
向左走时
有时也会闪烁,我不知道这是怎么回事,我以为是因为订单层我已经改变了这个但是没有任何反应。
关于闪烁,这是由于碰撞对象和线条本身的剪裁问题造成的。
条件内部:
if (hit)
调整代码如下:
// Get the reflected vector of the raycast.
Vector2 updatedDirection = Vector2.Reflect(ray.direction, hit.normal);
// Create new Ray object & set origin to be 0.01f away from hitpoint so the line is not colliding with the gameobject collider.
ray = new Ray2D(hit.point + updatedDirection * 0.01f, updatedDirection);
您可以从这些链接中了解更多信息:
https://answers.unity.com/questions/1602542/line-renderer-flickering-when-updated-in-runtime.html
至于线没有反映在右墙上的原因,这很可能是由于游戏对象标签没有设置为“反映”。当与带有该标签的对象发生碰撞时,您只会创建一条新的反射线。仔细检查右墙游戏对象是否在检查器中设置了标签“Reflect”。
我在一个特定的对象标签上制作了一个二维线渲染器反射,它在工作,但只在左侧工作,而在右侧没有显示反射,我不知道为什么,因为当我的脚本是在 3d 上它工作正常。
这是我从 3D 转换成 2D 的脚本。
public int reflections;
public float maxLength;
private LineRenderer lineRenderer;
public LayerMask layerMask;
private Ray2D ray;
private RaycastHit2D hit;
private void Awake()
{
lineRenderer = GetComponent<LineRenderer>();
}
private void Update()
{
ray = new Ray2D(transform.position, transform.up);
lineRenderer.positionCount = 1;
lineRenderer.SetPosition(0, transform.position);
float remainingLength = maxLength;
for (int i = 0; i < reflections; i++)
{
hit = Physics2D.Raycast(ray.origin, ray.direction, remainingLength, layerMask);
if (hit)
{
lineRenderer.positionCount += 1;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, hit.point);
remainingLength -= Vector2.Distance(ray.origin, hit.point);
ray = new Ray2D(hit.point, Vector2.Reflect(ray.direction, hit.normal));
if (hit.collider.tag != "Reflect")
break;
}
else
{
lineRenderer.positionCount += 1;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, ray.origin + ray.direction * remainingLength);
}
}
}
预览
向右走时
向左走时
有时也会闪烁,我不知道这是怎么回事,我以为是因为订单层我已经改变了这个但是没有任何反应。
关于闪烁,这是由于碰撞对象和线条本身的剪裁问题造成的。
条件内部:
if (hit)
调整代码如下:
// Get the reflected vector of the raycast.
Vector2 updatedDirection = Vector2.Reflect(ray.direction, hit.normal);
// Create new Ray object & set origin to be 0.01f away from hitpoint so the line is not colliding with the gameobject collider.
ray = new Ray2D(hit.point + updatedDirection * 0.01f, updatedDirection);
您可以从这些链接中了解更多信息:
https://answers.unity.com/questions/1602542/line-renderer-flickering-when-updated-in-runtime.html
至于线没有反映在右墙上的原因,这很可能是由于游戏对象标签没有设置为“反映”。当与带有该标签的对象发生碰撞时,您只会创建一条新的反射线。仔细检查右墙游戏对象是否在检查器中设置了标签“Reflect”。