嘿,谢谢大家的帮助,
我想做的很简单,我试图在我的弹起/反射光线投射之后显示一个Line Renderer。
这是我到目前为止所拥有的。
private LineRenderer lr;
public int maxReflectionCount = 3;
public float maxStepDistance = 200f;
void Start()
{
lr = GetComponent<LineRenderer>();
}
void Update()
{
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
if (hit.collider)
{
lr.SetPosition(1, new Vector3(0, 0, hit.distance));
Reflect(this.transform.position + this.transform.forward * 0.75f, this.transform.forward, maxReflectionCount);
}
}
else
{
lr.SetPosition(1, new Vector3(0, 0, 2000));
}
}
private void Reflect(Vector3 position, Vector3 direction, int reflectionsRemaining)
{
if (reflectionsRemaining == 0)
{
return;
}
Vector3 startingPosition = position;
Ray ray = new Ray(position, direction);
RaycastHit hit2;
if (Physics.Raycast(ray, out hit2, maxStepDistance))
{
direction = Vector3.Reflect(direction, hit2.normal);
position = hit2.point;
}
else
{
position += direction * maxStepDistance;
}
Debug.DrawRay(startingPosition, position, Color.green);
Reflect(position, direction, reflectionsRemaining - 1);
}
好像是Vector3.Reflect是关键,但我不太清楚如何正确使用它。
我已经了解到如何与Gizmos一起工作
但是我不能在实际中使用Gizmos,并且我无法使其与LineRenderer一起使用。我什至尝试使用Debug.DrawRay,但无济于事。
我真的只是想用它来显示事物反弹的角度。关于如何使它起作用的任何想法?
感谢您的帮助!
编辑1: 所以我删除了所有的Line Renderer东西,因为以后我会担心,并且我一直在研究Hacky的建议。我仍然无法正常工作,但这是当前的样子。
//private LineRenderer lr;
public int maxReflectionCount = 3;
public float maxStepDistance = 200f;
Vector3 reflDirection;
Vector3 hitPosition;
void Start()
{
//lr = GetComponent<LineRenderer>();
}
void Update()
{
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
if (hit.collider)
{
//lr.SetPosition(1, new Vector3(0, 0, hit.distance));
Reflect(this.transform.position + this.transform.forward * 0.75f, this.transform.forward, maxReflectionCount);
}
}
else
{
//lr.SetPosition(1, new Vector3(0, 0, 2000));
}
}
private void Reflect(Vector3 position, Vector3 direction, int reflectionsRemaining)
{
if (reflectionsRemaining == 0)
{
return;
}
Vector3 startingPosition = position;
Ray ray = new Ray(position, direction);
RaycastHit hit2;
if (Physics.Raycast(ray, out hit2, maxStepDistance))
{
reflDirection = Vector3.Reflect(direction, hit2.normal);
hitPosition = hit2.point;
}
else
{
position += reflDirection * maxStepDistance;
}
Debug.DrawRay(startingPosition, reflDirection, Color.green, 1);
//Debug.DrawLine(startingPosition, position, Color.blue);
Reflect(position, direction, reflectionsRemaining - 1);
}
编辑2(大进步!): 好的,这样我就可以进行“射线投射反射”了。...而且光彩夺目。
这是它的样子:
public int maxReflectionCount = 5;
public float maxStepDistance = 200f;
void Start()
{
}
void Update()
{
Laser();
}
void Laser()
{
DrawReflectionPattern(this.transform.position + this.transform.forward * 0.75f, this.transform.forward, maxReflectionCount);
}
private void DrawReflectionPattern(Vector3 position, Vector3 direction, int reflectionsRemaining)
{
if (reflectionsRemaining == 0)
{
return;
}
Vector3 startingPosition = position;
Ray ray = new Ray(position, direction);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, maxStepDistance))
{
direction = Vector3.Reflect(direction, hit.normal);
position = hit.point;
}
else
{
position += direction * maxStepDistance;
}
//Gizmos.color = Color.yellow;
//Gizmos.DrawLine(startingPosition, position);
Debug.DrawLine(startingPosition, position, Color.blue);
DrawReflectionPattern(position, direction, reflectionsRemaining - 1);
}
现在,我只需要弄清楚如何将Line Renderer连接到它,就可以开展业务了!
答案 0 :(得分:0)
我读了2个问题:
我将在这里尝试回答以下问题: 您使用Vector3.Reflect的方式是正确的。请参见统一文档中的示例:https://docs.unity3d.com/ScriptReference/RaycastHit-normal.html
首先使用Debug.DrawRay(start,dir,color,duration)或Debug.drawline可视化方程式的结果。使用1的持续时间,使其在场景中保持可见一秒钟,并且不会立即消失。 在Debug.DrawRay中有一个错误:Debug.DrawRay的第二个参数是位置的方向。您也不会保存射线的起始位置,因此应为:
Ray ray = new Ray(position, direction);
RaycastHit hit2;
if (Physics.Raycast(ray, out hit2, maxStepDistance))
{
reflDirection = Vector3.Reflect(direction, hit2.normal);
hitPosition = hit2.point;
}
else
{
position += reflDirection * maxStepDistance;
}
Debug.DrawRay(hitPosition, reflDirection, Color.green);
在可行的情况下,使用线性渲染器将其显示在游戏视图中。它只期望位置,所以没有方向。注意不要将方向与位置混合在一起。 (向位置添加路线以获取目的地)