Unity - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(197评价)
价格: 4431.00元
从一个点(这个点是变化的)向上发射射线,实时的检测是否搭建了cube,要检测到最高点
小莽发起了问答2019-12-10
3
回复
306
浏览

要实现的功能就是 : 得到这个点上最高的cube的位置。然后可以放新的cube在上面。(也就是如果射线碰撞到了cube,则会继续向上发射射线直到上方没有cube为止),然后会返回当前最高cube的位置。

因为是实时检测,需要在update中调用,但是这样的话就会陷入死循环,一个点这一帧检测到最高时,返回了false值,下一帧又会重新检测。所以就退不出来循环了。

该如何实现一个点只向上检测一次的功能。(点是变换的,不是固定点。)

下面是实现代码:

 

private void Start()
{
    CheckCubePosition(Vector3.zero);
}

private Vector3 CheckCubePosition(Vector3 rayPosition)
{
    Vector3 targetPosition = rayPosition;
    bool hitcube = true;
    
    while (hitcube)
    {
        hitcube = RayUpwards(targetPosition, out targetPosition);
    }
    return targetPosition;
}
private bool RayUpwards(Vector3 rayPosition,out Vector3 hitPosition)
{
    bool hitCube = false;
    hitPosition = rayPosition;
    RaycastHit hit;
    Ray ray=new Ray(rayPosition,Vector3.up);
    if (Physics.Raycast(ray, out hit))
    {
        if (hit.collider.CompareTag("Cube"))
        {
            hitCube = true;
            hitPosition = hit.point;
            Debug.Log(hitPosition);
        }
    }
    return hitCube;
}

 

这里只是在Start中实现的,检测的初始点是坐标原点。各个cube的位置是(0,1,0)(0,3,0)(0,5,0)所以只调用了一次,在update中会一直调用,因为没有限制条件,会重复调用无限次。

代码应该没有问题的,就是想问问逻辑问题:

我该如何让它在update中调用且随机到任何点只去检测一次最高点的位置呢 ?(必须要实时检测任意点的最高点位置哈)

重点就是 任何点的检测都只去调用一次CheckCubePosition,而不会反复调用

 

所有回复
  • 老师_Trigger 2019-12-10

    同学你好,可以参考一下获取多个物体:

    https://www.jianshu.com/p/8718842f8537

    • 小莽 2019-12-10

      老师看没看我代码 已经实现了获取了物体了但是放在update里面会重复检测,我只想任意点只检测一次

      (0) 回复
    • 老师_Trigger 2019-12-11

      回复 @ 小莽: 如果我们射线是一直发射的,那么就不会只检测一次,每次触碰到东西都会检测到,如果是想要触发到最高点停止,那么可以使用一个开关。如果是通过方法或者按下某个命令也是可以开启和停止检测的。或者是每次有新cube生成就去检测,跟之前最高点存储的cube位置检测来关闭。

      (0) 回复
    还有-3条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!