大家好,感谢您的帮助。
我想做的事情相当简单,我想显示一个线渲染器,跟随我的弹跳/反射光线投射。
以下是我目前的进展。
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);
}
现在我只需要想办法将线渲染器连接到它上面,我们就可以开始了!