Unity3D:弹跳/反射Raycast

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D:弹跳/反射Raycast相关的知识,希望对你有一定的参考价值。

大家谢谢你的帮助,

我想要做的是相当直接的,我试图显示一个Line Renderer跟随我的弹跳/反射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);


}

现在我只需要弄清楚如何将Line Renderer连接到它,我们正在开展业务!

答案

我读了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在游戏视图中显示它。它只期望位置,所以没有方向。小心不要将方向与位置混合。 (为获得目的地的位置添加方向)

以上是关于Unity3D:弹跳/反射Raycast的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中

如何创建自己的 Raycast 组件,它不需要碰撞器,但在 C# Unity3D 中支持 Skinned Mesh Renderer?

Unity3D 灵巧小知识点 ☀️ | 快速查找场景中勾选Raycast Target的游戏对象

Unity3D_(API)射线检测

unity获取raycast的XYZ

Unity3D中的射线与碰撞检测代码