gpt4 book ai didi

c# - Unity3D:弹跳/反射光线转换

转载 作者:行者123 更新时间:2023-11-30 18:13:47 25 4
gpt4 key购买 nike

大家好,谢谢大家的帮助,

我想做的事情相当简单,我想显示一个跟随我的弹跳/反射 Raycast 的线渲染器。

这是我目前所拥有的。

 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 一起工作了

Line Bounce w 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(大进步!):好的,我让 Raycasting Reflection 工作了......而且非常棒。

这是它的样子:

 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);


}

现在我只需要弄清楚如何将线渲染器连接到它,我们就开始做生意了!

最佳答案

我读了 2 个问题:

  1. 我不知道如何使用 vector3.reflect(“看起来 Vector3.Reflect 是关键,但我不太清楚如何正确使用它。”)
  2. 我不知道如何使用 linerenderer(“我无法让它与 LineRenderer 一起工作”)

我将尝试在这里回答这些问题:您使用 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);

当它起作用时,使用 linerenderer 在游戏 View 中显示它。它只需要位置,所以没有方向。注意不要将方向与位置混淆。 (给一个位置加上一个方向就可以到达目的地)

关于c# - Unity3D:弹跳/反射光线转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51931455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com